Class: Geometry::Path
- Inherits:
-
Object
- Object
- Geometry::Path
- Defined in:
- lib/geometry/path.rb
Overview
Instance Attribute Summary collapse
-
#elements ⇒ Object
readonly
Returns the value of attribute elements.
Attributes collapse
-
#last ⇒ Geometry
The last element in the Path.
-
#max ⇒ Point
The upper-right corner of the bounding rectangle that encloses the Path.
-
#min ⇒ Point
The lower-left corner of the bounding rectangle that encloses the Path.
-
#minmax ⇒ Array<Point>
The lower-left and upper-right corners of the enclosing bounding rectangle.
Instance Method Summary collapse
- #==(other) ⇒ Object
- #initialize(*args) ⇒ Path constructor
-
#push(arg) ⇒ Path
Append a new geometry element to the Path.
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
#elements ⇒ Object (readonly)
Returns the value of attribute elements.
10 11 12 |
# File 'lib/geometry/path.rb', line 10 def elements @elements end |
Instance Method Details
#==(other) ⇒ Object
55 56 57 58 59 60 61 |
# File 'lib/geometry/path.rb', line 55 def ==(other) if other.is_a?(Path) @elements == other.elements else super other end end |
#last ⇒ Geometry
Returns The last element in the Geometry::Path.
81 82 83 |
# File 'lib/geometry/path.rb', line 81 def last @elements.last end |
#max ⇒ Point
Returns The upper-right corner of the bounding rectangle that encloses the Geometry::Path.
66 67 68 |
# File 'lib/geometry/path.rb', line 66 def max elements.reduce(elements.first.max) {|memo, e| memo.max(e.max) } end |
#min ⇒ Point
Returns The lower-left corner of the bounding rectangle that encloses the Geometry::Path.
71 72 73 |
# File 'lib/geometry/path.rb', line 71 def min elements.reduce(elements.first.min) {|memo, e| memo.min(e.max) } end |
#minmax ⇒ Array<Point>
Returns The lower-left and upper-right corners of the enclosing bounding rectangle.
76 77 78 |
# File 'lib/geometry/path.rb', line 76 def minmax elements.reduce(elements.first.minmax) {|memo, e| [memo.first.min(e.min), memo.last.max(e.max)] } end |
#push(arg) ⇒ Path
Append a new geometry element to the Geometry::Path
89 90 91 92 |
# File 'lib/geometry/path.rb', line 89 def push(arg) @elements.push arg self end |