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