geo/algorithm/relate/geomgraph/index/
simple_edge_set_intersector.rs1use super::super::{Edge, GeometryGraph};
2use super::{EdgeSetIntersector, SegmentIntersector};
3use crate::GeoFloat;
4
5use std::cell::RefCell;
6use std::rc::Rc;
7
8pub(crate) struct SimpleEdgeSetIntersector;
9
10impl SimpleEdgeSetIntersector {
11 pub fn new() -> Self {
12 SimpleEdgeSetIntersector
13 }
14
15 fn compute_intersects<F: GeoFloat>(
16 &self,
17 edge0: &Rc<RefCell<Edge<F>>>,
18 edge1: &Rc<RefCell<Edge<F>>>,
19 segment_intersector: &mut SegmentIntersector<F>,
20 ) {
21 let edge0_coords_len = edge0.borrow().coords().len() - 1;
22 let edge1_coords_len = edge1.borrow().coords().len() - 1;
23 for i0 in 0..edge0_coords_len {
24 for i1 in 0..edge1_coords_len {
25 segment_intersector.add_intersections(edge0, i0, edge1, i1);
26 }
27 }
28 }
29}
30
31impl<F: GeoFloat> EdgeSetIntersector<F> for SimpleEdgeSetIntersector {
32 fn compute_intersections_within_set(
33 &self,
34 graph: &GeometryGraph<F>,
35 check_for_self_intersecting_edges: bool,
36 segment_intersector: &mut SegmentIntersector<F>,
37 ) {
38 let edges = graph.edges();
39 for edge0 in edges.iter() {
40 for edge1 in edges.iter() {
41 if check_for_self_intersecting_edges || edge0.as_ptr() != edge1.as_ptr() {
42 self.compute_intersects(edge0, edge1, segment_intersector);
43 }
44 }
45 }
46 }
47
48 fn compute_intersections_between_sets<'a>(
49 &self,
50 graph_0: &GeometryGraph<'a, F>,
51 graph_1: &GeometryGraph<'a, F>,
52 segment_intersector: &mut SegmentIntersector<F>,
53 ) {
54 let edges_0 = graph_0.edges();
55 let edges_1 = graph_1.edges();
56
57 for edge0 in edges_0 {
58 for edge1 in edges_1 {
59 self.compute_intersects(edge0, edge1, segment_intersector);
60 }
61 }
62 }
63}