Merge pull request #2306 from hannobraun/geometry

Make some refactorings to geometry-related code
This commit is contained in:
Hanno Braun 2024-03-28 13:36:05 +01:00 committed by GitHub
commit 6658cc1196
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 27 additions and 23 deletions

View File

@ -192,12 +192,12 @@ mod tests {
fn approx_line_on_flat_surface() { fn approx_line_on_flat_surface() {
let mut core = Core::new(); let mut core = Core::new();
let curve = Curve::new().insert(&mut core); let surface = core.layers.topology.surfaces.xz_plane();
let (path, boundary) = let (path, boundary) =
SurfacePath::line_from_points([[1., 1.], [2., 1.]]); SurfacePath::line_from_points([[1., 1.], [2., 1.]]);
let curve = Curve::new().insert(&mut core);
let boundary = CurveBoundary::from(boundary); let boundary = CurveBoundary::from(boundary);
let half_edge = HalfEdgeGeom { path, boundary }; let half_edge = HalfEdgeGeom { path, boundary };
let surface = core.layers.topology.surfaces.xz_plane();
let tolerance = 1.; let tolerance = 1.;
let approx = (&curve, &half_edge, &surface) let approx = (&curve, &half_edge, &surface)
@ -210,16 +210,16 @@ mod tests {
fn approx_line_on_curved_surface_but_not_along_curve() { fn approx_line_on_curved_surface_but_not_along_curve() {
let mut core = Core::new(); let mut core = Core::new();
let curve = Curve::new().insert(&mut core);
let (path, boundary) =
SurfacePath::line_from_points([[1., 1.], [2., 1.]]);
let boundary = CurveBoundary::from(boundary);
let half_edge = HalfEdgeGeom { path, boundary };
let surface = Surface::from_uv( let surface = Surface::from_uv(
GlobalPath::circle_from_radius(1.), GlobalPath::circle_from_radius(1.),
[0., 0., 1.], [0., 0., 1.],
&mut core, &mut core,
); );
let (path, boundary) =
SurfacePath::line_from_points([[1., 1.], [2., 1.]]);
let curve = Curve::new().insert(&mut core);
let boundary = CurveBoundary::from(boundary);
let half_edge = HalfEdgeGeom { path, boundary };
let tolerance = 1.; let tolerance = 1.;
let approx = (&curve, &half_edge, &surface) let approx = (&curve, &half_edge, &surface)
@ -233,14 +233,14 @@ mod tests {
let mut core = Core::new(); let mut core = Core::new();
let global_path = GlobalPath::circle_from_radius(1.); let global_path = GlobalPath::circle_from_radius(1.);
let curve = Curve::new().insert(&mut core); let surface = Surface::from_uv(global_path, [0., 0., 1.], &mut core);
let path = SurfacePath::line_from_points_with_coords([ let path = SurfacePath::line_from_points_with_coords([
([0.], [0., 1.]), ([0.], [0., 1.]),
([TAU], [TAU, 1.]), ([TAU], [TAU, 1.]),
]); ]);
let curve = Curve::new().insert(&mut core);
let boundary = CurveBoundary::from([[0.], [TAU]]); let boundary = CurveBoundary::from([[0.], [TAU]]);
let half_edge = HalfEdgeGeom { path, boundary }; let half_edge = HalfEdgeGeom { path, boundary };
let surface = Surface::from_uv(global_path, [0., 0., 1.], &mut core);
let tolerance = 1.; let tolerance = 1.;
let approx = (&curve, &half_edge, &surface) let approx = (&curve, &half_edge, &surface)
@ -266,11 +266,11 @@ mod tests {
fn approx_circle_on_flat_surface() { fn approx_circle_on_flat_surface() {
let mut core = Core::new(); let mut core = Core::new();
let curve = Curve::new().insert(&mut core); let surface = core.layers.topology.surfaces.xz_plane();
let path = SurfacePath::circle_from_center_and_radius([0., 0.], 1.); let path = SurfacePath::circle_from_center_and_radius([0., 0.], 1.);
let curve = Curve::new().insert(&mut core);
let boundary = CurveBoundary::from([[0.], [TAU]]); let boundary = CurveBoundary::from([[0.], [TAU]]);
let half_edge = HalfEdgeGeom { path, boundary }; let half_edge = HalfEdgeGeom { path, boundary };
let surface = core.layers.topology.surfaces.xz_plane();
let tolerance = 1.; let tolerance = 1.;
let approx = (&curve, &half_edge, &surface) let approx = (&curve, &half_edge, &surface)

View File

@ -10,8 +10,8 @@ impl super::BoundingVolume<2> for &Handle<HalfEdge> {
fn aabb(self, geometry: &Geometry) -> Option<Aabb<2>> { fn aabb(self, geometry: &Geometry) -> Option<Aabb<2>> {
let half_edge = self; let half_edge = self;
let half_edge = geometry.of_half_edge(half_edge); let half_edge_geom = geometry.of_half_edge(half_edge);
let path = half_edge.path; let path = half_edge_geom.path;
match path { match path {
SurfacePath::Circle(circle) => { SurfacePath::Circle(circle) => {
@ -27,7 +27,7 @@ impl super::BoundingVolume<2> for &Handle<HalfEdge> {
}) })
} }
SurfacePath::Line(_) => { SurfacePath::Line(_) => {
let points = half_edge.boundary.inner.map(|point_curve| { let points = half_edge_geom.boundary.inner.map(|point_curve| {
path.point_from_path_coords(point_curve) path.point_from_path_coords(point_curve)
}); });

View File

@ -106,13 +106,17 @@ pub trait BuildHalfEdge {
boundary.zip_ext(points_surface), boundary.zip_ext(points_surface),
); );
HalfEdge::unjoined(core).insert(core).set_geometry( let half_edge = HalfEdge::unjoined(core).insert(core);
core.layers.geometry.define_half_edge(
half_edge.clone(),
HalfEdgeGeom { HalfEdgeGeom {
path, path,
boundary: boundary.into(), boundary: boundary.into(),
}, },
&mut core.layers.geometry, );
)
half_edge
} }
} }

View File

@ -9,9 +9,9 @@ use super::ReverseCurveCoordinateSystems;
impl ReverseCurveCoordinateSystems for Handle<HalfEdge> { impl ReverseCurveCoordinateSystems for Handle<HalfEdge> {
fn reverse_curve_coordinate_systems(&self, core: &mut Core) -> Self { fn reverse_curve_coordinate_systems(&self, core: &mut Core) -> Self {
let mut geometry = *core.layers.geometry.of_half_edge(self); let mut half_edge_geom = *core.layers.geometry.of_half_edge(self);
geometry.path = geometry.path.reverse(); half_edge_geom.path = half_edge_geom.path.reverse();
geometry.boundary = geometry.boundary.reverse(); half_edge_geom.boundary = half_edge_geom.boundary.reverse();
let half_edge = let half_edge =
HalfEdge::new(self.curve().clone(), self.start_vertex().clone()) HalfEdge::new(self.curve().clone(), self.start_vertex().clone())
@ -20,7 +20,7 @@ impl ReverseCurveCoordinateSystems for Handle<HalfEdge> {
core.layers core.layers
.geometry .geometry
.define_half_edge(half_edge.clone(), geometry); .define_half_edge(half_edge.clone(), half_edge_geom);
half_edge half_edge
} }

View File

@ -88,11 +88,11 @@ impl SolidValidationError {
face.region() face.region()
.all_cycles() .all_cycles()
.flat_map(|cycle| cycle.half_edges().iter().cloned()) .flat_map(|cycle| cycle.half_edges().iter().cloned())
.zip(repeat(geometry.of_surface(face.surface()))) .zip(repeat(face.surface()))
}) })
.map(|(h, s)| { .map(|(h, s)| {
( (
s.point_from_surface_coords( geometry.of_surface(s).point_from_surface_coords(
geometry.of_half_edge(&h).start_position(), geometry.of_half_edge(&h).start_position(),
), ),
h.start_vertex().clone(), h.start_vertex().clone(),