Class: Quadtree::Point

Inherits:
Object
  • Object
show all
Defined in:
lib/quadtree/point.rb

Overview

Simple coordinate object to represent points in some space.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(x, y, data = nil) ⇒ Point

Returns a new instance of Point.

Parameters:

  • x (Float, Numeric)

    X coordinate.

  • y (Float, Numeric)

    Y coordinate.

  • data (Object) (defaults to: nil)

    payload payload attached to this instance (optional).



21
22
23
24
25
# File 'lib/quadtree/point.rb', line 21

def initialize(x, y, data=nil)
  @x = x.to_f
  @y = y.to_f
  @data = data unless data.nil?
end

Instance Attribute Details

#dataObject

Optional payload attached to this instance.

Returns:

  • (Object)

    payload attached to this instance.



15
16
17
# File 'lib/quadtree/point.rb', line 15

def data
  @data
end

#xFloat

The X coordinate of this instance.

Returns:

  • (Float)

    X coordinate.



7
8
9
# File 'lib/quadtree/point.rb', line 7

def x
  @x
end

#yFloat

The Y coordinate of this instance.

Returns:

  • (Float)

    Y coordinate.



11
12
13
# File 'lib/quadtree/point.rb', line 11

def y
  @y
end

Instance Method Details

#distance_to(other) ⇒ Float

This will calculate distance to another Quadtree::Point, given that they are both in the same 2D space.

Parameters:

Returns:



32
33
34
# File 'lib/quadtree/point.rb', line 32

def distance_to(other)
  Math.sqrt((other.x - self.x) ** 2 + (other.y - self.y) ** 2)
end

#haversine_distance_to(other) ⇒ Float

This will calculate distance to another Quadtree::Point using the Haversine formula. This means that it will treat #x as longitude and #y as latitude!

a = sin²(Δφ/2) + cos φ_1 ⋅ cos φ_2 ⋅ sin²(Δλ/2)

c = 2 ⋅ atan2( √a, √(1−a) )

d = R ⋅ c

where φ is latitude, λ is longitude, R is earth’s radius (mean radius = 6 371 km); note that angles need to be in radians to pass to trig functions!

Parameters:

Returns:



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/quadtree/point.rb', line 52

def haversine_distance_to(other)
  # earth's radius
  r = 6371 * 1000.0
  # coverting degrees to radians
  lat1 = self.y * (Math::PI / 180.0)
  lat2 = other.y * (Math::PI / 180.0)
  dlat = (other.y - self.y) * (Math::PI / 180.0)
  dlon = (other.x - self.x) * (Math::PI / 180.0)

  # a = sin²(Δφ/2) + cos φ_1 ⋅ cos φ_2 ⋅ sin²(Δλ/2)
  a = Math.sin(dlat / 2.0) * Math.sin(dlat / 2.0) +
      Math.cos(lat1) * Math.cos(lat2) *
      Math.sin(dlon / 2.0) * Math.sin(dlon / 2.0)
  # c = 2 ⋅ atan2( √a, √(1−a) )
  c = 2.0 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a))
  # d = R ⋅ c
  return r * c
end