fj_core/operations/reverse/
cycle.rs

1use crate::{
2    geometry::HalfEdgeGeometry,
3    objects::{Cycle, HalfEdge},
4    operations::{derive::DeriveFrom, insert::Insert},
5    Core,
6};
7
8use super::{Reverse, ReverseCurveCoordinateSystems};
9
10impl Reverse for Cycle {
11    fn reverse(&self, core: &mut Core) -> Self {
12        let mut edges = self
13            .half_edges()
14            .pairs()
15            .map(|(current, next)| {
16                let half_edge = HalfEdge::new(
17                    core.layers.geometry.of_half_edge(current).path,
18                    current.boundary().reverse(),
19                    current.curve().clone(),
20                    next.start_vertex().clone(),
21                )
22                .insert(core)
23                .derive_from(current, core);
24
25                core.layers.geometry.define_half_edge(
26                    half_edge.clone(),
27                    HalfEdgeGeometry {
28                        path: core.layers.geometry.of_half_edge(current).path,
29                    },
30                );
31
32                half_edge
33            })
34            .collect::<Vec<_>>();
35
36        edges.reverse();
37
38        Cycle::new(edges)
39    }
40}
41
42impl ReverseCurveCoordinateSystems for Cycle {
43    fn reverse_curve_coordinate_systems(&self, core: &mut Core) -> Self {
44        let edges = self
45            .half_edges()
46            .iter()
47            .map(|edge| edge.reverse_curve_coordinate_systems(core));
48
49        Cycle::new(edges)
50    }
51}