11#![ allow( dead_code) ]
22
3-
43use crate :: int_interval_interval:: { intersect_interval_interval, IntervalConfig } ;
54use crate :: int_line_line:: { intersect_line_line, LineConfig } ;
65use crate :: interval:: interval;
76
87use crate :: { line:: line, point:: Point , segment:: Segment } ;
98
10- // Intersection between two line segments
11- // https://github.com/davideberly/GeometricTools/blob/master/GTE/Mathematics/IntrSegment2Segment2.h
12- // https://github.com/davideberly/GeometricTools/blob/master/GTE/Mathematics/IntrSegment2Segment2.h#L215
139#[ derive( Debug , PartialEq ) ]
1410pub enum SegmentConfig {
1511 NoIntersection ( ) ,
1612 OnePoint ( Point , f64 , f64 ) ,
17- //TwoPoints(Point, Point, f64, f64, f64, f64),
13+
1814 TwoPoints ( Point , Point , Point , Point ) ,
1915}
2016
21- // This version of the query uses GetCenteredForm, which
22- // has a Normalize call. This generates rounding errors, so the query
23- // should be used only with float or double. NOTE: The parameters are
24- // are relative to the centered form of the segment. Each segment has
25- // a center C, a unit-length direction D and an extent e > 0. A
26- // segment point is C+t*D where |t| <= e.
2717pub fn intersect_segment_segment ( segment0 : Segment , segment1 : Segment ) -> SegmentConfig {
2818 let ( seg0_origin, seg0_direction, seg0_extent) = segment0. get_centered_form ( ) ;
2919 let ( seg1_origin, seg1_direction, seg1_extent) = segment1. get_centered_form ( ) ;
@@ -35,38 +25,22 @@ pub fn intersect_segment_segment(segment0: Segment, segment1: Segment) -> Segmen
3525 match ll_result {
3626 LineConfig :: ParallelDistinct ( ) => return SegmentConfig :: NoIntersection ( ) ,
3727 LineConfig :: OnePoint ( p, s0, s1) => {
38- // The lines are not parallel, so they intersect in a single
39- // point. Test whether the line-line intersection is on the
40- // segments.
4128 if s0. abs ( ) <= seg0_extent && s1. abs ( ) <= seg1_extent {
4229 return SegmentConfig :: OnePoint ( p, s0, s1) ;
4330 } else {
4431 return SegmentConfig :: NoIntersection ( ) ;
4532 }
4633 }
4734 LineConfig :: ParallelTheSame ( ) => {
48- // The lines are the same. Compute the location of segment1
49- // endpoints relative to segment0.
5035 let diff = seg1_origin - seg0_origin;
5136 let t = seg0_direction. dot ( diff) ;
5237 let interval0 = interval ( -seg0_extent, seg0_extent) ;
5338 let interval1 = interval ( t - seg1_extent, t + seg1_extent) ;
54- // Compute the intersection of the intervals.
39+
5540 let ii_result = intersect_interval_interval ( interval0, interval1) ;
5641 match ii_result {
5742 IntervalConfig :: NoOverlap ( ) => return SegmentConfig :: NoIntersection ( ) ,
5843 IntervalConfig :: Overlap ( _, _) => {
59- // let param00 = i0;
60- // let param10 = i0 - t;
61- // let point0 = seg0_origin + seg0_direction * param00;
62-
63- // let param01 = i1;
64- // let param11 = i1 - t;
65- // let point1 = seg0_origin + seg0_direction * param01;
66-
67- // return SegmentConfig::TwoPoints(
68- // point0, point1, param00, param01, param10, param11,
69- // );
7044 let ( p0, p1, p2, p3) = Point :: sort_parallel_points (
7145 segment0. p0 ,
7246 segment0. p1 ,
@@ -76,10 +50,6 @@ pub fn intersect_segment_segment(segment0: Segment, segment1: Segment) -> Segmen
7650 return SegmentConfig :: TwoPoints ( p0, p1, p2, p3) ;
7751 }
7852 IntervalConfig :: Touching ( _) => {
79- // let param0 = i0;
80- // let param1 = i0 - t;
81- // let point0 = seg0_origin + seg0_direction * param0;
82-
8353 return SegmentConfig :: NoIntersection ( ) ;
8454 }
8555 }
@@ -114,7 +84,6 @@ mod test_int_segment_segment {
11484
11585 #[ test]
11686 fn test_no_intersection2 ( ) {
117- // parallel, not overlaping
11887 let sqrt_2_2 = std:: f64:: consts:: SQRT_2 / 2.0 ;
11988 let p0 = point ( 0.0 , 0.0 ) ;
12089 let p1 = point ( sqrt_2_2, sqrt_2_2) ;
@@ -129,7 +98,6 @@ mod test_int_segment_segment {
12998
13099 #[ test]
131100 fn test_parallel_overlaping ( ) {
132- // parallel the same, overlaping
133101 let ulp = std:: f64:: EPSILON * 2.0 ;
134102 let s0 = segment ( point ( 0.0 , 0.0 ) , point ( 2.0 , 2.0 ) ) ;
135103 let s1 = segment ( point ( 1.0 , 1.0 ) , point ( 3.0 , 3.0 ) ) ;
@@ -146,7 +114,6 @@ mod test_int_segment_segment {
146114
147115 #[ test]
148116 fn test_parallel_overlaping2 ( ) {
149- // parallel the same, overlaping
150117 let ulp = std:: f64:: EPSILON * 3.0 ;
151118 let s0 = segment ( point ( 0.0 , 0.0 ) , point ( 2.0 , 2.0 ) ) ;
152119 let s1 = segment ( point ( 4.0 , 4.0 ) , point ( -4.0 , -4.0 ) ) ;
@@ -163,11 +130,9 @@ mod test_int_segment_segment {
163130
164131 #[ test]
165132 fn test_parallel_touching ( ) {
166- // parallel the same, overlaping
167133 let s0 = segment ( point ( 0.0 , 0.0 ) , point ( 1.0 , 0.0 ) ) ;
168134 let s1 = segment ( point ( 1.0 , 0.0 ) , point ( 4.0 , 0.0 ) ) ;
169135 assert ! ( intersect_segment_segment( s0, s1) == SegmentConfig :: NoIntersection ( ) ) ;
170-
171136 }
172137
173138 #[ test]
0 commit comments