Class: Geometry::Path

Inherits:
Object
  • Object
show all
Defined in:
lib/geometry/path.rb

Overview

An object representing a set of connected elements, each of which could be an Edge or an Arc. Unlike a Polygon, a Path is not guaranteed to be closed.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*args) ⇒ Path

Construct a new Path from Geometry::Points, Edges, and Arcs Successive Geometry::Points will be converted to Edges.



14
15
16
17
18
19
20
21
22
23
24
25
26
27
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
# File 'lib/geometry/path.rb', line 14

def initialize(*args)
    args.map! {|a| (a.is_a?(Array) or 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) or a.is_a?(Arc) }

    @elements = []

    first = args.shift
    push first if first.is_a?(Edge) or first.is_a?(Arc)

    args.reduce(first) do |previous, n|
	case n
	    when Point
		case previous
		    when Point	    then push Edge.new(previous, n)
		    when Arc, Edge  then push Edge.new(previous.last, n) unless previous.last == n
		end
		last
	    when Edge
		case previous
		    when Point	    then push Edge.new(previous, n.first)
		    when Arc, Edge  then push Edge.new(previous.last, n.first) unless previous.last == n.first
		end
		push(n).last
	    when Arc
		case previous
		    when Point
			if previous == n.first
			    raise ArgumentError, "Duplicated point before an Arc"
			else
			    push Edge.new(previous, n.first)
			end
		    when Arc, Edge
			push Edge.new(previous.last, n.first) unless previous.last == n.first
		end
		push(n).last
	    else
		raise ArgumentError, "Unsupported argument type: #{n}"
	end
    end
end

Instance Attribute Details

#elementsObject (readonly)

Returns the value of attribute elements.



10
11
12
# File 'lib/geometry/path.rb', line 10

def elements
  @elements
end

Instance Method Details

#lastGeometry

Returns The last element in the Geometry::Path.

Returns:



56
57
58
# File 'lib/geometry/path.rb', line 56

def last
    @elements.last
end

#push(arg) ⇒ Path

Append a new geometry element to the Geometry::Path

Returns:



62
63
64
65
# File 'lib/geometry/path.rb', line 62

def push(arg)
    @elements.push arg
    self
end