class GeometricPointInPolygon

Public Instance Methods

inside?() click to toggle source
# File lib/flash_math/modules/geometry/geometric_point_in_polygon.rb, line 4
def inside?
  point_location == :inside
end
on_the_boundary?() click to toggle source
# File lib/flash_math/modules/geometry/geometric_point_in_polygon.rb, line 12
def on_the_boundary?
  point_location == :on_the_boundary
end
outside?() click to toggle source
# File lib/flash_math/modules/geometry/geometric_point_in_polygon.rb, line 8
def outside?
  point_location == :outside
end
point_location() click to toggle source
# File lib/flash_math/modules/geometry/geometric_point_in_polygon.rb, line 16
def point_location
  return :outside unless bounding_box.contains?(point)
  return :on_the_boundary if point_is_vertex? || point_on_edge?

  intersection_count(choose_good_ray).odd? ? :inside : :outside
end

Private Instance Methods

choose_good_ray() click to toggle source
# File lib/flash_math/modules/geometry/geometric_point_in_polygon.rb, line 28
def choose_good_ray
  ray = random_ray
  while ! good_ray?(ray) do
    ray = random_ray
  end
  ray
end
good_ray?(ray) click to toggle source
# File lib/flash_math/modules/geometry/geometric_point_in_polygon.rb, line 36
def good_ray?(ray)
  edges.none? { |edge| edge.parallel_to?(ray) } && vertices.none? { |vertex| ray.contains_point?(vertex) }
end
intersection_count(ray) click to toggle source
# File lib/flash_math/modules/geometry/geometric_point_in_polygon.rb, line 40
def intersection_count(ray)
  edges.select { |edge| edge.intersects_with?(ray) }.size
end
point_is_vertex?() click to toggle source
# File lib/flash_math/modules/geometry/geometric_point_in_polygon.rb, line 44
def point_is_vertex?
  vertices.any? { |vertex| vertex == point }
end
point_on_edge?() click to toggle source
# File lib/flash_math/modules/geometry/geometric_point_in_polygon.rb, line 48
def point_on_edge?
  edges.any? { |edge| edge.contains_point?(point) }
end
random_ray() click to toggle source
# File lib/flash_math/modules/geometry/geometric_point_in_polygon.rb, line 52
def random_ray
  random_direction = rand * (2 * Math::PI)

  ray_endpoint = GeometricPoint.new(sufficient_ray_radius * Math.cos(random_direction), sufficient_ray_radius * Math.sin(random_direction))
  GeometricSegment.new(point, ray_endpoint)
end
sufficient_ray_radius() click to toggle source
# File lib/flash_math/modules/geometry/geometric_point_in_polygon.rb, line 59
def sufficient_ray_radius
  @sufficient_ray_radius ||= bounding_box.diagonal.length * 2
end