class GreinerHormann::Vertex

Attributes

corresponding[RW]
distance[RW]
is_entry[RW]
is_intersection[RW]
next_node[RW]
prev_node[RW]
visited[RW]
x[RW]
y[RW]

Public Class Methods

create_intersection(x, y, distance) click to toggle source
# File lib/greiner_hormann/vertex.rb, line 15
def self.create_intersection(x, y, distance)
  vert = Vertex.new(x, y)
  vert.distance = distance
  vert.is_intersection = true
  vert.is_entry = false
  vert
end
new(x, y) click to toggle source
# File lib/greiner_hormann/vertex.rb, line 5
def initialize(x, y)
  self.x = x
  self.y = y

  self.next_node = self.prev_node = self.corresponding = nil
  self.distance = 0.0
  self.is_entry = true
  self.is_intersection = self.visited = false
end

Public Instance Methods

==(v) click to toggle source
# File lib/greiner_hormann/vertex.rb, line 30
def ==(v)
  x == v.x && y == v.y
end
equals(v) click to toggle source
# File lib/greiner_hormann/vertex.rb, line 34
def equals(v)
  self == v
end
is_inside(poly) click to toggle source
# File lib/greiner_hormann/vertex.rb, line 38
def is_inside(poly)
  odd_nodes = false
  vert = poly.first
  next_n = vert.next_node

  loop do
    if (vert.y < y && next_n.y >= y || next_n.y < y && vert.y >= y) && (vert.x <= x || next_n.x <= x)
      odd_nodes ^= vert.x + (y - vert.y) / (next_n.y - vert.y) * (next_n.x - vert.x) < x
    end

    vert = vert.next_node
    next_n = vert.next_node || poly.first

    break if vert == poly.first
  end
  odd_nodes
end
visit() click to toggle source
# File lib/greiner_hormann/vertex.rb, line 23
def visit
  self.visited = true
  if !corresponding.nil? && !corresponding.visited
    corresponding.visit
  end
end