Class: Geometry::Square
- Inherits:
-
Object
- Object
- Geometry::Square
- Includes:
- ClusterFactory
- Defined in:
- lib/geometry/square.rb
Overview
The Square class cluster is like the Rectangle class cluster, but not longer in one direction.
Constructors
Square.new from:[1,2], to:[2,3] # Using two corners
Square.new origin:[3,4], size:5 # Using an origin point and a size
Square.new center:[5,5], size:5 # Using a center point and a size
Square.new size:5 # Centered on the origin
Direct Known Subclasses
Instance Attribute Summary collapse
- #closed? ⇒ Boolean
- #edges ⇒ Object readonly
- #origin ⇒ Object
-
#points ⇒ Array<Point>
The Square‘s four points (clockwise).
Class Method Summary collapse
-
.new(: origin, : size) ⇒ CenteredSquare
Creates a Square with the given origin and size.
Instance Method Summary collapse
- #height ⇒ Object
- #initialize(options = {}) ⇒ Square constructor
-
#max ⇒ Point
The upper right corner of the bounding Rectangle.
-
#min ⇒ Point
The lower left corner of the bounding Rectangle.
-
#minmax ⇒ Array<Point>
The lower left and upper right corners of the bounding Rectangle.
- #path ⇒ Path
-
#vertices ⇒ Object
Returns the value of attribute points.
- #width ⇒ Object
Methods included from ClusterFactory
Constructor Details
#initialize(options = {}) ⇒ Square
Creates a Geometry::Square given two Points
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
# File 'lib/geometry/square.rb', line 53 def initialize(={}) origin = [:from] || [:origin] origin = origin ? Point[origin] : PointZero.new if .has_key? :to point1 = [:to] end point1 = Point[point1] raise(ArgumentError, "Point sizes must match (#{origin.size} != #{point1.size})") unless origin.is_a?(PointZero) || (origin.size == point1.size) # Reorder the points to get lower-left and upper-right minx, maxx = [origin.x, point1.x].minmax miny, maxy = [origin.y, point1.y].minmax @points = [Point[minx, miny], Point[maxx, maxy]] raise(NotSquareError) if height != width end |
Instance Attribute Details
#closed? ⇒ Boolean
75 76 77 |
# File 'lib/geometry/square.rb', line 75 def closed? true end |
#edges ⇒ Object (readonly)
81 82 83 |
# File 'lib/geometry/square.rb', line 81 def edges (points + [points.first]).each_cons(2).map {|v1,v2| Edge.new v1, v2} end |
#origin ⇒ Object
102 103 104 |
# File 'lib/geometry/square.rb', line 102 def origin @points.first end |
#points ⇒ Array<Point>
Returns The Geometry::Square‘s four points (clockwise).
21 22 23 |
# File 'lib/geometry/square.rb', line 21 def points @points end |
Class Method Details
.new(: origin, : size) ⇒ CenteredSquare
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
# File 'lib/geometry/square.rb', line 29 def self.new(*args) , args = args.partition {|a| a.is_a? Hash} = .reduce({}, :merge) if .key?(:size) unless [:size].is_a? Numeric raise NotSquareError, 'Size must be a square' unless [:size].all? {|a| a == [:size].first} [:size] = [:size].first end if .key? :origin SizedSquare.new([:origin], [:size]) else CenteredSquare.new([:center] || PointZero.new, [:size]) end elsif .key?(:from) and .key?(:to) original_new(from: [:from], to: [:to]) end end |
Instance Method Details
#height ⇒ Object
112 113 114 115 |
# File 'lib/geometry/square.rb', line 112 def height min, max = @points.minmax {|a,b| a.y <=> b.y} max.y - min.y end |
#max ⇒ Point
Returns The upper right corner of the bounding Rectangle.
86 87 88 |
# File 'lib/geometry/square.rb', line 86 def max @points.last end |
#min ⇒ Point
Returns The lower left corner of the bounding Rectangle.
91 92 93 |
# File 'lib/geometry/square.rb', line 91 def min @points.first end |
#minmax ⇒ Array<Point>
Returns The lower left and upper right corners of the bounding Rectangle.
96 97 98 |
# File 'lib/geometry/square.rb', line 96 def minmax [self.min, self.max] end |
#path ⇒ Path
Returns A closed Path that traces the boundary of the Geometry::Square clockwise, starting from the lower-left.
124 125 126 |
# File 'lib/geometry/square.rb', line 124 def path Path.new(*self.points, self.points.first) end |
#vertices ⇒ Object
Returns the value of attribute points.
22 23 24 |
# File 'lib/geometry/square.rb', line 22 def points @points end |
#width ⇒ Object
117 118 119 120 |
# File 'lib/geometry/square.rb', line 117 def width min, max = @points.minmax {|a,b| a.x <=> b.x} max.x - min.x end |