From 197f01d56a8da02283073bb7dd5a0a46ed2ab1f5 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Tue, 21 May 2019 14:50:35 -0700 Subject: [PATCH] Write in the line segment intersection code in matrix form --- geometry/src/basic/line_segment.rs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/geometry/src/basic/line_segment.rs b/geometry/src/basic/line_segment.rs index 9976fd38..88c60c17 100644 --- a/geometry/src/basic/line_segment.rs +++ b/geometry/src/basic/line_segment.rs @@ -11,6 +11,7 @@ //! Line segment types, optimized with SIMD. use crate::basic::point::Point2DF32; +use crate::basic::transform2d::Matrix2x2F32; use crate::util; use pathfinder_simd::default::F32x4; use std::ops::{Add, Sub}; @@ -227,15 +228,12 @@ impl LineSegmentF32 { // http://www.cs.swan.ac.uk/~cssimon/line_intersection.html pub fn intersection_t(&self, other: &LineSegmentF32) -> Option { - let d0d1 = self.vector().0.concat_xy_xy(other.vector().0); - let offset = other.from() - self.from(); - let factors = d0d1.concat_wz_yx(offset.0); - let terms = d0d1 * factors; - let denom = terms[0] - terms[1]; - if f32::abs(denom) < EPSILON { + let p0p1 = self.vector(); + let matrix = Matrix2x2F32(other.vector().0.concat_xy_xy((-p0p1).0)); + if f32::abs(matrix.det()) < EPSILON { return None; } - return Some((terms[3] - terms[2]) / denom); + return Some(matrix.inverse().transform_point(self.from() - other.from()).y()); const EPSILON: f32 = 0.0001; }