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
- #options ⇒ Object
- #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)
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
# File 'lib/geometry/rectangle.rb', line 96 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 |
#options ⇒ Object
39 40 41 42 |
# File 'lib/geometry/rectangle.rb', line 39 def = {} if ! 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
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
# File 'lib/geometry/rectangle.rb', line 68 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}, #{options}" end end |
Instance Method Details
#bounds ⇒ Rectangle
Returns The smallest axis-aligned Geometry::Rectangle that bounds the receiver.
121 122 123 |
# File 'lib/geometry/rectangle.rb', line 121 def bounds return Rectangle.new(self.min, self.max) end |
#edges ⇒ Array<Edge>
Returns The Geometry::Rectangle‘s four edges (counterclockwise).
132 133 134 135 136 137 138 139 140 |
# File 'lib/geometry/rectangle.rb', line 132 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: ==
113 114 115 |
# File 'lib/geometry/rectangle.rb', line 113 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
193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 |
# File 'lib/geometry/rectangle.rb', line 193 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.
143 144 145 |
# File 'lib/geometry/rectangle.rb', line 143 def max @points.last end |
#min ⇒ Point
Returns The lower left corner of the bounding Geometry::Rectangle.
148 149 150 |
# File 'lib/geometry/rectangle.rb', line 148 def min @points.first end |
#minmax ⇒ Array<Point>
Returns The lower left and upper right corners of the bounding Geometry::Rectangle.
153 154 155 |
# File 'lib/geometry/rectangle.rb', line 153 def minmax [self.min, self.max] end |
#points ⇒ Array<Point>
Returns The Geometry::Rectangle‘s four points (counterclockwise).
158 159 160 161 162 163 |
# File 'lib/geometry/rectangle.rb', line 158 def points point0, point2 = *@points point1 = Point[point2.x, point0.y] point3 = Point[point0.x, point2.y] [point0, point1, point2, point3] end |