Method: Geometry::Polyline#initialize

Defined in:
lib/geometry/polyline.rb

#initialize(Edge, Edge, ...) ⇒ Polyline #initialize(Point, Point, ...) ⇒ Polyline

Note:

The constructor will try to convert all of its arguments into Geometry::Points and Edges. Then successive Geometry::Points will be collpased into Edges. Successive Edges that share a common vertex will be added to the new Geometry::Polyline. If there’s a gap between Edges it will be automatically filled with a new Edge.

Construct a new Polyline from Points and/or Edges

Overloads:

  • #initialize(Edge, Edge, ...) ⇒ Polyline
  • #initialize(Point, Point, ...) ⇒ Polyline


28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/geometry/polyline.rb', line 28

def initialize(*args)
    args.map! {|a| (a.is_a?(Array) || a.is_a?(Vector)) ? Point[a] : a}
    args.each {|a| raise ArgumentError, "Unknown argument type #{a.class}" unless a.is_a?(Point) or a.is_a?(Edge) }

    @edges = [];
    @vertices = [];

    first = args.shift
    if first.is_a?(Point)
  @vertices.push first
    elsif first.is_a?(Edge)
  @edges.push first
  @vertices.push *(first.to_a)
    end

    args.reduce(@vertices.last) do |previous,n|
  if n.is_a?(Point)
      if n == previous # Ignore repeated Points
    previous
      else
    if @edges.last
        new_edge = Edge.new(previous, n)
        if @edges.last.parallel?(new_edge)
      popped_edge = @edges.pop   # Remove the previous Edge
      @vertices.pop(@edges.size ? 1 : 2) # Remove the now unused vertex, or vertices
      if n == popped_edge.first
          popped_edge.first
      else
          push_edge Edge.new(popped_edge.first, n)
          push_vertex popped_edge.first
          push_vertex n
          n
      end
        else
      push_edge Edge.new(previous, n)
      push_vertex n
      n
        end
    else
        push_edge Edge.new(previous, n)
        push_vertex n
        n
    end
      end
  elsif n.is_a?(Edge)
      if previous == n.first
    push_edge n
    push_vertex n.last
      elsif previous == n.last
    push_edge n.reverse!
    push_vertex n.last
      else
    e = Edge.new(previous, n.first)
    push_edge e, n
    push_vertex *(e.to_a), *(n.to_a)
      end
      n.last
  end
    end
end