File size: 787 Bytes
2409829
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
use glam::DVec2;

pub type LineSegment = [DVec2; 2];

const COLLINEAR_EPS: f64 = f64::EPSILON * 64.;

#[inline(never)]
pub fn line_segment_intersection([p1, p2]: LineSegment, [p3, p4]: LineSegment, eps: f64) -> Option<(f64, f64)> {
	// https://en.wikipedia.org/wiki/Intersection_(geometry)#Two_line_segments

	let a = p2 - p1;
	let b = p3 - p4;
	let c = p3 - p1;

	let denom = a.x * b.y - a.y * b.x;

	if denom.abs() < COLLINEAR_EPS {
		return None;
	}

	let s = (c.x * b.y - c.y * b.x) / denom;
	let t = (a.x * c.y - a.y * c.x) / denom;

	if (-eps..=1. + eps).contains(&s) && (-eps..=1. + eps).contains(&t) { Some((s, t)) } else { None }
}

pub fn line_segments_intersect(seg1: LineSegment, seg2: LineSegment, eps: f64) -> bool {
	line_segment_intersection(seg1, seg2, eps).is_some()
}