From 9e89ce4d95773b83ccce62b819b46a30b747314b Mon Sep 17 00:00:00 2001 From: Doc Date: Wed, 10 Sep 2025 10:50:03 +0200 Subject: [PATCH] added bounds function and segline to intersect function --- internal/geom/fit.go | 25 +++++++++++++++++++++++++ internal/geom/intersect.go | 11 +++++++++++ 2 files changed, 36 insertions(+) create mode 100644 internal/geom/fit.go create mode 100644 internal/geom/intersect.go diff --git a/internal/geom/fit.go b/internal/geom/fit.go new file mode 100644 index 0000000..cfa672a --- /dev/null +++ b/internal/geom/fit.go @@ -0,0 +1,25 @@ +package geom + +import "math" + +type AABB struct{ Min, Max Vec } + +func Bounds(pts []Vec) AABB { + minX, minY := math.Inf(1), math.Inf(1) + maxX, maxY := math.Inf(-1), math.Inf(-1) + for _, p := range pts { + if p.X < minX { + minX = p.X + } + if p.Y < minY { + minY = p.Y + } + if p.X > maxX { + maxX = p.X + } + if p.Y > maxY { + maxY = p.Y + } + } + return AABB{Min: V(minX, minY), Max: V(maxX, maxY)} +} diff --git a/internal/geom/intersect.go b/internal/geom/intersect.go new file mode 100644 index 0000000..fc868de --- /dev/null +++ b/internal/geom/intersect.go @@ -0,0 +1,11 @@ +package geom + +func SegLineIntersect(A, B, O, D Vec) (bool, float64) { + r := Sub(B, A) + den := Cross(r, D) + if NearlyZero(den) { + return false, 0 + } + t := Cross(Sub(O, A), D) / den + return t > EPS && t < 1-EPS, t +}