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  }