Don't use CycleApprox in Polygon

`Polygon` doesn't know of or care about approximations. It cares about
its polygonal chain. So this change makes sense from a conceptual
perspective.

It also makes sense from a practical perspective, as this enables some
simplifications of `Polygon`, which should further improve its
testability.
This commit is contained in:
Hanno Braun 2022-04-09 11:56:50 +02:00
parent 9c768bb39f
commit 6d3e738b65
2 changed files with 12 additions and 7 deletions

View File

@ -35,8 +35,13 @@ pub fn triangulate(
})
.collect();
let face_as_polygon = Polygon::new(surface)
.with_exterior(approx.exterior)
.with_interiors(approx.interiors);
.with_exterior(approx.exterior.points)
.with_interiors(
approx
.interiors
.into_iter()
.map(|interior| interior.points),
);
let mut triangles = delaunay(points);
triangles.retain(|triangle| {

View File

@ -1,11 +1,11 @@
use std::collections::BTreeSet;
use fj_debug::{DebugInfo, TriangleEdgeCheck};
use fj_math::{Point, Scalar, Segment};
use fj_math::{Point, PolyChain, Scalar, Segment};
use parry2d_f64::query::{Ray as Ray2, RayCast as _};
use parry3d_f64::query::Ray as Ray3;
use crate::{algorithms::CycleApprox, geometry::Surface};
use crate::geometry::Surface;
pub struct Polygon {
surface: Surface,
@ -22,13 +22,13 @@ impl Polygon {
}
}
pub fn with_exterior(self, exterior: impl Into<CycleApprox>) -> Self {
pub fn with_exterior(self, exterior: impl Into<PolyChain<3>>) -> Self {
self.with_approx(exterior)
}
pub fn with_interiors(
mut self,
interiors: impl IntoIterator<Item = impl Into<CycleApprox>>,
interiors: impl IntoIterator<Item = impl Into<PolyChain<3>>>,
) -> Self {
for interior in interiors {
self = self.with_approx(interior);
@ -37,7 +37,7 @@ impl Polygon {
self
}
fn with_approx(mut self, approx: impl Into<CycleApprox>) -> Self {
fn with_approx(mut self, approx: impl Into<PolyChain<3>>) -> Self {
for segment in approx.into().segments() {
let segment = segment.points().map(|point| {
// Can't panic, unless the approximation wrongfully generates