Class: Geometry::Spheroid::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/geometry/spheroid/base.rb

Overview

end

Direct Known Subclasses

Sphere

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(equatorial_radius, polar_radius, unit = :km) ⇒ Base

Unit is not functional but is simply memoized so that the basis for any calculations is clear



32
33
34
35
36
# File 'lib/geometry/spheroid/base.rb', line 32

def initialize(equatorial_radius, polar_radius, unit = :km)
  @polar_radius      = polar_radius
  @equatorial_radius = equatorial_radius
  @unit              = unit
end

Instance Attribute Details

#equatorial_radiusObject

semi-major axis



27
28
29
# File 'lib/geometry/spheroid/base.rb', line 27

def equatorial_radius
  @equatorial_radius
end

#polar_radiusObject

semi-minor axis



26
27
28
# File 'lib/geometry/spheroid/base.rb', line 26

def polar_radius
  @polar_radius
end

#unitObject

Returns the value of attribute unit.



28
29
30
# File 'lib/geometry/spheroid/base.rb', line 28

def unit
  @unit
end

Instance Method Details

#flatteningObject



43
44
45
46
# File 'lib/geometry/spheroid/base.rb', line 43

def flattening
  # http://en.wikipedia.org/wiki/Reference_ellipsoid
  @flattening ||= (@equatorial_radius - @polar_radius) / @equatorial_radius
end

#flattening_complement_squaredObject



52
53
54
55
# File 'lib/geometry/spheroid/base.rb', line 52

def flattening_complement_squared
  # http://www.mathworks.co.uk/help/aeroblks/geodetictogeocentriclatitude.html
  @flattening_complement_squared ||= (1.0 - flattening) * (1.0 - flattening)    
end

#geodetic_to_geocentric_latitude(lat, options = {}) ⇒ Object



71
72
73
74
75
# File 'lib/geometry/spheroid/base.rb', line 71

def geodetic_to_geocentric_latitude(lat, options = {})
  lat = Geometry.deg_to_rad(lat) unless options[:unit] == :radians

  Math.atan(Math.tan(lat) * flattening_complement_squared)  
end

#haversine_distance(point_1, point_2, options = {}) ⇒ Object

Invoke the haversine formula in the context of the spheroid represented by self



78
79
80
# File 'lib/geometry/spheroid/base.rb', line 78

def haversine_distance(point_1, point_2, options = {})
  Geometry.haversine_distance(point_1, point_2, mean_radius, options)
end

#inverse_flatteningObject



48
49
50
# File 'lib/geometry/spheroid/base.rb', line 48

def inverse_flattening
  @inverse_flattening ||= 1.0 / flattening
end

#mean_radiusObject



38
39
40
41
# File 'lib/geometry/spheroid/base.rb', line 38

def mean_radius
  # http://en.wikipedia.org/wiki/Earth_radius
  @mean_radius ||= (@polar_radius + 2 * @equatorial_radius) / 3.0
end

#radius_at_geodetic_latitude(lat, options = {}) ⇒ Object



62
63
64
65
66
67
68
69
# File 'lib/geometry/spheroid/base.rb', line 62

def radius_at_geodetic_latitude(lat, options = {})
  lat = Geometry.deg_to_rad(lat) unless options[:unit] == :radians

  numerator   = (@equatorial_radius**2 * Math.cos(lat))**2 + (@polar_radius**2 * Math.sin(lat))**2
  denominator = (@equatorial_radius    * Math.cos(lat))**2 + (@polar_radius    * Math.sin(lat))**2

  Math.sqrt(numerator/denominator)
end

#volumeObject



57
58
59
# File 'lib/geometry/spheroid/base.rb', line 57

def volume
  @volume ||= (4.0 / 3.0) * (Math::PI * @polar_radius * @equatorial_radius ** 2)
end