class Terraformer::MultiPolygon

Public Class Methods

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

  # arg is an array of arrays of polygon, holes
  when Array === args[0] && Array === args[0][0] && Array === args[0][0][0] && Array === args[0][0][0][0]
    self.coordinates = Coordinate.from_array(*args)

  when Coordinate === args[0] # only one
    self.coordinates = [[Coordinate.from_array(args)]]

  when Array === args[0] # multiple?
    self.coordinates = [Coordinate.from_array(args)]

  when Polygon === args[0]
    self.coordinates = args.map &:coordinates

  else
    super *args
  end

  # must be an array of arrays of arrays of coordinates (whew!)
  unless Array === coordinates &&
         Array === coordinates[0] &&
         Array === coordinates[0][0] &&
         Terraformer::Coordinate === coordinates[0][0][0]
    raise ArgumentError.new 'invalid coordinates for Terraformer::MultiPolygon'
  end
end

Public Instance Methods

==(obj) click to toggle source
Calls superclass method Terraformer::Geometry#==
# File lib/terraformer/multi_polygon.rb, line 42
def == obj
  super obj do |o|
    equal = true
    ps = polygons
    ops = o.polygons
    ps.each_with_index do |p, i|
      equal = p == ops[i] rescue false
      break unless equal
    end
    equal
  end
end
contains?(obj) click to toggle source
# File lib/terraformer/multi_polygon.rb, line 55
def contains? obj
  polygons.any? {|p| p.contains? obj}
end
first_coordinate() click to toggle source
# File lib/terraformer/multi_polygon.rb, line 34
def first_coordinate
  coordinates[0][0][0]
end
polygons() click to toggle source
# File lib/terraformer/multi_polygon.rb, line 38
def polygons
  coordinates.map {|p| Polygon.new *p}
end
within?(obj) click to toggle source
# File lib/terraformer/multi_polygon.rb, line 59
def within? obj
  case obj
  when Polygon
    polygons.all? {|p| p.within? obj}
  when MultiPolygon
    polygons.all? {|p| obj.polygons.any? {|op| op.contains? p}}
  else
    raise ArgumentError.new "unsupported type: #{obj.type rescue obj.class}"
  end
end