haversine_formula.sf 838 B

1234567891011121314151617181920212223242526272829303132333435
  1. #!/usr/bin/ruby
  2. #
  3. ## https://rosettacode.org/wiki/Haversine_formula
  4. #
  5. class EarthPoint(lat, lon) {
  6. const earth_radius = 6371 # mean earth radius
  7. const radian_ratio = Num.pi/180
  8. # accessors for radians
  9. method latR { self.lat * radian_ratio }
  10. method lonR { self.lon * radian_ratio }
  11. method haversine_dist(EarthPoint p) {
  12. var arc = __CLASS__(
  13. self.lat - p.lat,
  14. self.lon - p.lon,
  15. )
  16. var a = [ pow(sin(arc.latR / 2), 2),
  17. pow(sin(arc.lonR / 2), 2) *
  18. cos(self.latR) * cos(p.latR),
  19. ].sum
  20. earth_radius * asin(sqrt(a)) * 2
  21. }
  22. }
  23. var BNA = EarthPoint.new(lat: 36.12, lon: -86.67)
  24. var LAX = EarthPoint.new(lat: 33.94, lon: -118.4)
  25. say BNA.haversine_dist(LAX) # => 2886.444442837983299747157823945...