grid_generator 0.2.12 → 0.2.13

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d2e4ae2eb50929918c9de39208ddf4eaccaafdc56c53dc13774d398aa70f52e3
4
- data.tar.gz: 5a7c155861ff0725f985660ef3727d18e834a42f770c8e030f73c8c145e1e88c
3
+ metadata.gz: 64d15af10326ad444f4760ddbe17746cbfc05661e50e1fb5b81ce8f13b08d871
4
+ data.tar.gz: b3ba4a0c2b51159418ee98606b0d8ade3964741ab662458214c849c02ead5a5b
5
5
  SHA512:
6
- metadata.gz: 4adbf1a09e9839148113816c35920bad39d61128bb20f9dac8a30b0af6e8953cab5103cd7e682ea050a6a6de61ae9fecfb501bc1172b662b8642a749e8758d6b
7
- data.tar.gz: a096f60c701cb163b94c79034961cefc8b3f6f65554dbd7f530fe4723878eae1377a1b32891c51ee9fd719697a391106b5916a2b7904df6ad101ac4953b0e4b1
6
+ metadata.gz: 0a5212a5f5a42b696b9b2a3508aa9f0b0adcd7939dbaf556e4697d8a9eb3556a085372583138da04f601e7d5f3d66033ba6ae8cb143e95e0324dc11a96b3a872
7
+ data.tar.gz: fee3fdecb1114c47e7c94b3b2717d86d0d77e107dcf9c722c16e5f3654e89d93a093bd8cf92bb5f8e3c2939577150e90bd6217491d07245cae10735dfa3766bb
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- grid_generator (0.2.12)
4
+ grid_generator (0.2.13)
5
5
  matrix (~> 0.4.2)
6
6
 
7
7
  GEM
@@ -18,6 +18,28 @@ module GridGenerator
18
18
  Matrix.column_vector([x, y])
19
19
  end
20
20
  end
21
+
22
+ def self.intersection(ab,cd)
23
+ x1 = ab.a[0,0]
24
+ y1 = ab.a[1,0]
25
+ x2 = ab.b[0,0]
26
+ y2 = ab.b[1,0]
27
+ x3 = cd.a[0,0]
28
+ y3 = cd.a[1,0]
29
+ x4 = cd.b[0,0]
30
+ y4 = cd.b[1,0]
31
+
32
+ px_numerator = (x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4)
33
+ px_denominator = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4)
34
+
35
+ py_numerator = (x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4)
36
+ py_denominator = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4)
37
+
38
+ px = px_numerator.to_f / px_denominator
39
+ py = py_numerator.to_f / py_denominator
40
+
41
+ Matrix.column_vector([px, py])
42
+ end
21
43
  end
22
44
  end
23
45
 
@@ -0,0 +1,92 @@
1
+ require_relative '../face_parser'
2
+
3
+ module GridGenerator
4
+ module Megaminx
5
+ class FaceElementFactory
6
+ def initialize(x:, y:, index:, face_points: , face_lines:, face:)
7
+ @x, @y = x, y
8
+ @index = index
9
+ @face_points = face_points
10
+ @face_lines = face_lines
11
+ face_attr = FaceParser.new(face).parse
12
+ @colour = face_attr && face_attr[:colour]
13
+ @opacity = face_attr && face_attr[:opacity]
14
+ end
15
+
16
+ attr_reader :x, :y, :index, :face_points, :face_lines, :colour, :opacity
17
+
18
+ def offset
19
+ Matrix.column_vector([x, y])
20
+ end
21
+
22
+ # front face points
23
+ # 0 top corner
24
+ # 1 right corner
25
+ # 2 bottom right corner
26
+ # 3 bottom left corner
27
+ # 4 left corner
28
+
29
+ # front face lines - parallel
30
+ # 0 - top right
31
+ # 1 - right
32
+ # 2 - down
33
+ # 3 - left
34
+ # 4 - top left right
35
+
36
+ def center_points
37
+ face_lines.each_with_index.map do |line, i|
38
+ a = line
39
+ b = face_lines[(i+1)%5]
40
+ GridGenerator::Helper.intersection(a, b)
41
+ end
42
+ end
43
+
44
+ def edge_points(i)
45
+ previous_line = face_linex[(i-1)%5]
46
+ this_line = face_lines[i]
47
+ next_line = face_lines[(i+1)%5]
48
+
49
+ previous_this_point = GridGenerator::Helper.intersection(previous_line, this_line)
50
+ this_next_point = GridGenerator::Helper.intersection(this_line, next_line)
51
+
52
+ [
53
+ previous_line.b,
54
+ next_line.a,
55
+ this_next_point,
56
+ previous_this_point
57
+ ]
58
+ end
59
+
60
+ def corner_points(i)
61
+ line_a = face_lines[(i+3) % 5]
62
+ line_b = face_lines[(i+4) % 5]
63
+ intersection = GridGenerator::Helper.intersection(line_a, line_b)
64
+
65
+ [
66
+ face_points[i],
67
+ line_a.b,
68
+ line_b.a,
69
+ intersection
70
+ ]
71
+ end
72
+
73
+ def points
74
+ all_points = if index == 0
75
+ center_points
76
+ else
77
+ if index % 2 == 0
78
+ edge_points(index / 2)
79
+ else
80
+ corner_points((index - 1) / 2)
81
+ end
82
+ end
83
+
84
+ all_points.map { |p| p + offset }
85
+ end
86
+
87
+ def build
88
+ GridGenerator::BaseElement.new(points: points, colour: colour, opacity: opacity)
89
+ end
90
+ end
91
+ end
92
+ end
@@ -2,30 +2,20 @@ require 'matrix'
2
2
  require_relative '../rotator'
3
3
  require_relative '../helper'
4
4
  require_relative '../line'
5
+ require_relative 'face_element_factory'
5
6
 
6
7
  module GridGenerator
7
8
  module Megaminx
8
9
  class FaceProjection
9
10
  # units 30 - pentagon 90 - megaminx - 150
10
11
  # units * 5
11
- # *****
12
- # ***
13
- # ***
14
- #
15
- # *** *** ***
16
- # *** *** ***
17
- # ***** ***** *****
18
- #
19
- # ***** *****
20
- # *** ***
21
- # *** ***
22
- def initialize(x:, y:, units:, elements: [])
12
+ def initialize(x:, y:, units:, front_face_elements: "")
23
13
  @x, @y = x, y
24
14
  @units = units
25
- @elements = elements
15
+ @front_face_elements = front_face_elements.split(',')
26
16
  end
27
17
 
28
- attr_reader :x, :y, :units, :elements
18
+ attr_reader :x, :y, :units, :front_face_elements
29
19
 
30
20
  def offset
31
21
  @offset ||= Matrix.column_vector([x, y])
@@ -87,22 +77,26 @@ module GridGenerator
87
77
  ]
88
78
  end
89
79
 
90
- def right_pentagon_points
91
- @right_pentagon_points ||= [
92
- decagon_points[2],
93
- decagon_points[3],
94
- decagon_points[4],
95
- pentagon_points[2],
96
- pentagon_points[1]
97
- ]
80
+ def front_face_lines_raw
81
+ (0..4).map do |i|
82
+ a = pentagon_points[i-1] # offset one so first line is top right
83
+ b = pentagon_points[(i)%5]
84
+ c = pentagon_points[(i+1)%5]
85
+ d = pentagon_points[(i+2)%5]
86
+
87
+ ab_intervals = GridGenerator::Helper.intervals(a,b,2)
88
+ cd_intervals = GridGenerator::Helper.intervals(c,d,2)
89
+
90
+ GridGenerator::Line.new(a: ab_intervals[-1], b: cd_intervals[0])
91
+ end
98
92
  end
99
93
 
100
94
  def top_right_face_lines_raw
101
95
  (0..4).map do |i|
102
- a = top_right_pentagon_points[i]
103
- b = top_right_pentagon_points[(i+1)%5]
104
- c = top_right_pentagon_points[(i+2)%5]
105
- d = top_right_pentagon_points[(i+3)%5]
96
+ a = top_right_pentagon_points[i-1] # offset by one so first line is top right
97
+ b = top_right_pentagon_points[(i)%5]
98
+ c = top_right_pentagon_points[(i+1)%5]
99
+ d = top_right_pentagon_points[(i+2)%5]
106
100
 
107
101
  ab_intervals = GridGenerator::Helper.intervals(a,b,2)
108
102
  cd_intervals = GridGenerator::Helper.intervals(c,d,2)
@@ -150,17 +144,7 @@ module GridGenerator
150
144
 
151
145
  # for svg
152
146
  def front_face_lines
153
- (0..4).map do |i|
154
- a = pentagon_points[i]
155
- b = pentagon_points[(i+1)%5]
156
- c = pentagon_points[(i+2)%5]
157
- d = pentagon_points[(i+3)%5]
158
-
159
- ab_intervals = GridGenerator::Helper.intervals(a,b,2)
160
- cd_intervals = GridGenerator::Helper.intervals(c,d,2)
161
-
162
- GridGenerator::Line.new(a: ab_intervals[-1], b: cd_intervals[0]) + offset
163
- end
147
+ front_face_lines_raw.map { |l| l + offset }
164
148
  end
165
149
 
166
150
  # for svg
@@ -173,6 +157,19 @@ module GridGenerator
173
157
  pentagon_points.map { |p| p + offset }.map { |p| "#{p[0,0].round},#{p[1,0].round}" }.join(' ')
174
158
  end
175
159
 
160
+ # for svg
161
+ def front_face_element_shapes
162
+ front_face_elements.each_with_index.map do |element, i|
163
+ GridGenerator::Megaminx::FaceElementFactory.new(
164
+ x: x,
165
+ y: y,
166
+ index: i,
167
+ face_points: pentagon_points,
168
+ face_lines: front_face_lines_raw,
169
+ face: element
170
+ ).build unless element == '-'
171
+ end.compact
172
+ end
176
173
  end
177
174
  end
178
175
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GridGenerator
4
- VERSION = "0.2.12"
4
+ VERSION = "0.2.13"
5
5
  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.2.12
4
+ version: 0.2.13
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-05 00:00:00.000000000 Z
11
+ date: 2023-03-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: matrix
@@ -62,6 +62,7 @@ files:
62
62
  - lib/grid_generator/megaminx/common.rb
63
63
  - lib/grid_generator/megaminx/element_factory.rb
64
64
  - lib/grid_generator/megaminx/face.rb
65
+ - lib/grid_generator/megaminx/face_element_factory.rb
65
66
  - lib/grid_generator/megaminx/face_projection.rb
66
67
  - lib/grid_generator/megaminx/front_face.rb
67
68
  - lib/grid_generator/pyraminx/face.rb