grid_generator 0.2.23 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/lib/grid_generator/face_parser.rb +1 -1
- data/lib/grid_generator/megaminx/face_element_factory.rb +4 -3
- data/lib/grid_generator/megaminx/face_projection.rb +13 -19
- data/lib/grid_generator/rotator.rb +1 -0
- data/lib/grid_generator/version.rb +1 -1
- data/lib/grid_generator.rb +0 -25
- metadata +2 -11
- data/lib/grid_generator/arrows/arrow.rb +0 -29
- data/lib/grid_generator/arrows/diagonal_down_arrow.rb +0 -65
- data/lib/grid_generator/arrows/diagonal_up_arrow.rb +0 -66
- data/lib/grid_generator/arrows/horizontal_arrow.rb +0 -66
- data/lib/grid_generator/arrows/vertical_arrow.rb +0 -66
- data/lib/grid_generator/megaminx/common.rb +0 -95
- data/lib/grid_generator/megaminx/element_factory.rb +0 -52
- data/lib/grid_generator/megaminx/face.rb +0 -79
- data/lib/grid_generator/megaminx/front_face.rb +0 -12
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: d75cdb06a79ebb644afccc577353a18b2a7f999251ffffd6f1f7617b08c23745
         | 
| 4 | 
            +
              data.tar.gz: fb3fc73597223fed891b6857250e217f9c4ca057e1795574b2ae1a9fd2ce1c41
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 06f2a4c827b2710abc6a379f6a45360a7caabafa4b0905f466e975968c0a622bb1f87296d7409b6225dabc7f807f126b4c93633af4b8a449830eb27703a5aee7
         | 
| 7 | 
            +
              data.tar.gz: 1cb5b6a79655216376731edcd9724ceb9dd9cb5e6236df9cab39c8e048754a0aca33a17413a71d87aeb8985c48a74ad0500ac8f1035b2c7784a948db9b3f3976
         | 
    
        data/Gemfile.lock
    CHANGED
    
    
| @@ -3,7 +3,7 @@ require_relative '../face_parser' | |
| 3 3 | 
             
            module GridGenerator
         | 
| 4 4 | 
             
              module Megaminx
         | 
| 5 5 | 
             
                class FaceElementFactory
         | 
| 6 | 
            -
                  def initialize(x:, y:, index:, face_points: , face_lines:, face:)
         | 
| 6 | 
            +
                  def initialize(x:, y:, index:, face_points: , face_lines:, face:, rotator: )
         | 
| 7 7 | 
             
                    @x, @y = x, y
         | 
| 8 8 | 
             
                    @index = index
         | 
| 9 9 | 
             
                    @face_points = face_points
         | 
| @@ -11,9 +11,10 @@ module GridGenerator | |
| 11 11 | 
             
                    face_attr = FaceParser.new(face).parse
         | 
| 12 12 | 
             
                    @colour = face_attr && face_attr[:colour]
         | 
| 13 13 | 
             
                    @opacity = face_attr && face_attr[:opacity]
         | 
| 14 | 
            +
                    @rotator = rotator 
         | 
| 14 15 | 
             
                  end
         | 
| 15 16 |  | 
| 16 | 
            -
                  attr_reader :x, :y, :index, :face_points, :face_lines, :colour, :opacity 
         | 
| 17 | 
            +
                  attr_reader :x, :y, :index, :face_points, :face_lines, :colour, :opacity, :rotator 
         | 
| 17 18 |  | 
| 18 19 | 
             
                  def offset
         | 
| 19 20 | 
             
                    Matrix.column_vector([x, y])
         | 
| @@ -81,7 +82,7 @@ module GridGenerator | |
| 81 82 | 
             
                      end
         | 
| 82 83 | 
             
                    end
         | 
| 83 84 |  | 
| 84 | 
            -
                    all_points.map { |p| p + offset }
         | 
| 85 | 
            +
                    all_points.map { |p| rotator.rotate(p) + offset }
         | 
| 85 86 | 
             
                  end
         | 
| 86 87 |  | 
| 87 88 | 
             
                  def build
         | 
| @@ -99,12 +99,8 @@ module GridGenerator | |
| 99 99 |  | 
| 100 100 | 
             
                  def outside_pentagon_points
         | 
| 101 101 | 
             
                    @outside_pentagon_points ||= (0..4).map do |i|
         | 
| 102 | 
            -
                       | 
| 103 | 
            -
             | 
| 104 | 
            -
                      else
         | 
| 105 | 
            -
                        rotator = GridGenerator::Rotator.new(angle: Math::PI * i * 0.4, rotation_point: rotation_point)
         | 
| 106 | 
            -
                        top_right_pentagon_points.map { |p| rotator.rotate(p) } 
         | 
| 107 | 
            -
                      end
         | 
| 102 | 
            +
                      rotator = GridGenerator::Rotator.new(angle: Math::PI * i * 0.4, rotation_point: rotation_point)
         | 
| 103 | 
            +
                      top_right_pentagon_points.map { |p| rotator.rotate(p) } 
         | 
| 108 104 | 
             
                    end
         | 
| 109 105 | 
             
                  end
         | 
| 110 106 |  | 
| @@ -138,12 +134,8 @@ module GridGenerator | |
| 138 134 |  | 
| 139 135 | 
             
                  def outside_face_lines_raw
         | 
| 140 136 | 
             
                    @outside_face_lines_raw ||= (0..4).map do |i|
         | 
| 141 | 
            -
                       | 
| 142 | 
            -
             | 
| 143 | 
            -
                      else
         | 
| 144 | 
            -
                        rotator = GridGenerator::Rotator.new(angle: Math::PI * i * 0.4, rotation_point: rotation_point)
         | 
| 145 | 
            -
                        top_right_face_lines_raw.map { |l| rotator.rotate(l) } 
         | 
| 146 | 
            -
                      end
         | 
| 137 | 
            +
                      rotator = GridGenerator::Rotator.new(angle: Math::PI * i * 0.4, rotation_point: rotation_point)
         | 
| 138 | 
            +
                      top_right_face_lines_raw.map { |l| rotator.rotate(l) } 
         | 
| 147 139 | 
             
                    end
         | 
| 148 140 | 
             
                  end
         | 
| 149 141 |  | 
| @@ -154,31 +146,31 @@ module GridGenerator | |
| 154 146 |  | 
| 155 147 | 
             
                  # for svg
         | 
| 156 148 | 
             
                  def decagon_points_string
         | 
| 157 | 
            -
                    decagon_points.map { |p| p + offset }.map { |p| "#{p[0,0].round},#{p[1,0].round}" }.join(' ')
         | 
| 149 | 
            +
                    decagon_points.map { |p| offset_rotator.rotate(p) + offset }.map { |p| "#{p[0,0].round},#{p[1,0].round}" }.join(' ')
         | 
| 158 150 | 
             
                  end
         | 
| 159 151 |  | 
| 160 152 | 
             
                  # for svg
         | 
| 161 153 | 
             
                  def pentagon_points_string
         | 
| 162 | 
            -
                    pentagon_points.map { |p| p + offset }.map { |p| "#{p[0,0].round},#{p[1,0].round}" }.join(' ')
         | 
| 154 | 
            +
                    pentagon_points.map { |p| offset_rotator.rotate(p) + offset }.map { |p| "#{p[0,0].round},#{p[1,0].round}" }.join(' ')
         | 
| 163 155 | 
             
                  end
         | 
| 164 156 |  | 
| 165 157 | 
             
                  # for svg
         | 
| 166 158 | 
             
                  def connecting_lines
         | 
| 167 159 | 
             
                    pentagon_points.each_with_index.map do |p, i|
         | 
| 168 160 | 
             
                      d = decagon_points[i*2]
         | 
| 169 | 
            -
                      GridGenerator::Line.new(a: p, b: d) + offset
         | 
| 161 | 
            +
                      offset_rotator.rotate(GridGenerator::Line.new(a: p, b: d)) + offset
         | 
| 170 162 | 
             
                    end
         | 
| 171 163 | 
             
                  end
         | 
| 172 164 |  | 
| 173 165 | 
             
                  # for svg
         | 
| 174 166 | 
             
                  def front_face_lines
         | 
| 175 | 
            -
                    front_face_lines_raw.map { |l| l + offset }
         | 
| 167 | 
            +
                    front_face_lines_raw.map { |l| offset_rotator.rotate(l) + offset }
         | 
| 176 168 | 
             
                  end
         | 
| 177 169 |  | 
| 178 170 | 
             
                  # for svg
         | 
| 179 171 | 
             
                  def outside_face_lines
         | 
| 180 172 | 
             
                    outside_face_lines_raw.map do |face_lines|
         | 
| 181 | 
            -
                      face_lines.map { |l| l + offset }
         | 
| 173 | 
            +
                      face_lines.map { |l| offset_rotator.rotate(l) + offset }
         | 
| 182 174 | 
             
                    end
         | 
| 183 175 | 
             
                  end
         | 
| 184 176 |  | 
| @@ -191,7 +183,8 @@ module GridGenerator | |
| 191 183 | 
             
                        index: i,
         | 
| 192 184 | 
             
                        face_points: pentagon_points,
         | 
| 193 185 | 
             
                        face_lines: front_face_lines_raw,
         | 
| 194 | 
            -
                        face: element
         | 
| 186 | 
            +
                        face: element,
         | 
| 187 | 
            +
                        rotator: offset_rotator
         | 
| 195 188 | 
             
                      ).build unless element == '-'
         | 
| 196 189 | 
             
                    end.compact
         | 
| 197 190 | 
             
                  end
         | 
| @@ -206,7 +199,8 @@ module GridGenerator | |
| 206 199 | 
             
                          index: element_index,
         | 
| 207 200 | 
             
                          face_points: outside_pentagon_points[face_index],
         | 
| 208 201 | 
             
                          face_lines: outside_face_lines_raw[face_index],
         | 
| 209 | 
            -
                          face: element
         | 
| 202 | 
            +
                          face: element,
         | 
| 203 | 
            +
                          rotator: offset_rotator
         | 
| 210 204 | 
             
                        ).build unless element == '-'
         | 
| 211 205 | 
             
                      end.compact
         | 
| 212 206 | 
             
                    end
         | 
    
        data/lib/grid_generator.rb
    CHANGED
    
    | @@ -13,12 +13,7 @@ require_relative 'grid_generator/skewb/top_skewb_grid' | |
| 13 13 | 
             
            require_relative 'grid_generator/skewb/left_skewb_grid'
         | 
| 14 14 | 
             
            require_relative 'grid_generator/skewb/right_skewb_grid'
         | 
| 15 15 | 
             
            require_relative 'grid_generator/square_one/face'
         | 
| 16 | 
            -
            require_relative 'grid_generator/arrows/vertical_arrow'
         | 
| 17 | 
            -
            require_relative 'grid_generator/arrows/horizontal_arrow'
         | 
| 18 | 
            -
            require_relative 'grid_generator/arrows/diagonal_down_arrow'
         | 
| 19 | 
            -
            require_relative 'grid_generator/arrows/diagonal_up_arrow'
         | 
| 20 16 | 
             
            require_relative 'grid_generator/pyraminx/face'
         | 
| 21 | 
            -
            require_relative 'grid_generator/megaminx/face'
         | 
| 22 17 | 
             
            require_relative 'grid_generator/megaminx/face_projection'
         | 
| 23 18 |  | 
| 24 19 | 
             
            module GridGenerator
         | 
| @@ -65,30 +60,10 @@ module GridGenerator | |
| 65 60 | 
             
                SquareOne::Face.new(**args)
         | 
| 66 61 | 
             
              end
         | 
| 67 62 |  | 
| 68 | 
            -
              def self.vertical_arrow(args)
         | 
| 69 | 
            -
                Arrows::VerticalArrow.new(**args)
         | 
| 70 | 
            -
              end
         | 
| 71 | 
            -
             | 
| 72 | 
            -
              def self.horizontal_arrow(args)
         | 
| 73 | 
            -
                Arrows::HorizontalArrow.new(**args)
         | 
| 74 | 
            -
              end
         | 
| 75 | 
            -
             | 
| 76 | 
            -
              def self.diagonal_down_arrow(args)
         | 
| 77 | 
            -
                Arrows::DiagonalDownArrow.new(**args)
         | 
| 78 | 
            -
              end
         | 
| 79 | 
            -
             | 
| 80 | 
            -
              def self.diagonal_up_arrow(args)
         | 
| 81 | 
            -
                Arrows::DiagonalUpArrow.new(**args)
         | 
| 82 | 
            -
              end
         | 
| 83 | 
            -
             | 
| 84 63 | 
             
              def self.pyraminx_face(args)
         | 
| 85 64 | 
             
                Pyraminx::Face.new(**args)
         | 
| 86 65 | 
             
              end
         | 
| 87 66 |  | 
| 88 | 
            -
              def self.megaminx_face(args)
         | 
| 89 | 
            -
                Megaminx::Face.new(**args)
         | 
| 90 | 
            -
              end
         | 
| 91 | 
            -
             | 
| 92 67 | 
             
              def self.megaminx_face_projection(args)
         | 
| 93 68 | 
             
                Megaminx::FaceProjection.new(**args)
         | 
| 94 69 | 
             
              end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: grid_generator
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.3.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Mark Humphreys
         | 
| 8 8 | 
             
            autorequire:
         | 
| 9 9 | 
             
            bindir: exe
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2023-03- | 
| 11 | 
            +
            date: 2023-03-22 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: matrix
         | 
| @@ -40,11 +40,6 @@ files: | |
| 40 40 | 
             
            - Rakefile
         | 
| 41 41 | 
             
            - grid_generator.gemspec
         | 
| 42 42 | 
             
            - lib/grid_generator.rb
         | 
| 43 | 
            -
            - lib/grid_generator/arrows/arrow.rb
         | 
| 44 | 
            -
            - lib/grid_generator/arrows/diagonal_down_arrow.rb
         | 
| 45 | 
            -
            - lib/grid_generator/arrows/diagonal_up_arrow.rb
         | 
| 46 | 
            -
            - lib/grid_generator/arrows/horizontal_arrow.rb
         | 
| 47 | 
            -
            - lib/grid_generator/arrows/vertical_arrow.rb
         | 
| 48 43 | 
             
            - lib/grid_generator/base_element.rb
         | 
| 49 44 | 
             
            - lib/grid_generator/cubic/bordered_grid.rb
         | 
| 50 45 | 
             
            - lib/grid_generator/cubic/facing_grid.rb
         | 
| @@ -59,12 +54,8 @@ files: | |
| 59 54 | 
             
            - lib/grid_generator/face_parser.rb
         | 
| 60 55 | 
             
            - lib/grid_generator/helper.rb
         | 
| 61 56 | 
             
            - lib/grid_generator/line.rb
         | 
| 62 | 
            -
            - lib/grid_generator/megaminx/common.rb
         | 
| 63 | 
            -
            - lib/grid_generator/megaminx/element_factory.rb
         | 
| 64 | 
            -
            - lib/grid_generator/megaminx/face.rb
         | 
| 65 57 | 
             
            - lib/grid_generator/megaminx/face_element_factory.rb
         | 
| 66 58 | 
             
            - lib/grid_generator/megaminx/face_projection.rb
         | 
| 67 | 
            -
            - lib/grid_generator/megaminx/front_face.rb
         | 
| 68 59 | 
             
            - lib/grid_generator/pyraminx/face.rb
         | 
| 69 60 | 
             
            - lib/grid_generator/pyraminx/triangle_factory.rb
         | 
| 70 61 | 
             
            - lib/grid_generator/rotator.rb
         | 
| @@ -1,29 +0,0 @@ | |
| 1 | 
            -
            module GridGenerator
         | 
| 2 | 
            -
              module Arrows
         | 
| 3 | 
            -
                class Arrow
         | 
| 4 | 
            -
                  def initialize(x:, y:, length:, direction: :uni, colour: '#ffffff')
         | 
| 5 | 
            -
                    @x, @y = x, y
         | 
| 6 | 
            -
                    @length = length
         | 
| 7 | 
            -
                    @direction = direction
         | 
| 8 | 
            -
                    @colour = colour
         | 
| 9 | 
            -
                  end
         | 
| 10 | 
            -
                
         | 
| 11 | 
            -
                  attr_reader :x, :y, :length, :direction, :colour
         | 
| 12 | 
            -
                
         | 
| 13 | 
            -
                  def points
         | 
| 14 | 
            -
                    []
         | 
| 15 | 
            -
                  end
         | 
| 16 | 
            -
                
         | 
| 17 | 
            -
                  def points_string
         | 
| 18 | 
            -
                    points.map { |p| p.join(',') }.join(' ')
         | 
| 19 | 
            -
                  end
         | 
| 20 | 
            -
             | 
| 21 | 
            -
                  def as_json
         | 
| 22 | 
            -
                    {
         | 
| 23 | 
            -
                      "points_string" => points_string,
         | 
| 24 | 
            -
                      "colour" => colour
         | 
| 25 | 
            -
                    }
         | 
| 26 | 
            -
                  end
         | 
| 27 | 
            -
                end
         | 
| 28 | 
            -
              end
         | 
| 29 | 
            -
            end
         | 
| @@ -1,65 +0,0 @@ | |
| 1 | 
            -
            require_relative 'arrow'
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            module GridGenerator
         | 
| 4 | 
            -
              module Arrows
         | 
| 5 | 
            -
                class DiagonalDownArrow < Arrow
         | 
| 6 | 
            -
                  ARROW_SIDE = 12
         | 
| 7 | 
            -
                  ARROW_OVERHANG = 4 
         | 
| 8 | 
            -
                
         | 
| 9 | 
            -
                  def arrow_start_point
         | 
| 10 | 
            -
                    [
         | 
| 11 | 
            -
                      [ x, y+ARROW_SIDE ],
         | 
| 12 | 
            -
                      [ x, y ],
         | 
| 13 | 
            -
                      [ x+ARROW_SIDE, y ]
         | 
| 14 | 
            -
                    ]
         | 
| 15 | 
            -
                  end
         | 
| 16 | 
            -
                
         | 
| 17 | 
            -
                  def arrow_start_flat
         | 
| 18 | 
            -
                    [
         | 
| 19 | 
            -
                      [ x, y+ARROW_SIDE-(2*ARROW_OVERHANG) ],
         | 
| 20 | 
            -
                      [ x+ARROW_SIDE-(2*ARROW_OVERHANG), y ]
         | 
| 21 | 
            -
                    ]
         | 
| 22 | 
            -
                  end
         | 
| 23 | 
            -
                
         | 
| 24 | 
            -
                  def arrow_start_side
         | 
| 25 | 
            -
                    [
         | 
| 26 | 
            -
                      [ x+ARROW_SIDE-ARROW_OVERHANG, y+ARROW_OVERHANG ],
         | 
| 27 | 
            -
                      [ x+(ARROW_SIDE-ARROW_OVERHANG)+length, y+length+ARROW_OVERHANG ]
         | 
| 28 | 
            -
                    ]
         | 
| 29 | 
            -
                  end
         | 
| 30 | 
            -
                
         | 
| 31 | 
            -
                  def arrow_end_point
         | 
| 32 | 
            -
                    [
         | 
| 33 | 
            -
                      [ x+ARROW_SIDE+length, y+length ],
         | 
| 34 | 
            -
                      [ x+ARROW_SIDE+length, y+ARROW_SIDE+length ],
         | 
| 35 | 
            -
                      [ x+length, y+ARROW_SIDE+length ]
         | 
| 36 | 
            -
                    ]
         | 
| 37 | 
            -
                  end
         | 
| 38 | 
            -
                
         | 
| 39 | 
            -
                  def arrow_end_flat
         | 
| 40 | 
            -
                    [
         | 
| 41 | 
            -
                      [ x+ARROW_SIDE+length, y+length+(2*ARROW_OVERHANG) ],
         | 
| 42 | 
            -
                      [ x+length+(2*ARROW_OVERHANG), y+ARROW_SIDE+length ]
         | 
| 43 | 
            -
                    ]
         | 
| 44 | 
            -
                  end
         | 
| 45 | 
            -
                
         | 
| 46 | 
            -
                  def arrow_end_side
         | 
| 47 | 
            -
                    [
         | 
| 48 | 
            -
                      [ x+length+ARROW_OVERHANG, y+ARROW_SIDE+length-ARROW_OVERHANG ],
         | 
| 49 | 
            -
                      [ x+ARROW_OVERHANG, y+ARROW_SIDE-ARROW_OVERHANG ]
         | 
| 50 | 
            -
                    ]
         | 
| 51 | 
            -
                  end
         | 
| 52 | 
            -
                
         | 
| 53 | 
            -
                  def points
         | 
| 54 | 
            -
                    case direction
         | 
| 55 | 
            -
                    when :forward
         | 
| 56 | 
            -
                      arrow_start_flat + arrow_start_side + arrow_end_point + arrow_end_side
         | 
| 57 | 
            -
                    when :backward
         | 
| 58 | 
            -
                      arrow_start_point + arrow_start_side + arrow_end_flat + arrow_end_side
         | 
| 59 | 
            -
                    else
         | 
| 60 | 
            -
                      arrow_start_point + arrow_start_side + arrow_end_point + arrow_end_side
         | 
| 61 | 
            -
                    end
         | 
| 62 | 
            -
                  end
         | 
| 63 | 
            -
                end
         | 
| 64 | 
            -
              end
         | 
| 65 | 
            -
            end
         | 
| @@ -1,66 +0,0 @@ | |
| 1 | 
            -
            require_relative 'arrow'
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            module GridGenerator
         | 
| 4 | 
            -
              module Arrows
         | 
| 5 | 
            -
                class DiagonalUpArrow < Arrow
         | 
| 6 | 
            -
                  ARROW_SIDE = 12
         | 
| 7 | 
            -
                  ARROW_OVERHANG = 4 
         | 
| 8 | 
            -
                
         | 
| 9 | 
            -
                  def arrow_start_point
         | 
| 10 | 
            -
                    [
         | 
| 11 | 
            -
                      [ x+ARROW_SIDE, y+length+ARROW_SIDE ],
         | 
| 12 | 
            -
                      [ x, y+length+ARROW_SIDE ],
         | 
| 13 | 
            -
                      [ x, y+length ]
         | 
| 14 | 
            -
                    ]
         | 
| 15 | 
            -
                  end
         | 
| 16 | 
            -
                
         | 
| 17 | 
            -
                  def arrow_start_flat
         | 
| 18 | 
            -
                    [
         | 
| 19 | 
            -
                      [ x+ARROW_SIDE-(2*ARROW_OVERHANG), y+length+ARROW_SIDE ],
         | 
| 20 | 
            -
                      [ x, y+length+(2*ARROW_OVERHANG) ]
         | 
| 21 | 
            -
                    ]
         | 
| 22 | 
            -
                  end
         | 
| 23 | 
            -
                
         | 
| 24 | 
            -
                  def arrow_start_side
         | 
| 25 | 
            -
                    [
         | 
| 26 | 
            -
                      [ x+ARROW_OVERHANG, y+length+ARROW_OVERHANG ],
         | 
| 27 | 
            -
                      [ x+length+ARROW_OVERHANG, y+ARROW_OVERHANG ]
         | 
| 28 | 
            -
                    ]
         | 
| 29 | 
            -
                  end
         | 
| 30 | 
            -
                
         | 
| 31 | 
            -
                  def arrow_end_point
         | 
| 32 | 
            -
                    [
         | 
| 33 | 
            -
                      [ x+length, y ],
         | 
| 34 | 
            -
                      [ x+length+ARROW_SIDE, y ],
         | 
| 35 | 
            -
                      [ x+length+ARROW_SIDE, y+ARROW_SIDE ]
         | 
| 36 | 
            -
                    ]
         | 
| 37 | 
            -
                  end
         | 
| 38 | 
            -
                
         | 
| 39 | 
            -
                  def arrow_end_flat
         | 
| 40 | 
            -
                    [
         | 
| 41 | 
            -
                      [ x+length+(2*ARROW_OVERHANG), y ],
         | 
| 42 | 
            -
                      [ x+length+ARROW_SIDE, y+ARROW_SIDE-(2*ARROW_OVERHANG) ]
         | 
| 43 | 
            -
                    ]
         | 
| 44 | 
            -
                  end
         | 
| 45 | 
            -
                
         | 
| 46 | 
            -
                  def arrow_end_side
         | 
| 47 | 
            -
                    [
         | 
| 48 | 
            -
                      [ x+length+ARROW_SIDE-ARROW_OVERHANG, y+ARROW_SIDE-ARROW_OVERHANG ],
         | 
| 49 | 
            -
                      [ x+ARROW_SIDE-ARROW_OVERHANG, y+length+ARROW_SIDE-ARROW_OVERHANG ]
         | 
| 50 | 
            -
                    ]
         | 
| 51 | 
            -
                  end
         | 
| 52 | 
            -
                
         | 
| 53 | 
            -
                  def points
         | 
| 54 | 
            -
                    case direction
         | 
| 55 | 
            -
                    when :forward
         | 
| 56 | 
            -
                      arrow_start_flat + arrow_start_side + arrow_end_point + arrow_end_side
         | 
| 57 | 
            -
                    when :backward
         | 
| 58 | 
            -
                      arrow_start_point + arrow_start_side + arrow_end_flat + arrow_end_side
         | 
| 59 | 
            -
                    else
         | 
| 60 | 
            -
                      arrow_start_point + arrow_start_side + arrow_end_point + arrow_end_side
         | 
| 61 | 
            -
                    end
         | 
| 62 | 
            -
                  end
         | 
| 63 | 
            -
                
         | 
| 64 | 
            -
                end
         | 
| 65 | 
            -
              end
         | 
| 66 | 
            -
            end
         | 
| @@ -1,66 +0,0 @@ | |
| 1 | 
            -
            require_relative 'arrow'
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            module GridGenerator
         | 
| 4 | 
            -
              module Arrows
         | 
| 5 | 
            -
                class HorizontalArrow < Arrow
         | 
| 6 | 
            -
                  ARROW_WIDTH = 16
         | 
| 7 | 
            -
                  ARROW_LENGTH = 8
         | 
| 8 | 
            -
                  LINE_WIDTH = 6
         | 
| 9 | 
            -
                
         | 
| 10 | 
            -
                  def arrow_start_point
         | 
| 11 | 
            -
                    [
         | 
| 12 | 
            -
                      [ x+ARROW_LENGTH, y+ARROW_WIDTH ],
         | 
| 13 | 
            -
                      [ x, y+(ARROW_WIDTH/2) ],
         | 
| 14 | 
            -
                      [ x+ARROW_LENGTH, y ]
         | 
| 15 | 
            -
                    ]
         | 
| 16 | 
            -
                  end
         | 
| 17 | 
            -
                
         | 
| 18 | 
            -
                  def arrow_start_flat
         | 
| 19 | 
            -
                    [
         | 
| 20 | 
            -
                      [ x, y+(ARROW_WIDTH/2)+(LINE_WIDTH/2) ],
         | 
| 21 | 
            -
                      [ x, y+(ARROW_WIDTH/2)-(LINE_WIDTH/2) ]
         | 
| 22 | 
            -
                    ]
         | 
| 23 | 
            -
                  end
         | 
| 24 | 
            -
                
         | 
| 25 | 
            -
                  def arrow_start_side
         | 
| 26 | 
            -
                    [
         | 
| 27 | 
            -
                      [ x+ARROW_LENGTH, y+(ARROW_WIDTH/2)-(LINE_WIDTH/2) ],
         | 
| 28 | 
            -
                      [ x+ARROW_LENGTH+length, y+(ARROW_WIDTH/2)-(LINE_WIDTH/2) ]
         | 
| 29 | 
            -
                    ]
         | 
| 30 | 
            -
                  end
         | 
| 31 | 
            -
                
         | 
| 32 | 
            -
                  def arrow_end_point
         | 
| 33 | 
            -
                    [
         | 
| 34 | 
            -
                      [ x+ARROW_LENGTH+length, y ],
         | 
| 35 | 
            -
                      [ x+(2*ARROW_LENGTH)+length, y+(ARROW_WIDTH/2) ],
         | 
| 36 | 
            -
                      [ x+ARROW_LENGTH+length, y+ARROW_WIDTH ]
         | 
| 37 | 
            -
                    ]
         | 
| 38 | 
            -
                  end
         | 
| 39 | 
            -
                
         | 
| 40 | 
            -
                  def arrow_end_flat
         | 
| 41 | 
            -
                    [
         | 
| 42 | 
            -
                      [ x+(2*ARROW_LENGTH)+length, y+(ARROW_WIDTH/2)-(LINE_WIDTH/2) ],
         | 
| 43 | 
            -
                      [ x+(2*ARROW_LENGTH)+length, y+(ARROW_WIDTH/2)+(LINE_WIDTH/2) ]
         | 
| 44 | 
            -
                    ]
         | 
| 45 | 
            -
                  end
         | 
| 46 | 
            -
                
         | 
| 47 | 
            -
                  def arrow_end_side
         | 
| 48 | 
            -
                    [
         | 
| 49 | 
            -
                      [ x+ARROW_LENGTH+length, y+(ARROW_WIDTH/2)+(LINE_WIDTH/2) ],
         | 
| 50 | 
            -
                      [ x+ARROW_LENGTH, y+(ARROW_WIDTH/2)+(LINE_WIDTH/2) ]
         | 
| 51 | 
            -
                    ]
         | 
| 52 | 
            -
                  end 
         | 
| 53 | 
            -
                
         | 
| 54 | 
            -
                  def points
         | 
| 55 | 
            -
                    case direction
         | 
| 56 | 
            -
                    when :forward
         | 
| 57 | 
            -
                      arrow_start_flat + arrow_start_side + arrow_end_point + arrow_end_side
         | 
| 58 | 
            -
                    when :backward
         | 
| 59 | 
            -
                      arrow_start_point + arrow_start_side + arrow_end_flat + arrow_end_side
         | 
| 60 | 
            -
                    else
         | 
| 61 | 
            -
                      arrow_start_point + arrow_start_side + arrow_end_point + arrow_end_side
         | 
| 62 | 
            -
                    end
         | 
| 63 | 
            -
                  end
         | 
| 64 | 
            -
                end
         | 
| 65 | 
            -
              end
         | 
| 66 | 
            -
            end
         | 
| @@ -1,66 +0,0 @@ | |
| 1 | 
            -
            require_relative 'arrow'
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            module GridGenerator
         | 
| 4 | 
            -
              module Arrows
         | 
| 5 | 
            -
                class VerticalArrow < Arrow
         | 
| 6 | 
            -
                  ARROW_WIDTH = 16
         | 
| 7 | 
            -
                  ARROW_LENGTH = 8
         | 
| 8 | 
            -
                  LINE_WIDTH = 6
         | 
| 9 | 
            -
                
         | 
| 10 | 
            -
                  def arrow_start_point
         | 
| 11 | 
            -
                    [
         | 
| 12 | 
            -
                      [ x, y+ARROW_LENGTH ],
         | 
| 13 | 
            -
                      [ x+(ARROW_WIDTH/2), y ],
         | 
| 14 | 
            -
                      [ x+ARROW_WIDTH, y+ARROW_LENGTH ]
         | 
| 15 | 
            -
                    ]
         | 
| 16 | 
            -
                  end
         | 
| 17 | 
            -
                
         | 
| 18 | 
            -
                  def arrow_start_flat
         | 
| 19 | 
            -
                    [
         | 
| 20 | 
            -
                      [ x+(ARROW_WIDTH/2)-(LINE_WIDTH/2), y ],
         | 
| 21 | 
            -
                      [ x+(ARROW_WIDTH/2)+(LINE_WIDTH/2), y ]
         | 
| 22 | 
            -
                    ]
         | 
| 23 | 
            -
                  end
         | 
| 24 | 
            -
                
         | 
| 25 | 
            -
                  def arrow_start_side
         | 
| 26 | 
            -
                    [
         | 
| 27 | 
            -
                      [ x+(ARROW_WIDTH/2)+(LINE_WIDTH/2), y+ARROW_LENGTH ],
         | 
| 28 | 
            -
                      [ x+(ARROW_WIDTH/2)+(LINE_WIDTH/2), y+ARROW_LENGTH+length ]
         | 
| 29 | 
            -
                    ]
         | 
| 30 | 
            -
                  end
         | 
| 31 | 
            -
                
         | 
| 32 | 
            -
                  def arrow_end_point
         | 
| 33 | 
            -
                    [
         | 
| 34 | 
            -
                      [ x+ARROW_WIDTH, y+ARROW_LENGTH+length ],
         | 
| 35 | 
            -
                      [ x+(ARROW_WIDTH/2), y+(ARROW_LENGTH*2)+length ],
         | 
| 36 | 
            -
                      [ x, y+ARROW_LENGTH+length ]
         | 
| 37 | 
            -
                    ]
         | 
| 38 | 
            -
                  end
         | 
| 39 | 
            -
                
         | 
| 40 | 
            -
                  def arrow_end_flat
         | 
| 41 | 
            -
                    [
         | 
| 42 | 
            -
                      [ x+(ARROW_WIDTH/2)+(LINE_WIDTH/2), y+(2*ARROW_LENGTH)+length ],
         | 
| 43 | 
            -
                      [ x+(ARROW_WIDTH/2)-(LINE_WIDTH/2), y+(2*ARROW_LENGTH)+length ]
         | 
| 44 | 
            -
                    ]
         | 
| 45 | 
            -
                  end
         | 
| 46 | 
            -
                
         | 
| 47 | 
            -
                  def arrow_end_side
         | 
| 48 | 
            -
                    [
         | 
| 49 | 
            -
                      [ x+(ARROW_WIDTH/2)-(LINE_WIDTH/2), y+ARROW_LENGTH+length ],
         | 
| 50 | 
            -
                      [ x+(ARROW_WIDTH/2)-(LINE_WIDTH/2), y+ARROW_LENGTH ]
         | 
| 51 | 
            -
                    ]
         | 
| 52 | 
            -
                  end
         | 
| 53 | 
            -
                
         | 
| 54 | 
            -
                  def points
         | 
| 55 | 
            -
                    case direction
         | 
| 56 | 
            -
                    when :forward
         | 
| 57 | 
            -
                      arrow_start_flat + arrow_start_side + arrow_end_point + arrow_end_side
         | 
| 58 | 
            -
                    when :backward
         | 
| 59 | 
            -
                      arrow_start_point + arrow_start_side + arrow_end_flat + arrow_end_side
         | 
| 60 | 
            -
                    else
         | 
| 61 | 
            -
                      arrow_start_point + arrow_start_side + arrow_end_point + arrow_end_side
         | 
| 62 | 
            -
                    end
         | 
| 63 | 
            -
                  end
         | 
| 64 | 
            -
                end
         | 
| 65 | 
            -
              end
         | 
| 66 | 
            -
            end
         | 
| @@ -1,95 +0,0 @@ | |
| 1 | 
            -
            require 'matrix'
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            module GridGenerator
         | 
| 4 | 
            -
              module Megaminx
         | 
| 5 | 
            -
                module Common
         | 
| 6 | 
            -
                  ROTATION_STEP = 2 * Math::PI / 5
         | 
| 7 | 
            -
             | 
| 8 | 
            -
                  ROTATION_MATRIX = Proc.new do |theta|
         | 
| 9 | 
            -
                    Matrix[
         | 
| 10 | 
            -
                      [Math.cos(theta), -1*Math.sin(theta)], 
         | 
| 11 | 
            -
                      [Math.sin(theta), Math.cos(theta)]
         | 
| 12 | 
            -
                    ]
         | 
| 13 | 
            -
                  end
         | 
| 14 | 
            -
             | 
| 15 | 
            -
                  ROTATION_MATRICES = Array.new(5) do |i|
         | 
| 16 | 
            -
                    ROTATION_MATRIX.call(ROTATION_STEP * i)
         | 
| 17 | 
            -
                  end
         | 
| 18 | 
            -
             | 
| 19 | 
            -
                  def rotation_offset_matrix 
         | 
| 20 | 
            -
                    @rotation_offset_matrix ||= ROTATION_MATRIX.call(rotation_offset)
         | 
| 21 | 
            -
                  end
         | 
| 22 | 
            -
             | 
| 23 | 
            -
                  def rotation_point
         | 
| 24 | 
            -
                    @rotation_point ||= Matrix.column_vector([x+2*units, y+2*units])
         | 
| 25 | 
            -
                  end
         | 
| 26 | 
            -
             | 
| 27 | 
            -
                  def rotate(matrix, point)
         | 
| 28 | 
            -
                    (matrix * (point - rotation_point)) + rotation_point
         | 
| 29 | 
            -
                  end
         | 
| 30 | 
            -
             | 
| 31 | 
            -
                  # line
         | 
| 32 | 
            -
              
         | 
| 33 | 
            -
                  def intersection(a,b,c,d)
         | 
| 34 | 
            -
                    x1 = a[0,0]
         | 
| 35 | 
            -
                    y1 = a[1,0] 
         | 
| 36 | 
            -
                    x2 = b[0,0]
         | 
| 37 | 
            -
                    y2 = b[1,0]
         | 
| 38 | 
            -
                    x3 = c[0,0]
         | 
| 39 | 
            -
                    y3 = c[1,0]
         | 
| 40 | 
            -
                    x4 = d[0,0]
         | 
| 41 | 
            -
                    y4 = d[1,0] 
         | 
| 42 | 
            -
              
         | 
| 43 | 
            -
                    px_numerator = (x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4)
         | 
| 44 | 
            -
                    px_denominator = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4) 
         | 
| 45 | 
            -
              
         | 
| 46 | 
            -
                    py_numerator = (x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4)
         | 
| 47 | 
            -
                    py_denominator = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4)
         | 
| 48 | 
            -
              
         | 
| 49 | 
            -
                    px = px_numerator / px_denominator
         | 
| 50 | 
            -
                    py = py_numerator / py_denominator
         | 
| 51 | 
            -
              
         | 
| 52 | 
            -
                    Matrix.column_vector([px, py])
         | 
| 53 | 
            -
                  end
         | 
| 54 | 
            -
             | 
| 55 | 
            -
                  # points
         | 
| 56 | 
            -
                  
         | 
| 57 | 
            -
                  def top_outer_corner
         | 
| 58 | 
            -
                    @top_outer_corner ||= rotate(rotation_offset_matrix, Matrix.column_vector([x+2*units,y]))
         | 
| 59 | 
            -
                  end
         | 
| 60 | 
            -
             | 
| 61 | 
            -
                  def top_outer_edge
         | 
| 62 | 
            -
                    point_a, point_b = outer_corners.first(2)
         | 
| 63 | 
            -
                    @top_outer_edge = (point_a + point_b) / 2 
         | 
| 64 | 
            -
                  end
         | 
| 65 | 
            -
             | 
| 66 | 
            -
                  def top_inner_corner
         | 
| 67 | 
            -
                    intersection(outer_edges[4], outer_edges[1], outer_edges[3], outer_edges[0])
         | 
| 68 | 
            -
                  end
         | 
| 69 | 
            -
             | 
| 70 | 
            -
                  def outer_corners
         | 
| 71 | 
            -
                    @outer_corners ||= ROTATION_MATRICES.map do |matrix|
         | 
| 72 | 
            -
                      rotate(matrix, top_outer_corner)
         | 
| 73 | 
            -
                    end
         | 
| 74 | 
            -
                  end
         | 
| 75 | 
            -
             | 
| 76 | 
            -
                  def outer_edges
         | 
| 77 | 
            -
                    @outer_edges ||= ROTATION_MATRICES.map do |matrix|
         | 
| 78 | 
            -
                      rotate(matrix, top_outer_edge)
         | 
| 79 | 
            -
                    end
         | 
| 80 | 
            -
                  end
         | 
| 81 | 
            -
             | 
| 82 | 
            -
                  def inner_corners
         | 
| 83 | 
            -
                    @inner_corners ||= ROTATION_MATRICES.map do |matrix|
         | 
| 84 | 
            -
                      rotate(matrix, top_inner_corner)
         | 
| 85 | 
            -
                    end
         | 
| 86 | 
            -
                  end
         | 
| 87 | 
            -
             | 
| 88 | 
            -
                  def outer_edges_ordered_by_evens_then_odds
         | 
| 89 | 
            -
                    evens = outer_edges.select.with_index { |_,i| i % 2 == 0 } 
         | 
| 90 | 
            -
                    odds = outer_edges.select.with_index { |_,i| i % 2 == 1 } 
         | 
| 91 | 
            -
                    evens + odds
         | 
| 92 | 
            -
                  end
         | 
| 93 | 
            -
                end
         | 
| 94 | 
            -
              end
         | 
| 95 | 
            -
            end
         | 
| @@ -1,52 +0,0 @@ | |
| 1 | 
            -
            require_relative '../base_element'
         | 
| 2 | 
            -
            require_relative 'common'
         | 
| 3 | 
            -
             | 
| 4 | 
            -
            module GridGenerator
         | 
| 5 | 
            -
              module Megaminx
         | 
| 6 | 
            -
                class ElementFactory
         | 
| 7 | 
            -
                  include GridGenerator::Megaminx::Common
         | 
| 8 | 
            -
             | 
| 9 | 
            -
                  CENTER_INDEX = 0
         | 
| 10 | 
            -
                  EDGE_INDEX = 1
         | 
| 11 | 
            -
                  CORNER_INDEX = 2
         | 
| 12 | 
            -
             | 
| 13 | 
            -
                  def initialize(x: , y:, row_index:, element_index:, units:, colour:, opacity:, rotation_offset: 0) 
         | 
| 14 | 
            -
                    @x, @y = x, y
         | 
| 15 | 
            -
                    @row_index = row_index
         | 
| 16 | 
            -
                    @element_index = element_index
         | 
| 17 | 
            -
                    @units = units
         | 
| 18 | 
            -
                    @colour = colour
         | 
| 19 | 
            -
                    @opacity = opacity
         | 
| 20 | 
            -
                    @rotation_offset = rotation_offset
         | 
| 21 | 
            -
                  end
         | 
| 22 | 
            -
             | 
| 23 | 
            -
                  attr_reader :x, :y, :row_index, :element_index, :units, :colour, :opacity, :rotation_offset
         | 
| 24 | 
            -
             | 
| 25 | 
            -
                  def points
         | 
| 26 | 
            -
                    case row_index
         | 
| 27 | 
            -
                    when CENTER_INDEX
         | 
| 28 | 
            -
                      inner_corners  
         | 
| 29 | 
            -
                    when EDGE_INDEX
         | 
| 30 | 
            -
                      [
         | 
| 31 | 
            -
                        outer_edges[element_index], 
         | 
| 32 | 
            -
                        inner_corners[(element_index+1) % 5], 
         | 
| 33 | 
            -
                        inner_corners[element_index], 
         | 
| 34 | 
            -
                      ]
         | 
| 35 | 
            -
                    when CORNER_INDEX
         | 
| 36 | 
            -
                      [
         | 
| 37 | 
            -
                        outer_corners[element_index], 
         | 
| 38 | 
            -
                        outer_edges[element_index], 
         | 
| 39 | 
            -
                        inner_corners[element_index], 
         | 
| 40 | 
            -
                        outer_edges[(element_index-1) % 5], 
         | 
| 41 | 
            -
                      ]
         | 
| 42 | 
            -
                    else
         | 
| 43 | 
            -
                      raise ArgumentError, "unknown row #{row_index}"
         | 
| 44 | 
            -
                    end
         | 
| 45 | 
            -
                  end
         | 
| 46 | 
            -
             | 
| 47 | 
            -
                  def build
         | 
| 48 | 
            -
                    GridGenerator::BaseElement.new(points: points, colour: colour, opacity: opacity)
         | 
| 49 | 
            -
                  end
         | 
| 50 | 
            -
                end
         | 
| 51 | 
            -
              end
         | 
| 52 | 
            -
            end
         | 
| @@ -1,79 +0,0 @@ | |
| 1 | 
            -
            require_relative '../face_parser'
         | 
| 2 | 
            -
            require_relative 'common'
         | 
| 3 | 
            -
            require_relative 'element_factory'
         | 
| 4 | 
            -
             | 
| 5 | 
            -
            module GridGenerator
         | 
| 6 | 
            -
              module Megaminx
         | 
| 7 | 
            -
                class Face
         | 
| 8 | 
            -
                  include GridGenerator::Megaminx::Common
         | 
| 9 | 
            -
              
         | 
| 10 | 
            -
                  def initialize(x:, y: , units: , elements: , rotation_offset: 0, label: nil)
         | 
| 11 | 
            -
                    @x, @y = x, y
         | 
| 12 | 
            -
                    @units = units
         | 
| 13 | 
            -
                    @elements = FaceParser.new(elements).parse
         | 
| 14 | 
            -
                    @rotation_offset = rotation_offset
         | 
| 15 | 
            -
                    @label = label
         | 
| 16 | 
            -
                  end
         | 
| 17 | 
            -
              
         | 
| 18 | 
            -
                  attr_reader :x, :y, :units, :elements, :rotation_offset, :label
         | 
| 19 | 
            -
             | 
| 20 | 
            -
                  # outline
         | 
| 21 | 
            -
                  
         | 
| 22 | 
            -
                  def outline_string
         | 
| 23 | 
            -
                    outer_corners.map { |p| "#{p[0,0].round},#{p[1,0].round}" }.join(' ')
         | 
| 24 | 
            -
                  end
         | 
| 25 | 
            -
              
         | 
| 26 | 
            -
                  def inner_string
         | 
| 27 | 
            -
                    inner_corners.map { |p| "#{p[0,0].round},#{p[1,0].round}" }.join(' ')
         | 
| 28 | 
            -
                  end
         | 
| 29 | 
            -
              
         | 
| 30 | 
            -
                  def inline_string
         | 
| 31 | 
            -
                    outer_edges_ordered_by_evens_then_odds.map { |p| "#{p[0,0].round},#{p[1,0].round}" }.join(' ')
         | 
| 32 | 
            -
                  end
         | 
| 33 | 
            -
              
         | 
| 34 | 
            -
                  # elements 
         | 
| 35 | 
            -
                  
         | 
| 36 | 
            -
                  def element_shapes
         | 
| 37 | 
            -
                    elements.each_with_index.map do |row, row_index|
         | 
| 38 | 
            -
                      row.each_with_index.map do |element, element_index|
         | 
| 39 | 
            -
                        GridGenerator::Megaminx::ElementFactory.new(
         | 
| 40 | 
            -
                          x: x,
         | 
| 41 | 
            -
                          y: y,
         | 
| 42 | 
            -
                          row_index: row_index,
         | 
| 43 | 
            -
                          element_index: element_index,
         | 
| 44 | 
            -
                          units: units,
         | 
| 45 | 
            -
                          colour: element[:colour],
         | 
| 46 | 
            -
                          opacity: element[:opacity],
         | 
| 47 | 
            -
                          rotation_offset: rotation_offset
         | 
| 48 | 
            -
                        ).build if element
         | 
| 49 | 
            -
                      end
         | 
| 50 | 
            -
                    end.flatten.compact
         | 
| 51 | 
            -
                  end
         | 
| 52 | 
            -
             | 
| 53 | 
            -
                  # label methods
         | 
| 54 | 
            -
              
         | 
| 55 | 
            -
                  def label_position
         | 
| 56 | 
            -
                    x = rotation_point[0,0] - units*0.3
         | 
| 57 | 
            -
                    y = rotation_point[1,0] + units*0.4
         | 
| 58 | 
            -
                    {
         | 
| 59 | 
            -
                      x: x.round, 
         | 
| 60 | 
            -
                      y: y.round 
         | 
| 61 | 
            -
                    }
         | 
| 62 | 
            -
                  end
         | 
| 63 | 
            -
              
         | 
| 64 | 
            -
                  def label_size
         | 
| 65 | 
            -
                    units
         | 
| 66 | 
            -
                  end
         | 
| 67 | 
            -
             | 
| 68 | 
            -
                  def as_json
         | 
| 69 | 
            -
                    {
         | 
| 70 | 
            -
                      "outline_string" => outline_string,
         | 
| 71 | 
            -
                      "inline_string" => inline_string,
         | 
| 72 | 
            -
                      "element_shapes" => element_shapes.as_json,
         | 
| 73 | 
            -
                      "label_position" => label_position,
         | 
| 74 | 
            -
                      "label_size" => label_size
         | 
| 75 | 
            -
                    }
         | 
| 76 | 
            -
                  end
         | 
| 77 | 
            -
                end
         | 
| 78 | 
            -
              end
         | 
| 79 | 
            -
            end
         |