added side and split geom logic

This commit is contained in:
Doc
2025-09-07 15:34:33 +02:00
parent 0722b2d9fe
commit e69e1967bb
2 changed files with 34 additions and 0 deletions

5
internal/geom/side.go Normal file
View File

@@ -0,0 +1,5 @@
package geom
func Side(P, O, D Vec) float64 {
return Cross(D, Sub(P, O))
}

29
internal/geom/split.go Normal file
View File

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