Class: Dieses::Geometry::Rect
Overview
codebeat:disable
Direct Known Subclasses
Defined Under Namespace
Modules: Predicate
Constant Summary collapse
Instance Attribute Summary collapse
-
#height ⇒ Object
readonly
Returns the value of attribute height.
-
#position ⇒ Object
readonly
Returns the value of attribute position.
-
#width ⇒ Object
readonly
Returns the value of attribute width.
Attributes inherited from Element
Instance Method Summary collapse
- #align(other, alignment = :center) ⇒ Object
-
#angle ⇒ Object
codebeat:enable.
- #bbox ⇒ Object
-
#initialize(width, height, position: Point.origin) ⇒ Rect
constructor
A new instance of Rect.
-
#intersect(equation, precision: nil) ⇒ Object
codebeat:disable.
- #orient(new_orientation) ⇒ Object
- #orientation ⇒ Object
- #shrink(width: 0, height: 0) ⇒ Object
- #to_h ⇒ Object
- #to_s ⇒ Object
-
#to_svgf ⇒ Object
codebeat:disable.
- #translate(x: 0, y: 0) ⇒ Object
Methods included from Predicate
#cover?, #inside?, #onto?, #outside?
Methods inherited from Element
#attr, #classify, #eql?, #to_svg
Constructor Details
#initialize(width, height, position: Point.origin) ⇒ Rect
Returns a new instance of Rect.
22 23 24 25 26 27 28 29 30 |
# File 'lib/dieses/geometry/rect.rb', line 22 def initialize(width, height, position: Point.origin) @width = width.to_f @height = height.to_f @position = Point.cast(position) @corner = calculate_corner @side = calculate_side super() end |
Instance Attribute Details
#height ⇒ Object (readonly)
Returns the value of attribute height.
20 21 22 |
# File 'lib/dieses/geometry/rect.rb', line 20 def height @height end |
#position ⇒ Object (readonly)
Returns the value of attribute position.
20 21 22 |
# File 'lib/dieses/geometry/rect.rb', line 20 def position @position end |
#width ⇒ Object (readonly)
Returns the value of attribute width.
20 21 22 |
# File 'lib/dieses/geometry/rect.rb', line 20 def width @width end |
Instance Method Details
#align(other, alignment = :center) ⇒ Object
67 68 69 70 71 |
# File 'lib/dieses/geometry/rect.rb', line 67 def align(other, alignment = :center) raise ArgumentError, "No such alignment type: #{alignment}" unless Align.respond_to? alignment self.class.new other.width, other.height, position: Align.public_send(alignment, self, other).approx end |
#angle ⇒ Object
codebeat:enable
130 131 132 |
# File 'lib/dieses/geometry/rect.rb', line 130 def angle Math.atan(height / width) end |
#bbox ⇒ Object
134 135 136 |
# File 'lib/dieses/geometry/rect.rb', line 134 def bbox BoundingBox.new(@corner.values.min, @corner.values.max) end |
#intersect(equation, precision: nil) ⇒ Object
codebeat:disable
115 116 117 118 119 120 121 122 123 124 125 126 127 |
# File 'lib/dieses/geometry/rect.rb', line 115 def intersect(equation, precision: nil) points = Side.members .map { |line| public_send(line).intersect(equation).approx(precision) } .uniq .select { |intersect| onto?(intersect) } .sort return if points.empty? raise "Unexpected number of intersection points: #{points.size}" unless points.size <= 2 Line.new((starting = points.shift), (points.shift || starting)) end |
#orient(new_orientation) ⇒ Object
84 85 86 87 88 89 |
# File 'lib/dieses/geometry/rect.rb', line 84 def orient(new_orientation) new_orientation = Orientation.(new_orientation) return self if orientation == new_orientation self.class.new height, width, position: position end |
#orientation ⇒ Object
75 76 77 78 79 80 81 82 |
# File 'lib/dieses/geometry/rect.rb', line 75 def orientation value = if Support.almost_greater_than(width, height) :landscape else :portrait end Orientation.(value) end |
#shrink(width: 0, height: 0) ⇒ Object
36 37 38 |
# File 'lib/dieses/geometry/rect.rb', line 36 def shrink(width: 0, height: 0) self.class.new self.width - width, self.height - height, position: position end |
#to_h ⇒ Object
145 146 147 |
# File 'lib/dieses/geometry/rect.rb', line 145 def to_h { width: width, height: height, **position.to_h } end |
#to_s ⇒ Object
138 139 140 141 142 143 |
# File 'lib/dieses/geometry/rect.rb', line 138 def to_s repr = "R(#{width}, #{height})" return repr if position == Point.origin "#{repr}@#{position}" end |
#to_svgf ⇒ Object
codebeat:disable
150 151 152 153 154 |
# File 'lib/dieses/geometry/rect.rb', line 150 def to_svgf <<~SVG <rect width="#{Support.approx(width)}" height="#{Support.approx(height)}" x="#{Support.approx(position.x)}" y="#{Support.approx(position.y)}" %{attributes}/> SVG end |
#translate(x: 0, y: 0) ⇒ Object
32 33 34 |
# File 'lib/dieses/geometry/rect.rb', line 32 def translate(x: 0, y: 0) self.class.new width, height, position: position.translate(x: x, y: y) end |