Class: Geometry::Rectangle
- Inherits:
-
Object
- Object
- Geometry::Rectangle
- Includes:
- ClusterFactory
- Defined in:
- lib/geometry/rectangle.rb
Overview
The Rectangle class cluster represents your typical arrangement of 4 corners and 4 sides.
Usage
Constructors
rect = Rectangle.new [1,2], [2,3] # Using two corners
rect = Rectangle.new from:[1,2], to:[2,3] # Using two corners
rect = Rectangle.new center:[1,2], size:[1,1] # Using a center point and a size
rect = Rectangle.new origin:[1,2], size:[1,1] # Using an origin point and a size
rect = Rectangle.new size: [10, 20] # origin = [0,0], size = [10, 20]
rect = Rectangle.new size: Size[10, 20] # origin = [0,0], size = [10, 20]
rect = Rectangle.new width: 10, height: 20 # origin = [0,0], size = [10, 20]
Direct Known Subclasses
Accessors collapse
-
#center ⇒ Point
readonly
The Rectangle‘s center.
-
#height ⇒ Number
readonly
Height of the Rectangle.
-
#origin ⇒ Point
readonly
The Rectangle‘s origin.
-
#width ⇒ Number
readonly
Width of the Rectangle.
Instance Attribute Summary collapse
- #size ⇒ Size readonly
Accessors collapse
-
#bounds ⇒ Rectangle
The smallest axis-aligned Rectangle that bounds the receiver.
-
#edges ⇒ Array<Edge>
The Rectangle‘s four edges (counterclockwise).
-
#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.
-
#points ⇒ Array<Point>
The Rectangle‘s four points (counterclockwise).
Class Method Summary collapse
Instance Method Summary collapse
- #eql?(other) ⇒ Boolean (also: #==)
- #initialize(point0, point1) ⇒ Rectangle constructor
-
#inset(*args) ⇒ Object
Create a new Rectangle from the receiver that’s inset by the given amount.
Methods included from ClusterFactory
Constructor Details
#initialize(point0, point1) ⇒ Rectangle
Creates a Geometry::Rectangle using the given Points
@param [Point] point0 A corner (ie. bottom-left)
@param [Point] point1 The other corner (ie. top-right)
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
# File 'lib/geometry/rectangle.rb', line 91 def initialize(point0, point1) point0 = Point[point0] point1 = Point[point1] raise(ArgumentError, "Point sizes must match") unless point0.size == point1.size # Reorder the points to get lower-left and upper-right if (point0.x > point1.x) && (point0.y > point1.y) point0, point1 = point1, point0 else p0x, p1x = [point0.x, point1.x].minmax p0y, p1y = [point0.y, point1.y].minmax point0 = Point[p0x, p0y] point1 = Point[p1x, p1y] end @points = [point0, point1] end |
Instance Attribute Details
#center ⇒ Point (readonly)
Returns The Geometry::Rectangle‘s center.
29 30 31 |
# File 'lib/geometry/rectangle.rb', line 29 def center @center end |
#height ⇒ Number (readonly)
Returns Height of the Geometry::Rectangle.
31 32 33 |
# File 'lib/geometry/rectangle.rb', line 31 def height @height end |
#origin ⇒ Point (readonly)
Returns The Geometry::Rectangle‘s origin.
33 34 35 |
# File 'lib/geometry/rectangle.rb', line 33 def origin @origin end |
#size ⇒ Size (readonly)
Returns The Size of the Geometry::Rectangle.
35 36 37 |
# File 'lib/geometry/rectangle.rb', line 35 def size @size end |
#width ⇒ Number (readonly)
Returns Width of the Geometry::Rectangle.
37 38 39 |
# File 'lib/geometry/rectangle.rb', line 37 def width @width end |
Class Method Details
.new(width, height) ⇒ CenteredRectangle .new(size) ⇒ CenteredRectangle .new(point0, point1) ⇒ Object .new(origin, size) ⇒ SizedRectangle .new(left, bottom, right, top) ⇒ Object
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
# File 'lib/geometry/rectangle.rb', line 63 def self.new(*args) , args = args.partition {|a| a.is_a? Hash} = .reduce({}, :merge) if .has_key?(:size) if .has_key?(:center) CenteredRectangle.new(center: [:center], size: [:size]) elsif .has_key?(:origin) SizedRectangle.new(origin: [:origin], size: [:size]) else SizedRectangle.new(size: [:size]) end elsif .has_key?(:from) and .has_key?(:to) original_new([:from], [:to]) elsif .has_key?(:height) and .has_key?(:width) SizedRectangle.new(height: [:height], width: [:width]) elsif (2==args.count) and (args.all? {|a| a.is_a?(Array) || a.is_a?(Point) }) original_new(*args) elsif .empty? raise ArgumentError, "#{self} arguments must be named, not: #{args}" else raise ArgumentError, "Bad Rectangle arguments: #{args}, #{}" end end |
Instance Method Details
#bounds ⇒ Rectangle
Returns The smallest axis-aligned Geometry::Rectangle that bounds the receiver.
116 117 118 |
# File 'lib/geometry/rectangle.rb', line 116 def bounds return Rectangle.new(self.min, self.max) end |
#edges ⇒ Array<Edge>
Returns The Geometry::Rectangle‘s four edges (counterclockwise).
127 128 129 130 131 132 133 134 135 |
# File 'lib/geometry/rectangle.rb', line 127 def edges point0, point2 = *@points point1 = Point[point2.x, point0.y] point3 = Point[point0.x, point2.y] [Edge.new(point0, point1), Edge.new(point1, point2), Edge.new(point2, point3), Edge.new(point3, point0)] end |
#eql?(other) ⇒ Boolean Also known as: ==
108 109 110 |
# File 'lib/geometry/rectangle.rb', line 108 def eql?(other) self.points == other.points end |
#inset(x, y) ⇒ Object #inset(top, left, bottom, right) ⇒ Object #inset(x, y) ⇒ Object #inset(top, left, bottom, right) ⇒ Object
Create a new Geometry::Rectangle from the receiver that’s inset by the given amount
188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 |
# File 'lib/geometry/rectangle.rb', line 188 def inset(*args) , args = args.partition {|a| a.is_a? Hash} = .reduce({}, :merge) raise ArumentError, "Can't specify both arguments and options" if !args.empty? && !.empty? if 1 == args.size distance = args.shift Rectangle.new from:(min + distance), to:(max - distance) elsif 2 == args.size distance = Point[*args] Rectangle.new from:(min + distance), to:(max - distance) elsif 4 == args.size top, left, bottom, right = *args Rectangle.new from:(min + Point[left, bottom]), to:(max - Point[right, top]) elsif [:x] && [:y] distance = Point[[:x], [:y]] Rectangle.new from:(min + distance), to:(max - distance) elsif [:top] && [:left] && [:bottom] && [:right] Rectangle.new from:(min + Point[[:left], [:bottom]]), to:(max - Point[[:right], [:top]]) end end |
#max ⇒ Point
Returns The upper right corner of the bounding Geometry::Rectangle.
138 139 140 |
# File 'lib/geometry/rectangle.rb', line 138 def max @points.last end |
#min ⇒ Point
Returns The lower left corner of the bounding Geometry::Rectangle.
143 144 145 |
# File 'lib/geometry/rectangle.rb', line 143 def min @points.first end |
#minmax ⇒ Array<Point>
Returns The lower left and upper right corners of the bounding Geometry::Rectangle.
148 149 150 |
# File 'lib/geometry/rectangle.rb', line 148 def minmax [self.min, self.max] end |
#points ⇒ Array<Point>
Returns The Geometry::Rectangle‘s four points (counterclockwise).
153 154 155 156 157 158 |
# File 'lib/geometry/rectangle.rb', line 153 def points point0, point2 = *@points point1 = Point[point2.x, point0.y] point3 = Point[point0.x, point2.y] [point0, point1, point2, point3] end |