|
@@ -114,7 +114,7 @@ impl ShadowLine {
|
|
.get(index - 1)
|
|
.get(index - 1)
|
|
.filter(|sh| sh.end > other.start)
|
|
.filter(|sh| sh.end > other.start)
|
|
};
|
|
};
|
|
- let next = if index < self.shadows.len() {
|
|
|
|
|
|
+ let next = if index == self.shadows.len() {
|
|
None
|
|
None
|
|
} else {
|
|
} else {
|
|
self.shadows.get(index).filter(|sh| sh.start < other.end)
|
|
self.shadows.get(index).filter(|sh| sh.start < other.end)
|
|
@@ -230,9 +230,9 @@ mod test {
|
|
const V: bool = true;
|
|
const V: bool = true;
|
|
const U: bool = false;
|
|
const U: bool = false;
|
|
|
|
|
|
- fn assert_same_vis(exp: &Board<bool>, actual: &Board<bool>) {
|
|
|
|
|
|
+ fn assert_same_vis(p: Coord, exp: &Board<bool>, actual: &Board<bool>) {
|
|
if exp != actual {
|
|
if exp != actual {
|
|
- panic!("Expected:\n{}\n========\nActual:\n{}\n", to_vis(exp), to_vis(actual));
|
|
|
|
|
|
+ panic!("Expected:\n{}\n========\nActual:\n{}\n", to_vis(p, exp), to_vis(p, actual));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -289,14 +289,37 @@ mod test {
|
|
assert_eq!(line.shadows[1], super::Shadow::new(0.9, 1.0));
|
|
assert_eq!(line.shadows[1], super::Shadow::new(0.9, 1.0));
|
|
}
|
|
}
|
|
|
|
|
|
- fn to_vis(vis: &super::Board<bool>) -> String {
|
|
|
|
|
|
+ #[test]
|
|
|
|
+ fn add_shadow_line_several() {
|
|
|
|
+ let mut line = super::ShadowLine {
|
|
|
|
+ shadows: Vec::new(),
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ assert_eq!(line.shadows.len(), 0);
|
|
|
|
+
|
|
|
|
+ line.add(super::Shadow::new(0.5, 0.8));
|
|
|
|
+ assert_eq!(line.shadows.len(), 1);
|
|
|
|
+
|
|
|
|
+ line.add(super::Shadow::new(0.0, 0.667));
|
|
|
|
+ assert_eq!(line.shadows.len(), 1);
|
|
|
|
+
|
|
|
|
+ line.add(super::Shadow::new(0.6, 1.0));
|
|
|
|
+ assert_eq!(line.shadows.len(), 1);
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ fn to_vis(p: Coord, vis: &super::Board<bool>) -> String {
|
|
let mut buf = String::new();
|
|
let mut buf = String::new();
|
|
for y in 0..vis.height() {
|
|
for y in 0..vis.height() {
|
|
for x in 0..vis.width() {
|
|
for x in 0..vis.width() {
|
|
- buf.push(match vis[(x, y)] {
|
|
|
|
- true => '#',
|
|
|
|
- false => '.',
|
|
|
|
- })
|
|
|
|
|
|
+ if p.x == x && p.y == y {
|
|
|
|
+ buf.push('@')
|
|
|
|
+ } else {
|
|
|
|
+ buf.push(match vis[(x, y)] {
|
|
|
|
+ true => '#',
|
|
|
|
+ false => '.',
|
|
|
|
+ })
|
|
|
|
+ }
|
|
}
|
|
}
|
|
buf.push('\n')
|
|
buf.push('\n')
|
|
}
|
|
}
|
|
@@ -316,7 +339,8 @@ mod test {
|
|
]
|
|
]
|
|
];
|
|
];
|
|
let mut v = Viewshed::create(&b, |n| *n == 1);
|
|
let mut v = Viewshed::create(&b, |n| *n == 1);
|
|
- v.calculate_from(&b, Coord::new(2, 2));
|
|
|
|
|
|
+ let p = Coord::new(2, 2);
|
|
|
|
+ v.calculate_from(&b, p);
|
|
let exp: Board<bool> = board_from_vec![
|
|
let exp: Board<bool> = board_from_vec![
|
|
5,5;
|
|
5,5;
|
|
[
|
|
[
|
|
@@ -327,7 +351,7 @@ mod test {
|
|
U, U, U, U, U,
|
|
U, U, U, U, U,
|
|
]
|
|
]
|
|
];
|
|
];
|
|
- assert_same_vis(&exp, &v.vis);
|
|
|
|
|
|
+ assert_same_vis(p, &exp, &v.vis);
|
|
}
|
|
}
|
|
|
|
|
|
#[test]
|
|
#[test]
|
|
@@ -345,7 +369,8 @@ mod test {
|
|
]
|
|
]
|
|
];
|
|
];
|
|
let mut v = Viewshed::create(&b, |n| *n == 1);
|
|
let mut v = Viewshed::create(&b, |n| *n == 1);
|
|
- v.calculate_from(&b, Coord::new(3, 3));
|
|
|
|
|
|
+ let p = Coord::new(3, 3);
|
|
|
|
+ v.calculate_from(&b, p);
|
|
let exp: Board<bool> = board_from_vec![
|
|
let exp: Board<bool> = board_from_vec![
|
|
7,7;
|
|
7,7;
|
|
[
|
|
[
|
|
@@ -358,7 +383,7 @@ mod test {
|
|
U, U, U, U, U, U, U,
|
|
U, U, U, U, U, U, U,
|
|
]
|
|
]
|
|
];
|
|
];
|
|
- assert_same_vis(&exp, &v.vis);
|
|
|
|
|
|
+ assert_same_vis(p, &exp, &v.vis);
|
|
}
|
|
}
|
|
|
|
|
|
#[test]
|
|
#[test]
|
|
@@ -376,7 +401,8 @@ mod test {
|
|
]
|
|
]
|
|
];
|
|
];
|
|
let mut v = Viewshed::create(&b, |n| *n == 1);
|
|
let mut v = Viewshed::create(&b, |n| *n == 1);
|
|
- v.calculate_from(&b, Coord::new(3, 3));
|
|
|
|
|
|
+ let p = Coord::new(3, 3);
|
|
|
|
+ v.calculate_from(&b, p);
|
|
let exp: Board<bool> = board_from_vec![
|
|
let exp: Board<bool> = board_from_vec![
|
|
13,7;
|
|
13,7;
|
|
[
|
|
[
|
|
@@ -389,7 +415,7 @@ mod test {
|
|
U, U, U, U, U, U, U, U, U, U, U, U, U,
|
|
U, U, U, U, U, U, U, U, U, U, U, U, U,
|
|
]
|
|
]
|
|
];
|
|
];
|
|
- assert_same_vis(&exp, &v.vis);
|
|
|
|
|
|
+ assert_same_vis(p, &exp, &v.vis);
|
|
}
|
|
}
|
|
|
|
|
|
#[test]
|
|
#[test]
|
|
@@ -406,7 +432,8 @@ mod test {
|
|
];
|
|
];
|
|
|
|
|
|
let mut v = Viewshed::create(&b, |n| *n == 1);
|
|
let mut v = Viewshed::create(&b, |n| *n == 1);
|
|
- v.calculate_from(&b, Coord::new(2, 2));
|
|
|
|
|
|
+ let p = Coord::new(2, 2);
|
|
|
|
+ v.calculate_from(&b, p);
|
|
let exp: Board<bool> = board_from_vec![
|
|
let exp: Board<bool> = board_from_vec![
|
|
7,5;
|
|
7,5;
|
|
[
|
|
[
|
|
@@ -417,9 +444,10 @@ mod test {
|
|
U, U, U, U, U, U, U,
|
|
U, U, U, U, U, U, U,
|
|
]
|
|
]
|
|
];
|
|
];
|
|
- assert_same_vis(&exp, &v.vis);
|
|
|
|
|
|
+ assert_same_vis(p, &exp, &v.vis);
|
|
|
|
|
|
- v.calculate_from(&b, Coord::new(4, 2));
|
|
|
|
|
|
+ let p = Coord::new(4, 2);
|
|
|
|
+ v.calculate_from(&b, p);
|
|
let exp: Board<bool> = board_from_vec![
|
|
let exp: Board<bool> = board_from_vec![
|
|
7,5;
|
|
7,5;
|
|
[
|
|
[
|
|
@@ -430,7 +458,7 @@ mod test {
|
|
U, U, U, U, U, U, U,
|
|
U, U, U, U, U, U, U,
|
|
]
|
|
]
|
|
];
|
|
];
|
|
- assert_same_vis(&exp, &v.vis);
|
|
|
|
|
|
+ assert_same_vis(p, &exp, &v.vis);
|
|
}
|
|
}
|
|
|
|
|
|
#[test]
|
|
#[test]
|
|
@@ -449,7 +477,8 @@ mod test {
|
|
];
|
|
];
|
|
|
|
|
|
let mut v = Viewshed::create(&b, |n| *n == 1);
|
|
let mut v = Viewshed::create(&b, |n| *n == 1);
|
|
- v.calculate_from(&b, Coord::new(2, 2));
|
|
|
|
|
|
+ let p = Coord::new(2, 2);
|
|
|
|
+ v.calculate_from(&b, p);
|
|
let exp: Board<bool> = board_from_vec![
|
|
let exp: Board<bool> = board_from_vec![
|
|
9,7;
|
|
9,7;
|
|
[
|
|
[
|
|
@@ -462,6 +491,6 @@ mod test {
|
|
U, U, U, U, U, U, U, U, U,
|
|
U, U, U, U, U, U, U, U, U,
|
|
]
|
|
]
|
|
];
|
|
];
|
|
- assert_same_vis(&exp, &v.vis);
|
|
|
|
|
|
+ assert_same_vis(p, &exp, &v.vis);
|
|
}
|
|
}
|
|
}
|
|
}
|