From e69e1967bb377e943f53636b984ac59bc006b734 Mon Sep 17 00:00:00 2001 From: Doc Date: Sun, 7 Sep 2025 15:34:33 +0200 Subject: [PATCH] added side and split geom logic --- internal/geom/side.go | 5 +++++ internal/geom/split.go | 29 +++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 internal/geom/side.go create mode 100644 internal/geom/split.go diff --git a/internal/geom/side.go b/internal/geom/side.go new file mode 100644 index 0000000..9b5e6e9 --- /dev/null +++ b/internal/geom/side.go @@ -0,0 +1,5 @@ +package geom + +func Side(P, O, D Vec) float64 { + return Cross(D, Sub(P, O)) +} diff --git a/internal/geom/split.go b/internal/geom/split.go new file mode 100644 index 0000000..7e3e4e8 --- /dev/null +++ b/internal/geom/split.go @@ -0,0 +1,29 @@ +package geom + +func SplitSeg(s Seg, O, D Vec) (front, back []Seg) { + sa := Side(s.A, O, D) + sb := Side(s.B, O, D) + + if sa >= -EPS && sb >= -EPS { + return []Seg{s}, nil + } + if sa <= EPS && sb <= EPS { + return nil, []Seg{s} + } + + ok, t := SegLineIntersect(s.A, s.B, O, D) + if !ok { + + if sa >= 0 { + return []Seg{s}, nil + } + return nil, []Seg{s} + } + M := Vec{s.A.X + t*(s.B.X-s.A.X), s.A.Y + t*(s.B.Y-s.A.Y)} + a := Seg{s.A, M} + b := Seg{M, s.B} + if sa > 0 { + return []Seg{a}, []Seg{b} + } + return []Seg{b}, []Seg{a} +}