55 lines
1.1 KiB
Go
55 lines
1.1 KiB
Go
package gg
|
|
|
|
type Liner interface {
|
|
Line() Line
|
|
}
|
|
|
|
type LinerPointContainer interface {
|
|
Liner
|
|
PointContainer
|
|
}
|
|
|
|
// The type represents the cross of 2 Liners.
|
|
type LineCross struct {
|
|
Pair [2]Line
|
|
Point Point
|
|
}
|
|
|
|
// Check if two LinerPointContainers do cross and return the
|
|
// crossing point.
|
|
func LinersCross(lp1, lp2 LinerPointContainer) (LineCross, bool) {
|
|
l1 := lp1.Line()
|
|
l2 := lp2.Line()
|
|
|
|
crossPt, doCross := l1.crossesLine(l2)
|
|
if len(lp1.ContainedPoints([]Point{crossPt}))==0 ||
|
|
len(lp2.ContainedPoints([]Point{crossPt}))==0 {
|
|
doCross = false
|
|
}
|
|
|
|
return LineCross{
|
|
Pair: [2]Line{l1, l2},
|
|
Point: crossPt,
|
|
}, doCross
|
|
}
|
|
|
|
// Check whether the liner is parallel to the other liner.
|
|
func LinersParallel(first, second Liner) bool {
|
|
l1 := first.Line()
|
|
l2 := second.Line()
|
|
|
|
return l1.K == l2.K || l1.Vertical && l2.Vertical
|
|
}
|
|
|
|
// Returns angle between liners in radians.
|
|
// The value fits the -Pi < Value < Pi condition.
|
|
func LinersAngle(first, second Liner) Float {
|
|
l1 := first.Line()
|
|
l2 := second.Line()
|
|
|
|
if l1.K == l2.K {
|
|
return 0
|
|
}
|
|
|
|
return Atan(l1.K/l2.K)
|
|
}
|