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