class Terraformer::Point

Constants

DEFAULT_RANDOM_DELTA
DEFAULT_RANDOM_POINTS
DEFAULT_RANDOM_ROUND

Public Class Methods

new(*args) click to toggle source
Calls superclass method Terraformer::Geometry::new
# File lib/terraformer/point.rb, line 9
def initialize *args
  super

  # must be a single point
  unless Terraformer::Coordinate === coordinates
    raise ArgumentError.new 'invalid coordinates for Terraformer::Point'
  end
end

Public Instance Methods

contains?(obj) click to toggle source
# File lib/terraformer/point.rb, line 63
def contains? obj
  case obj
  when Point
    self == obj
  else
    raise ArgumentError.new "unsupported type: #{obj.type rescue obj.class}"
  end
end
distance_and_bearing_to(obj) click to toggle source
# File lib/terraformer/point.rb, line 22
def distance_and_bearing_to obj
  dabt = case obj
         when Point
           [first_coordinate.distance_and_bearing_to(obj.first_coordinate)]

         when MultiPoint
           obj.coordinates.map {|c| first_coordinate.distance_and_bearing_to c}

         when LineString
           obj.coordinates.map {|c| first_coordinate.distance_and_bearing_to c}

         when MultiLineString
           obj.line_strings.map {|ls| distance_and_bearing_to ls}

         when Polygon
           obj.line_strings[0].coordinates.map {|c| first_coordinate.distance_and_bearing_to c}

         when MultiPolygon
           obj.polygons.map {|p| distance_and_bearing_to p}

         # todo other cases

         else
           raise ArgumentError.new "unsupported type: #{obj.type rescue obj.class}"
         end
  dabt.flatten!
  dabt.minmax_by {|db| db[:distance]}
end
distance_to(obj, minmax = :min) click to toggle source
# File lib/terraformer/point.rb, line 51
def distance_to obj, minmax = :min
  distance_and_bearing_to(obj)[minmax == :min ? 0 : 1][:distance]
end
final_bearing_to(obj) click to toggle source
# File lib/terraformer/point.rb, line 59
def final_bearing_to obj
  distance_and_bearing_to(obj)[0][:bearing][:final]
end
first_coordinate() click to toggle source
# File lib/terraformer/point.rb, line 18
def first_coordinate
  coordinates
end
initial_bearing_to(obj) click to toggle source
# File lib/terraformer/point.rb, line 55
def initial_bearing_to obj
  distance_and_bearing_to(obj)[0][:bearing][:initial]
end
random_points(n = DEFAULT_RANDOM_POINTS, delta = DEFAULT_RANDOM_DELTA, round = DEFAULT_RANDOM_ROUND) click to toggle source
# File lib/terraformer/point.rb, line 91
def random_points n = DEFAULT_RANDOM_POINTS,
                  delta = DEFAULT_RANDOM_DELTA,
                  round = DEFAULT_RANDOM_ROUND
  s = ->{rand(2) * 2 - 1} # -1 or 1
  Array.new(n) do
    x = (coordinates.x + s[] * rand() * delta).round(round)
    y = (coordinates.y + s[] * rand() * delta).round(round)
    Terraformer::Point.new x, y
  end
end
within?(obj) click to toggle source
# File lib/terraformer/point.rb, line 72
def within? obj
  case obj
  when Point
    self == obj
  when MultiPoint
    obj.coordinates.any? {|c| self.coordinates == c}
  when LineString
    obj.coordinates.any? {|c| self.coordinates == c}
  when MultiLineString
    obj.line_strings.any? {|ls| within? ls}
  when Polygon
    obj.contains? self
  when MultiPolygon
    obj.polygons.any? {|p| p.contains? self}
  else
    raise ArgumentError unless Geometry === obj
  end
end