30 lines
519 B
Go
30 lines
519 B
Go
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}
|
|
}
|