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 +}