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 {Point}s will be converted to {Edge}s.


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