Merge pull request #445 from hannobraun/polygon

Further simplify `Polygon`
This commit is contained in:
Hanno Braun 2022-04-09 15:15:05 +02:00 committed by GitHub
commit 0b445e2a89
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 25 additions and 14 deletions

View File

@ -35,8 +35,23 @@ pub fn triangulate(
}) })
.collect(); .collect();
let face_as_polygon = Polygon::new(surface) let face_as_polygon = Polygon::new(surface)
.with_exterior(approx.exterior) .with_exterior(approx.exterior.points.into_iter().map(
.with_interiors(approx.interiors); |point| {
// Can't panic, unless the approximation wrongfully
// generates points that are not in the surface.
surface.point_model_to_surface(point).native()
},
))
.with_interiors(approx.interiors.into_iter().map(
|interior| {
interior.points.into_iter().map(|point| {
// Can't panic, unless the approximation
// wrongfully generates points that are not in
// the surface.
surface.point_model_to_surface(point).native()
})
},
));
let mut triangles = delaunay(points); let mut triangles = delaunay(points);
triangles.retain(|triangle| { triangles.retain(|triangle| {

View File

@ -1,11 +1,11 @@
use std::collections::BTreeSet; use std::collections::BTreeSet;
use fj_debug::{DebugInfo, TriangleEdgeCheck}; 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 parry2d_f64::query::{Ray as Ray2, RayCast as _};
use parry3d_f64::query::Ray as Ray3; use parry3d_f64::query::Ray as Ray3;
use crate::{algorithms::CycleApprox, geometry::Surface}; use crate::geometry::Surface;
pub struct Polygon { pub struct Polygon {
surface: Surface, 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<2>>) -> Self {
self.with_approx(exterior) self.with_approx(exterior)
} }
pub fn with_interiors( pub fn with_interiors(
mut self, mut self,
interiors: impl IntoIterator<Item = impl Into<CycleApprox>>, interiors: impl IntoIterator<Item = impl Into<PolyChain<2>>>,
) -> Self { ) -> Self {
for interior in interiors { for interior in interiors {
self = self.with_approx(interior); self = self.with_approx(interior);
@ -37,18 +37,14 @@ impl Polygon {
self self
} }
fn with_approx(mut self, approx: impl Into<CycleApprox>) -> Self { fn with_approx(mut self, approx: impl Into<PolyChain<2>>) -> Self {
for segment in approx.into().segments() { for segment in approx.into().segments() {
let segment = segment.points().map(|point| { let segment = segment.points().map(|point| {
// Can't panic, unless the approximation wrongfully generates if point > self.max {
// points that are not in the surface. self.max = point;
let point = self.surface.point_model_to_surface(point);
if point.native() > self.max {
self.max = point.native();
} }
point.native() point
}); });
let edge = Segment::from(segment); let edge = Segment::from(segment);