github.com/pavlo67/common@v0.5.3/common/geolib/bearing.go (about) 1 package geolib 2 3 import ( 4 "math" 5 6 "github.com/pavlo67/common/common/mathlib/plane" 7 ) 8 9 // Bearing if a "right-angle" in degrees 10 type Bearing Degrees 11 12 func (bearing Bearing) Canon() Bearing { 13 for bearing >= 360 { 14 bearing -= 360 15 } 16 for bearing < 0 { 17 bearing += 360 18 } 19 20 return bearing 21 } 22 23 func (bearing Bearing) CanonTo180() Bearing { 24 for bearing > 180 { 25 bearing -= 360 26 } 27 for bearing <= -180 { 28 bearing += 360 29 } 30 31 return bearing 32 } 33 34 func BearingFromPoint(point plane.Point2) Bearing { 35 bearingDegrees := 90 - (180 * point.XToYAngleFromOx() / math.Pi) 36 37 for bearingDegrees >= 360 { 38 bearingDegrees -= 360 39 } 40 for bearingDegrees < 0 { 41 bearingDegrees += 360 42 } 43 44 return Bearing(bearingDegrees) 45 } 46 47 func BearingFromXToYAngleFromOy(rotation plane.XToYAngle) Bearing { 48 bearingDegrees := -(180 * rotation / math.Pi) 49 50 for bearingDegrees >= 360 { 51 bearingDegrees -= 360 52 } 53 for bearingDegrees < 0 { 54 bearingDegrees += 360 55 } 56 57 return Bearing(bearingDegrees) 58 } 59 60 // XToYAngleFromOy is calculated from Oy (as well as Bearing itself) 61 func (bearing Bearing) XToYAngleFromOy() plane.XToYAngle { 62 angle := plane.XToYAngle(-bearing * math.Pi / 180) 63 if angle <= -math.Pi { 64 return angle + 2*math.Pi 65 } else if angle > math.Pi { 66 return angle - 2*math.Pi 67 } 68 69 return angle 70 } 71 72 func (bearing Bearing) Point(radius float64) plane.Point2 { 73 return (math.Pi * (0.5 - plane.XToYAngle(bearing)/180)).Point2(radius) 74 }