Class: Sevgi::Sundries::Tile
- Inherits:
-
Object
- Object
- Sevgi::Sundries::Tile
- Includes:
- Enumerable
- Defined in:
- lib/sevgi/sundries/tile.rb
Overview
Repeats a geometry element over a rectangular row and column layout.
The source element's bounding-box width and height become the cell pitch.
Indexing is row-first: tile[row][column]. Generated cells and collection
snapshots are immutable geometry values; no SVG elements are created.
Direct Known Subclasses
Instance Attribute Summary collapse
-
#element ⇒ Sevgi::Geometry::Element
readonly
Returns the source geometry element.
-
#nx ⇒ Integer
readonly
Returns the number of columns.
-
#ny ⇒ Integer
readonly
Returns the number of rows.
-
#position ⇒ Sevgi::Geometry::Point
readonly
Returns the tile origin.
Instance Method Summary collapse
-
#[](i) ⇒ Array<Sevgi::Geometry::Element>?
Returns a row by index.
-
#box ⇒ Sevgi::Geometry::Rect
Returns the bounding rectangle of the whole tile.
-
#cell ⇒ Sevgi::Geometry::Element
Returns the first cell in the tile.
-
#col(i = 0) ⇒ Array<Sevgi::Geometry::Element>?
Returns a column by index.
-
#colbox(i = 0) ⇒ Sevgi::Geometry::Rect
Returns the bounding rectangle of a column.
-
#cols ⇒ Array<Array<Sevgi::Geometry::Element>>
Returns cells grouped by column.
-
#each {|row| ... } ⇒ Enumerator, Array<Array<Sevgi::Geometry::Element>>
(also: #each_row)
Iterates over rows.
-
#each_col {|column| ... } ⇒ Enumerator, Array<Array<Sevgi::Geometry::Element>>
Iterates over columns.
-
#initialize(element, position: Geometry::Origin, nx: 1, ny: 1) ⇒ void
constructor
Creates a tile from a source geometry element.
-
#row(i = 0) ⇒ Array<Sevgi::Geometry::Element>?
Returns a row by index.
-
#rowbox(i = 0) ⇒ Sevgi::Geometry::Rect
Returns the bounding rectangle of a row.
-
#rows ⇒ Array<Array<Sevgi::Geometry::Element>>
Returns cells grouped by row.
Constructor Details
#initialize(element, position: Geometry::Origin, nx: 1, ny: 1) ⇒ void
Creates a tile from a source geometry element.
53 54 55 56 57 58 59 60 61 62 63 |
# File 'lib/sevgi/sundries/tile.rb', line 53 def initialize(element, position: Geometry::Origin, nx: 1, ny: 1) ArgumentError.("Must be an Element object: #{element}") unless element.is_a?(Geometry::Element) ArgumentError.("Tile nx must be positive") unless nx.is_a?(::Integer) && nx.positive? ArgumentError.("Tile ny must be positive") unless ny.is_a?(::Integer) && ny.positive? @element = element @position = self.class.send(:position, position) @nx = nx @ny = ny end |
Instance Attribute Details
#element ⇒ Sevgi::Geometry::Element (readonly)
Returns the source geometry element.
30 31 32 |
# File 'lib/sevgi/sundries/tile.rb', line 30 def element @element end |
#nx ⇒ Integer (readonly)
Returns the number of columns.
38 39 40 |
# File 'lib/sevgi/sundries/tile.rb', line 38 def nx @nx end |
#ny ⇒ Integer (readonly)
Returns the number of rows.
42 43 44 |
# File 'lib/sevgi/sundries/tile.rb', line 42 def ny @ny end |
#position ⇒ Sevgi::Geometry::Point (readonly)
Returns the tile origin.
34 35 36 |
# File 'lib/sevgi/sundries/tile.rb', line 34 def position @position end |
Instance Method Details
#[](i) ⇒ Array<Sevgi::Geometry::Element>?
Returns a row by index.
68 |
# File 'lib/sevgi/sundries/tile.rb', line 68 def [](i) = rows[i] |
#box ⇒ Sevgi::Geometry::Rect
Returns the bounding rectangle of the whole tile.
72 |
# File 'lib/sevgi/sundries/tile.rb', line 72 def box = @box ||= Geometry::Rect[nx * element.box.width, ny * element.box.height, position:] |
#cell ⇒ Sevgi::Geometry::Element
Returns the first cell in the tile.
76 |
# File 'lib/sevgi/sundries/tile.rb', line 76 def cell = row.first |
#col(i = 0) ⇒ Array<Sevgi::Geometry::Element>?
Returns a column by index.
91 |
# File 'lib/sevgi/sundries/tile.rb', line 91 def col(i = 0) = cols[i] |
#colbox(i = 0) ⇒ Sevgi::Geometry::Rect
Returns the bounding rectangle of a column.
81 |
# File 'lib/sevgi/sundries/tile.rb', line 81 def colbox(i = 0) = Geometry::Rect[element.box.width, box.height, position: coordinate(0, i)] |
#cols ⇒ Array<Array<Sevgi::Geometry::Element>>
Returns cells grouped by column. The outer and nested collections are frozen and must be treated as immutable.
86 |
# File 'lib/sevgi/sundries/tile.rb', line 86 def cols = @cols ||= rows.transpose.map(&:freeze).freeze |
#each {|row| ... } ⇒ Enumerator, Array<Array<Sevgi::Geometry::Element>> Also known as: each_row
Iterates over rows.
98 |
# File 'lib/sevgi/sundries/tile.rb', line 98 def each(...) = rows.each(...) |
#each_col {|column| ... } ⇒ Enumerator, Array<Array<Sevgi::Geometry::Element>>
Iterates over columns.
105 |
# File 'lib/sevgi/sundries/tile.rb', line 105 def each_col(...) = cols.each(...) |
#row(i = 0) ⇒ Array<Sevgi::Geometry::Element>?
Returns a row by index.
110 |
# File 'lib/sevgi/sundries/tile.rb', line 110 def row(i = 0) = rows[i] |
#rowbox(i = 0) ⇒ Sevgi::Geometry::Rect
Returns the bounding rectangle of a row.
115 |
# File 'lib/sevgi/sundries/tile.rb', line 115 def rowbox(i = 0) = Geometry::Rect[box.width, element.box.height, position: coordinate(i)] |
#rows ⇒ Array<Array<Sevgi::Geometry::Element>>
Returns cells grouped by row. The outer and nested collections are frozen and must be treated as immutable.
120 |
# File 'lib/sevgi/sundries/tile.rb', line 120 def rows = @rows ||= (0...ny).map { |i| (0...nx).map { |j| element.at(coordinate(i, j)) }.freeze }.freeze |