Skip to content

Commit

Permalink
don't panic on triangulation error
Browse files Browse the repository at this point in the history
  • Loading branch information
mockersf committed Aug 17, 2023
1 parent 29f7cfc commit 59de88d
Show file tree
Hide file tree
Showing 5 changed files with 56 additions and 45 deletions.
14 changes: 7 additions & 7 deletions benches/triangulation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ fn triangulation(c: &mut Criterion) {
triangulation.add_obstacle(ARENA_OBSTACLES[3].to_vec());
triangulation.add_obstacle(ARENA_OBSTACLES[4].to_vec());

let mesh: Mesh = triangulation.as_navmesh();
let mesh: Mesh = triangulation.as_navmesh().unwrap();
black_box(mesh);
})
});
Expand All @@ -161,7 +161,7 @@ fn triangulation_bulk(c: &mut Criterion) {
ARENA_OBSTACLES[3].to_vec(),
ARENA_OBSTACLES[4].to_vec(),
]);
let mesh: Mesh = triangulation.as_navmesh();
let mesh: Mesh = triangulation.as_navmesh().unwrap();
black_box(mesh);
})
});
Expand All @@ -180,7 +180,7 @@ fn triangulation_overlapping(c: &mut Criterion) {
triangulation.add_obstacle(ARENA_OBSTACLES[4].to_vec());
triangulation.merge_overlapping_obstacles();

let mesh: Mesh = triangulation.as_navmesh();
let mesh: Mesh = triangulation.as_navmesh().unwrap();
black_box(mesh);
})
});
Expand Down Expand Up @@ -219,7 +219,7 @@ fn triangulation_square(c: &mut Criterion) {
vec2(7.5, 7.5),
vec2(7.5, 5.01),
]);
let mesh: Mesh = triangulation.as_navmesh();
let mesh: Mesh = triangulation.as_navmesh().unwrap();
black_box(mesh);
})
});
Expand Down Expand Up @@ -259,7 +259,7 @@ fn triangulation_square_overlapping(c: &mut Criterion) {
vec2(7.5, 4.0),
]);
triangulation.merge_overlapping_obstacles();
let mesh: Mesh = triangulation.as_navmesh();
let mesh: Mesh = triangulation.as_navmesh().unwrap();
black_box(mesh);
})
});
Expand Down Expand Up @@ -2088,7 +2088,7 @@ fn triangulation_many_overlapping(c: &mut Criterion) {
b.iter(|| {
let mut triangulation = random_with_many_obstacles();
triangulation.merge_overlapping_obstacles();
let mesh: Mesh = triangulation.as_navmesh();
let mesh: Mesh = triangulation.as_navmesh().unwrap();
black_box(mesh);
})
});
Expand All @@ -2102,7 +2102,7 @@ fn triangulation_many_overlapping_simplified(c: &mut Criterion) {
let mut triangulation = random_with_many_obstacles();
triangulation.merge_overlapping_obstacles();
triangulation.simplify(0.005);
let mesh: Mesh = triangulation.as_navmesh();
let mesh: Mesh = triangulation.as_navmesh().unwrap();
black_box(mesh);
})
},
Expand Down
2 changes: 1 addition & 1 deletion examples/traced/src/bin/triangulation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1825,6 +1825,6 @@ fn main() {
]);
triangulation.merge_overlapping_obstacles();
triangulation.simplify(0.005);
triangulation.as_navmesh();
triangulation.as_navmesh().unwrap();
}
}
71 changes: 41 additions & 30 deletions src/input/triangulation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -118,53 +118,64 @@ impl Triangulation {
fn add_constraint_edges(
cdt: &mut ConstrainedDelaunayTriangulation<Point2<f32>>,
edges: &LineString<f32>,
) {
) -> Option<()> {
let mut edge_iter = edges.coords().peekable();
let mut vertex_pairs = Vec::new();
loop {
let from = edge_iter.next().unwrap();
let next = edge_iter.peek();

if let Some(next) = next {
cdt.add_constraint_edge(
Point2 {
x: from.x,
y: from.y,
},
Point2 {
x: next.x,
y: next.y,
},
)
let point_a = cdt
.insert(Point2 {
x: from.x,
y: from.y,
})
.unwrap();
let point_b = if let Some(next) = next {
vertex_pairs.push((*from, **next));
cdt.insert(Point2 {
x: next.x,
y: next.y,
})
.unwrap()
} else {
cdt.add_constraint_edge(
Point2 {
x: from.x,
y: from.y,
},
Point2 {
x: edges[0].x,
y: edges[0].y,
},
)
.unwrap();
vertex_pairs.push((*from, edges[0]));

cdt.insert(Point2 {
x: edges[0].x,
y: edges[0].y,
})
.unwrap()
// break;
};
if cdt.can_add_constraint(point_a, point_b) {
cdt.add_constraint(point_a, point_b);
} else {
return None;
}
if next.is_none() {
break;
}
}
Some(())
}

/// Convert the triangulation into a [`Mesh`].
#[cfg_attr(feature = "tracing", instrument(skip_all))]
pub fn as_navmesh(&self) -> Mesh {
pub fn as_navmesh(&self) -> Option<Mesh> {
let mut cdt = ConstrainedDelaunayTriangulation::<Point2<f32>>::new();
Triangulation::add_constraint_edges(&mut cdt, self.inner.exterior());

self.inner.interiors().iter().for_each(|obstacle| {
Triangulation::add_constraint_edges(&mut cdt, obstacle);
});
Triangulation::add_constraint_edges(&mut cdt, self.inner.exterior())?;

if self
.inner
.interiors()
.iter()
.filter(|obstacle| Triangulation::add_constraint_edges(&mut cdt, obstacle).is_none())
.next()
.is_some()
{
return None;
}

#[cfg(feature = "tracing")]
let polygon_span = tracing::info_span!("listing polygons").entered();
Expand Down Expand Up @@ -231,6 +242,6 @@ impl Triangulation {
#[cfg(feature = "tracing")]
drop(vertex_span);

Mesh::new(vertices, polygons)
Some(Mesh::new(vertices, polygons))
}
}
2 changes: 1 addition & 1 deletion tests/arena-triangulation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ fn arena_mesh() -> Mesh {
vec2(26., 7.),
vec2(26., 10.),
]);
triangulation.as_navmesh()
triangulation.as_navmesh().unwrap()
}

#[test]
Expand Down
12 changes: 6 additions & 6 deletions tests/triangulation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ fn is_in_mesh() {
vec2(7.5, 7.5),
vec2(7.5, 2.5),
]);
let mesh: Mesh = triangulation.as_navmesh();
let mesh: Mesh = triangulation.as_navmesh().unwrap();
for i in 0..10 {
for j in 0..10 {
if i > 2 && i < 8 && j > 2 && j < 8 {
Expand Down Expand Up @@ -61,7 +61,7 @@ fn is_in_mesh_4_obstacles() {
]);
triangulation.merge_overlapping_obstacles();
triangulation.simplify(0.5);
let mesh: Mesh = triangulation.as_navmesh();
let mesh: Mesh = triangulation.as_navmesh().unwrap();

dbg!(mesh.polygons.len());
for i in 0..10 {
Expand Down Expand Up @@ -108,7 +108,7 @@ fn is_in_mesh_overlapping() {
vec2(7.5, 7.5),
vec2(7.5, 4.0),
]);
let mesh: Mesh = triangulation.as_navmesh();
let mesh: Mesh = triangulation.as_navmesh().unwrap();
for i in 0..10 {
for j in 0..10 {
if i > 2 && i < 8 && j > 2 && j < 8 {
Expand Down Expand Up @@ -153,7 +153,7 @@ fn is_in_mesh_overlapping_merged() {
vec2(7.5, 4.0),
]);
triangulation.merge_overlapping_obstacles();
let mesh: Mesh = triangulation.as_navmesh();
let mesh: Mesh = triangulation.as_navmesh().unwrap();
for i in 0..10 {
for j in 0..10 {
if i > 2 && i < 8 && j > 2 && j < 8 {
Expand Down Expand Up @@ -198,9 +198,9 @@ fn is_in_mesh_overlapping_simplified() {
vec2(7.5, 4.0),
]);
triangulation.merge_overlapping_obstacles();
let polygons_before = triangulation.as_navmesh().polygons;
let polygons_before = triangulation.as_navmesh().unwrap().polygons;
triangulation.simplify(1.0);
let mesh: Mesh = triangulation.as_navmesh();
let mesh: Mesh = triangulation.as_navmesh().unwrap();
assert!(dbg!(polygons_before.len()) > dbg!(mesh.polygons.len()));
for i in 0..10 {
for j in 0..10 {
Expand Down

0 comments on commit 59de88d

Please sign in to comment.