cubegin 0.0.1

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.
Files changed (164) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/LICENSE +674 -0
  3. package/NOTICE +11 -0
  4. package/README.md +49 -0
  5. package/dist/scramble-core/src/batch.mjs +18 -0
  6. package/dist/scramble-core/src/generator.d.mts +35 -0
  7. package/dist/scramble-core/src/generator.mjs +136 -0
  8. package/dist/scramble-core/src/generators/clock.d.mts +11 -0
  9. package/dist/scramble-core/src/generators/clock.mjs +32 -0
  10. package/dist/scramble-core/src/generators/cube-random-turns.d.mts +11 -0
  11. package/dist/scramble-core/src/generators/cube-random-turns.mjs +54 -0
  12. package/dist/scramble-core/src/generators/four-by-four.d.mts +14 -0
  13. package/dist/scramble-core/src/generators/four-by-four.mjs +43 -0
  14. package/dist/scramble-core/src/generators/megaminx.d.mts +11 -0
  15. package/dist/scramble-core/src/generators/megaminx.mjs +18 -0
  16. package/dist/scramble-core/src/generators/pyraminx.d.mts +11 -0
  17. package/dist/scramble-core/src/generators/pyraminx.mjs +17 -0
  18. package/dist/scramble-core/src/generators/skewb.d.mts +11 -0
  19. package/dist/scramble-core/src/generators/skewb.mjs +17 -0
  20. package/dist/scramble-core/src/generators/square1.d.mts +11 -0
  21. package/dist/scramble-core/src/generators/square1.mjs +28 -0
  22. package/dist/scramble-core/src/generators/three-by-three.d.mts +25 -0
  23. package/dist/scramble-core/src/generators/three-by-three.mjs +85 -0
  24. package/dist/scramble-core/src/generators/two-by-two.d.mts +11 -0
  25. package/dist/scramble-core/src/generators/two-by-two.mjs +17 -0
  26. package/dist/scramble-core/src/random-source.d.mts +7 -0
  27. package/dist/scramble-core/src/random-source.mjs +8 -0
  28. package/dist/scramble-core/src/solvers/min2phase/coord-cube.mjs +10 -0
  29. package/dist/scramble-core/src/solvers/min2phase/cubie-cube.mjs +246 -0
  30. package/dist/scramble-core/src/solvers/min2phase/engine.mjs +1281 -0
  31. package/dist/scramble-core/src/solvers/min2phase/search-wca.mjs +21 -0
  32. package/dist/scramble-core/src/solvers/min2phase/search.mjs +25 -0
  33. package/dist/scramble-core/src/solvers/min2phase/tools.mjs +169 -0
  34. package/dist/scramble-core/src/solvers/min2phase/util.mjs +30 -0
  35. package/dist/scramble-core/src/solvers/pyraminx-solver.d.mts +17 -0
  36. package/dist/scramble-core/src/solvers/pyraminx-solver.mjs +350 -0
  37. package/dist/scramble-core/src/solvers/skewb-solver.d.mts +15 -0
  38. package/dist/scramble-core/src/solvers/skewb-solver.mjs +399 -0
  39. package/dist/scramble-core/src/solvers/sq12phase/full-cube.mjs +212 -0
  40. package/dist/scramble-core/src/solvers/sq12phase/search.mjs +520 -0
  41. package/dist/scramble-core/src/solvers/sq12phase/shape.mjs +214 -0
  42. package/dist/scramble-core/src/solvers/sq12phase/square.mjs +135 -0
  43. package/dist/scramble-core/src/solvers/threephase/center.mjs +798 -0
  44. package/dist/scramble-core/src/solvers/threephase/edge.mjs +632 -0
  45. package/dist/scramble-core/src/solvers/threephase/full-cube.mjs +554 -0
  46. package/dist/scramble-core/src/solvers/threephase/search.mjs +262 -0
  47. package/dist/scramble-core/src/solvers/threephase/tables.mjs +201 -0
  48. package/dist/scramble-core/src/solvers/two-by-two-solver.d.mts +15 -0
  49. package/dist/scramble-core/src/solvers/two-by-two-solver.mjs +298 -0
  50. package/dist/scramble-core.d.mts +15 -0
  51. package/dist/scramble-core.mjs +15 -0
  52. package/dist/scramble-image/src/color.d.mts +12 -0
  53. package/dist/scramble-image/src/color.mjs +11 -0
  54. package/dist/scramble-image/src/render.d.mts +10 -0
  55. package/dist/scramble-image/src/render.mjs +71 -0
  56. package/dist/scramble-image/src/renderers/clock.d.mts +6 -0
  57. package/dist/scramble-image/src/renderers/clock.mjs +145 -0
  58. package/dist/scramble-image/src/renderers/cube-isometric.d.mts +8 -0
  59. package/dist/scramble-image/src/renderers/cube-isometric.mjs +204 -0
  60. package/dist/scramble-image/src/renderers/cube-net.d.mts +8 -0
  61. package/dist/scramble-image/src/renderers/cube-net.mjs +52 -0
  62. package/dist/scramble-image/src/renderers/megaminx-isometric.d.mts +9 -0
  63. package/dist/scramble-image/src/renderers/megaminx-isometric.mjs +320 -0
  64. package/dist/scramble-image/src/renderers/megaminx.d.mts +9 -0
  65. package/dist/scramble-image/src/renderers/megaminx.mjs +173 -0
  66. package/dist/scramble-image/src/renderers/pyraminx-isometric.d.mts +9 -0
  67. package/dist/scramble-image/src/renderers/pyraminx-isometric.mjs +185 -0
  68. package/dist/scramble-image/src/renderers/pyraminx.d.mts +9 -0
  69. package/dist/scramble-image/src/renderers/pyraminx.mjs +111 -0
  70. package/dist/scramble-image/src/renderers/skewb-isometric.d.mts +9 -0
  71. package/dist/scramble-image/src/renderers/skewb-isometric.mjs +233 -0
  72. package/dist/scramble-image/src/renderers/skewb.d.mts +9 -0
  73. package/dist/scramble-image/src/renderers/skewb.mjs +187 -0
  74. package/dist/scramble-image/src/renderers/square1.d.mts +10 -0
  75. package/dist/scramble-image/src/renderers/square1.mjs +253 -0
  76. package/dist/scramble-image/src/svg/svg-document.d.mts +6 -0
  77. package/dist/scramble-image/src/svg/svg-document.mjs +7 -0
  78. package/dist/scramble-image/src/svg/svg-elements.d.mts +15 -0
  79. package/dist/scramble-image/src/svg/svg-elements.mjs +25 -0
  80. package/dist/scramble-image/src/svg/svg-serialize.mjs +29 -0
  81. package/dist/scramble-image.d.mts +15 -0
  82. package/dist/scramble-image.mjs +15 -0
  83. package/dist/scramble-puzzle/src/algorithm.d.mts +8 -0
  84. package/dist/scramble-puzzle/src/algorithm.mjs +16 -0
  85. package/dist/scramble-puzzle/src/algorithm2.mjs +16 -0
  86. package/dist/scramble-puzzle/src/clock/clock-definition.d.mts +8 -0
  87. package/dist/scramble-puzzle/src/clock/clock-definition.mjs +18 -0
  88. package/dist/scramble-puzzle/src/clock/clock-definition2.mjs +18 -0
  89. package/dist/scramble-puzzle/src/clock/clock-parser.d.mts +18 -0
  90. package/dist/scramble-puzzle/src/clock/clock-parser.mjs +35 -0
  91. package/dist/scramble-puzzle/src/clock/clock-parser2.mjs +35 -0
  92. package/dist/scramble-puzzle/src/clock/clock-state.d.mts +8 -0
  93. package/dist/scramble-puzzle/src/clock/clock-state.mjs +212 -0
  94. package/dist/scramble-puzzle/src/clock/clock-state2.d.mts +13 -0
  95. package/dist/scramble-puzzle/src/clock/clock-state2.mjs +212 -0
  96. package/dist/scramble-puzzle/src/cube/cube-definition.d.mts +9 -0
  97. package/dist/scramble-puzzle/src/cube/cube-definition.mjs +18 -0
  98. package/dist/scramble-puzzle/src/cube/cube-definition2.mjs +18 -0
  99. package/dist/scramble-puzzle/src/cube/cube-move.d.mts +4 -0
  100. package/dist/scramble-puzzle/src/cube/cube-move2.d.mts +17 -0
  101. package/dist/scramble-puzzle/src/cube/cube-parser.d.mts +7 -0
  102. package/dist/scramble-puzzle/src/cube/cube-parser.mjs +60 -0
  103. package/dist/scramble-puzzle/src/cube/cube-parser2.mjs +60 -0
  104. package/dist/scramble-puzzle/src/cube/cube-state.d.mts +12 -0
  105. package/dist/scramble-puzzle/src/cube/cube-state.mjs +187 -0
  106. package/dist/scramble-puzzle/src/cube/cube-state2.d.mts +15 -0
  107. package/dist/scramble-puzzle/src/cube/cube-state2.mjs +187 -0
  108. package/dist/scramble-puzzle/src/errors.d.mts +15 -0
  109. package/dist/scramble-puzzle/src/errors.mjs +24 -0
  110. package/dist/scramble-puzzle/src/errors2.mjs +30 -0
  111. package/dist/scramble-puzzle/src/events.d.mts +5 -0
  112. package/dist/scramble-puzzle/src/events.mjs +90 -0
  113. package/dist/scramble-puzzle/src/events2.d.mts +98 -0
  114. package/dist/scramble-puzzle/src/events2.mjs +109 -0
  115. package/dist/scramble-puzzle/src/index.mjs +22 -0
  116. package/dist/scramble-puzzle/src/megaminx/megaminx-definition.d.mts +8 -0
  117. package/dist/scramble-puzzle/src/megaminx/megaminx-definition.mjs +18 -0
  118. package/dist/scramble-puzzle/src/megaminx/megaminx-definition2.mjs +18 -0
  119. package/dist/scramble-puzzle/src/megaminx/megaminx-parser.d.mts +5 -0
  120. package/dist/scramble-puzzle/src/megaminx/megaminx-parser.mjs +57 -0
  121. package/dist/scramble-puzzle/src/megaminx/megaminx-parser2.d.mts +20 -0
  122. package/dist/scramble-puzzle/src/megaminx/megaminx-parser2.mjs +57 -0
  123. package/dist/scramble-puzzle/src/megaminx/megaminx-state.d.mts +9 -0
  124. package/dist/scramble-puzzle/src/megaminx/megaminx-state.mjs +112 -0
  125. package/dist/scramble-puzzle/src/megaminx/megaminx-state2.d.mts +14 -0
  126. package/dist/scramble-puzzle/src/megaminx/megaminx-state2.mjs +112 -0
  127. package/dist/scramble-puzzle/src/puzzle-definition.d.mts +19 -0
  128. package/dist/scramble-puzzle/src/pyraminx/pyraminx-definition.d.mts +8 -0
  129. package/dist/scramble-puzzle/src/pyraminx/pyraminx-definition.mjs +18 -0
  130. package/dist/scramble-puzzle/src/pyraminx/pyraminx-definition2.mjs +18 -0
  131. package/dist/scramble-puzzle/src/pyraminx/pyraminx-parser.d.mts +5 -0
  132. package/dist/scramble-puzzle/src/pyraminx/pyraminx-parser.mjs +34 -0
  133. package/dist/scramble-puzzle/src/pyraminx/pyraminx-parser2.d.mts +21 -0
  134. package/dist/scramble-puzzle/src/pyraminx/pyraminx-parser2.mjs +34 -0
  135. package/dist/scramble-puzzle/src/pyraminx/pyraminx-state.d.mts +11 -0
  136. package/dist/scramble-puzzle/src/pyraminx/pyraminx-state.mjs +90 -0
  137. package/dist/scramble-puzzle/src/pyraminx/pyraminx-state2.d.mts +14 -0
  138. package/dist/scramble-puzzle/src/pyraminx/pyraminx-state2.mjs +90 -0
  139. package/dist/scramble-puzzle/src/registry.d.mts +11 -0
  140. package/dist/scramble-puzzle/src/registry.mjs +13 -0
  141. package/dist/scramble-puzzle/src/skewb/skewb-definition.d.mts +8 -0
  142. package/dist/scramble-puzzle/src/skewb/skewb-definition.mjs +18 -0
  143. package/dist/scramble-puzzle/src/skewb/skewb-definition2.mjs +18 -0
  144. package/dist/scramble-puzzle/src/skewb/skewb-parser.d.mts +5 -0
  145. package/dist/scramble-puzzle/src/skewb/skewb-parser.mjs +33 -0
  146. package/dist/scramble-puzzle/src/skewb/skewb-parser2.d.mts +14 -0
  147. package/dist/scramble-puzzle/src/skewb/skewb-parser2.mjs +33 -0
  148. package/dist/scramble-puzzle/src/skewb/skewb-state.d.mts +11 -0
  149. package/dist/scramble-puzzle/src/skewb/skewb-state.mjs +75 -0
  150. package/dist/scramble-puzzle/src/skewb/skewb-state2.d.mts +14 -0
  151. package/dist/scramble-puzzle/src/skewb/skewb-state2.mjs +75 -0
  152. package/dist/scramble-puzzle/src/square1/square1-definition.d.mts +8 -0
  153. package/dist/scramble-puzzle/src/square1/square1-definition.mjs +18 -0
  154. package/dist/scramble-puzzle/src/square1/square1-definition2.mjs +18 -0
  155. package/dist/scramble-puzzle/src/square1/square1-parser.d.mts +17 -0
  156. package/dist/scramble-puzzle/src/square1/square1-parser.mjs +43 -0
  157. package/dist/scramble-puzzle/src/square1/square1-parser2.mjs +47 -0
  158. package/dist/scramble-puzzle/src/square1/square1-state.d.mts +9 -0
  159. package/dist/scramble-puzzle/src/square1/square1-state.mjs +115 -0
  160. package/dist/scramble-puzzle/src/square1/square1-state2.d.mts +21 -0
  161. package/dist/scramble-puzzle/src/square1/square1-state2.mjs +115 -0
  162. package/dist/scramble-puzzle.d.mts +25 -0
  163. package/dist/scramble-puzzle.mjs +23 -0
  164. package/package.json +37 -0
@@ -0,0 +1,173 @@
1
+ import { MEGAMINX_FACES } from "../../../scramble-puzzle/src/megaminx/megaminx-parser.mjs";
2
+ import "../../../scramble-puzzle/src/index.mjs";
3
+ import { createSvgDocument } from "../svg/svg-document.mjs";
4
+ import { path, text } from "../svg/svg-elements.mjs";
5
+ //#region .build/vendor/scramble-image/src/renderers/megaminx.ts
6
+ const GAP = 2;
7
+ const MINX_RADIUS = 30;
8
+ const UNFOLD_HEIGHT = 2 + 3 * Math.sin(.3 * Math.PI) + Math.sin(.1 * Math.PI);
9
+ const UNFOLD_WIDTH = 4 * Math.cos(.1 * Math.PI) + 2 * Math.cos(.3 * Math.PI);
10
+ const WIDTH = Math.trunc(UNFOLD_WIDTH * 2 * MINX_RADIUS + 3 * GAP);
11
+ const HEIGHT = Math.trunc(UNFOLD_HEIGHT * MINX_RADIUS + 2 * GAP);
12
+ const STROKE = "#000000";
13
+ const STROKE_WIDTH = 1.25;
14
+ const DEFAULT_MEGAMINX_COLORS = {
15
+ U: "#ffffff",
16
+ BL: "#ffcc00",
17
+ BR: "#0000b3",
18
+ R: "#dd0000",
19
+ F: "#006600",
20
+ L: "#8a1aff",
21
+ D: "#999999",
22
+ DR: "#ffffb3",
23
+ DBR: "#ff99ff",
24
+ B: "#71e600",
25
+ DBL: "#ff8433",
26
+ DL: "#88ddff"
27
+ };
28
+ const pentagon = (centerX, centerY, pointUp) => {
29
+ return [
30
+ 1.3,
31
+ 1.7,
32
+ .1,
33
+ .5,
34
+ .9
35
+ ].map((angle) => (pointUp ? angle - .2 : angle) * Math.PI).map((angle) => ({
36
+ x: centerX + MINX_RADIUS * Math.cos(angle),
37
+ y: centerY + MINX_RADIUS * Math.sin(angle)
38
+ }));
39
+ };
40
+ const edgeLength = MINX_RADIUS * Math.sqrt(2 * (1 - Math.cos(.6 * Math.PI)));
41
+ const radiusCos18 = MINX_RADIUS * Math.cos(.1 * Math.PI);
42
+ const edgeCos18 = edgeLength * Math.cos(.1 * Math.PI);
43
+ const edgeCos54 = edgeLength * Math.cos(.3 * Math.PI);
44
+ const edgeSin18 = edgeLength * Math.sin(.1 * Math.PI);
45
+ const edgeSin54 = edgeLength * Math.sin(.3 * Math.PI);
46
+ const leftCenterX = GAP + radiusCos18 + edgeCos18 + edgeSin18 / 2;
47
+ const leftCenterY = GAP + edgeLength + MINX_RADIUS - edgeSin18;
48
+ const shift = leftCenterX + edgeSin18 * .6 + MINX_RADIUS * (Math.cos(.1 * Math.PI) + Math.cos(.2 * Math.PI));
49
+ const faceBoundary = (face) => {
50
+ switch (face) {
51
+ case "U": return pentagon(leftCenterX, leftCenterY, true);
52
+ case "BL": return pentagon(leftCenterX - edgeCos54, leftCenterY - edgeSin54, false);
53
+ case "BR": return pentagon(leftCenterX + edgeCos54, leftCenterY - edgeSin54, false);
54
+ case "R": return pentagon(leftCenterX + edgeCos18, leftCenterY + edgeSin18, false);
55
+ case "F": return pentagon(leftCenterX, leftCenterY + edgeLength, false);
56
+ case "L": return pentagon(leftCenterX - edgeCos18, leftCenterY + edgeSin18, false);
57
+ case "D": return pentagon(shift + GAP + radiusCos18 + edgeCos18, GAP + edgeLength + MINX_RADIUS, false);
58
+ case "DR": return pentagon(shift + GAP + radiusCos18 + edgeCos18 - edgeCos54, GAP + edgeLength + edgeSin54 + MINX_RADIUS, true);
59
+ case "DBR": return pentagon(shift + GAP + radiusCos18, GAP + edgeLength - edgeSin18 + MINX_RADIUS, true);
60
+ case "B": return pentagon(shift + GAP + radiusCos18 + edgeCos18, GAP + MINX_RADIUS, true);
61
+ case "DBL": return pentagon(shift + GAP + radiusCos18 + 2 * edgeCos18, GAP + edgeLength - edgeSin18 + MINX_RADIUS, true);
62
+ case "DL": return pentagon(shift + GAP + radiusCos18 + edgeCos18 + edgeCos54, GAP + edgeLength + edgeSin54 + MINX_RADIUS, true);
63
+ }
64
+ };
65
+ const det = (a, b, c, d) => a * d - b * c;
66
+ const lineIntersection = (firstStart, firstEnd, secondStart, secondEnd) => {
67
+ const firstDet = det(firstStart.x, firstStart.y, firstEnd.x, firstEnd.y);
68
+ const secondDet = det(secondStart.x, secondStart.y, secondEnd.x, secondEnd.y);
69
+ const divisor = det(firstStart.x - firstEnd.x, firstStart.y - firstEnd.y, secondStart.x - secondEnd.x, secondStart.y - secondEnd.y);
70
+ return {
71
+ x: det(firstDet, firstStart.x - firstEnd.x, secondDet, secondStart.x - secondEnd.x) / divisor,
72
+ y: det(firstDet, firstStart.y - firstEnd.y, secondDet, secondStart.y - secondEnd.y) / divisor
73
+ };
74
+ };
75
+ const polygonPath = (points) => {
76
+ const [firstPoint, ...remainingPoints] = points;
77
+ if (firstPoint === void 0) return "";
78
+ return [
79
+ `M ${firstPoint.x} ${firstPoint.y}`,
80
+ ...remainingPoints.map((pointValue) => `L ${pointValue.x} ${pointValue.y}`),
81
+ "Z"
82
+ ].join(" ");
83
+ };
84
+ const createStickerPolygons = (boundary) => {
85
+ const edgePoints = [];
86
+ for (let index = 0; index < 5; index += 1) {
87
+ const current = boundary[index];
88
+ const next = boundary[(index + 1) % 5];
89
+ edgePoints[index] = {
90
+ x: .4 * next.x + .6 * current.x,
91
+ y: .4 * next.y + .6 * current.y
92
+ };
93
+ edgePoints[index + 5] = {
94
+ x: .6 * next.x + .4 * current.x,
95
+ y: .6 * next.y + .4 * current.y
96
+ };
97
+ }
98
+ const innerPentagon = [];
99
+ for (let index = 0; index < 5; index += 1) innerPentagon[index] = lineIntersection(edgePoints[index], edgePoints[5 + (3 + index) % 5], edgePoints[(index + 1) % 5], edgePoints[5 + (4 + index) % 5]);
100
+ const stickers = [];
101
+ for (let index = 0; index < 5; index += 1) {
102
+ stickers[2 * index] = [
103
+ boundary[index],
104
+ edgePoints[index],
105
+ innerPentagon[index],
106
+ edgePoints[5 + (4 + index) % 5]
107
+ ];
108
+ stickers[2 * index + 1] = [
109
+ edgePoints[index],
110
+ edgePoints[index + 5],
111
+ innerPentagon[(index + 1) % 5],
112
+ innerPentagon[index]
113
+ ];
114
+ }
115
+ stickers[10] = innerPentagon;
116
+ return stickers;
117
+ };
118
+ const stickerIndexForOrientation = (stickerIndex, rotateCounterClockwise) => stickerIndex < 10 ? (stickerIndex + 2 * rotateCounterClockwise) % 10 : stickerIndex;
119
+ const faceRotation = (face) => {
120
+ if (face === "U") return 0;
121
+ return MEGAMINX_FACES.indexOf(face) <= 5 ? 1 : 2;
122
+ };
123
+ const colorForSticker = (facelet, colors) => colors[MEGAMINX_FACES[facelet] ?? "U"];
124
+ const drawFace = (state, face, colors) => {
125
+ const faceIndexValue = MEGAMINX_FACES.indexOf(face);
126
+ const stickers = state.image[faceIndexValue];
127
+ const rotateCounterClockwise = faceRotation(face);
128
+ return createStickerPolygons(faceBoundary(face)).map((polygon, stickerIndex) => {
129
+ const stateStickerIndex = stickerIndexForOrientation(stickerIndex, rotateCounterClockwise);
130
+ return path({
131
+ d: polygonPath(polygon),
132
+ fill: colorForSticker(stickers[stateStickerIndex], colors),
133
+ stroke: STROKE,
134
+ "stroke-width": STROKE_WIDTH,
135
+ "stroke-linejoin": "round"
136
+ });
137
+ });
138
+ };
139
+ const labelNode = (face) => {
140
+ if (face !== "U" && face !== "F") return void 0;
141
+ const innerPentagon = createStickerPolygons(faceBoundary(face))[10];
142
+ const center = innerPentagon.reduce((sum, pointValue) => ({
143
+ x: sum.x + pointValue.x,
144
+ y: sum.y + pointValue.y
145
+ }), {
146
+ x: 0,
147
+ y: 0
148
+ });
149
+ const minY = Math.min(...innerPentagon.map((pointValue) => pointValue.y));
150
+ const maxY = Math.max(...innerPentagon.map((pointValue) => pointValue.y));
151
+ return text({
152
+ x: center.x / innerPentagon.length,
153
+ y: center.y / innerPentagon.length,
154
+ style: "font-family: sans-serif",
155
+ "text-anchor": "middle",
156
+ dy: `${Math.round(Math.abs(maxY - minY) * .2)}px`
157
+ }, face);
158
+ };
159
+ const renderMegaminxState = (state, colorScheme = {}) => {
160
+ const colors = {
161
+ ...DEFAULT_MEGAMINX_COLORS,
162
+ ...colorScheme
163
+ };
164
+ const nodes = [];
165
+ for (const face of MEGAMINX_FACES) {
166
+ nodes.push(...drawFace(state, face, colors));
167
+ const label = labelNode(face);
168
+ if (label !== void 0) nodes.push(label);
169
+ }
170
+ return createSvgDocument(WIDTH, HEIGHT, nodes);
171
+ };
172
+ //#endregion
173
+ export { renderMegaminxState };
@@ -0,0 +1,9 @@
1
+ import { PyraminxFace } from "../../../scramble-puzzle/src/pyraminx/pyraminx-parser.mjs";
2
+ import { PyraminxState } from "../../../scramble-puzzle/src/pyraminx/pyraminx-state.mjs";
3
+ import { HexColor } from "../color.mjs";
4
+
5
+ //#region .build/vendor/scramble-image/src/renderers/pyraminx-isometric.d.ts
6
+ type PyraminxIsometricColorScheme = Partial<Record<PyraminxFace, HexColor>>;
7
+ declare const renderPyraminxIsometricState: (state: PyraminxState, colorScheme?: PyraminxIsometricColorScheme) => string;
8
+ //#endregion
9
+ export { PyraminxIsometricColorScheme, renderPyraminxIsometricState };
@@ -0,0 +1,185 @@
1
+ import { PYRAMINX_FACES } from "../../../scramble-puzzle/src/pyraminx/pyraminx-parser.mjs";
2
+ import "../../../scramble-puzzle/src/index.mjs";
3
+ import { createSvgDocument } from "../svg/svg-document.mjs";
4
+ import { path } from "../svg/svg-elements.mjs";
5
+ //#region .build/vendor/scramble-image/src/renderers/pyraminx-isometric.ts
6
+ const WIDTH = 370;
7
+ const HEIGHT = 146;
8
+ const STROKE = "#000000";
9
+ const STROKE_WIDTH = 2.5;
10
+ const VISIBLE_FACES = [
11
+ "F",
12
+ "L",
13
+ "R",
14
+ "D"
15
+ ];
16
+ const DEFAULT_PYRAMINX_COLORS = {
17
+ F: "#00ff00",
18
+ D: "#ffff00",
19
+ L: "#ff0000",
20
+ R: "#0000ff"
21
+ };
22
+ const FACE_BOUNDARIES = {
23
+ F: [
24
+ {
25
+ x: 90,
26
+ y: 96
27
+ },
28
+ {
29
+ x: 162,
30
+ y: 142
31
+ },
32
+ {
33
+ x: 18,
34
+ y: 142
35
+ }
36
+ ],
37
+ D: [
38
+ {
39
+ x: 202,
40
+ y: 16
41
+ },
42
+ {
43
+ x: 342,
44
+ y: 16
45
+ },
46
+ {
47
+ x: 272,
48
+ y: 138
49
+ }
50
+ ],
51
+ L: [
52
+ {
53
+ x: 90,
54
+ y: 12
55
+ },
56
+ {
57
+ x: 90,
58
+ y: 96
59
+ },
60
+ {
61
+ x: 18,
62
+ y: 142
63
+ }
64
+ ],
65
+ R: [
66
+ {
67
+ x: 90,
68
+ y: 96
69
+ },
70
+ {
71
+ x: 90,
72
+ y: 12
73
+ },
74
+ {
75
+ x: 162,
76
+ y: 142
77
+ }
78
+ ]
79
+ };
80
+ const det = (a, b, c, d) => a * d - b * c;
81
+ const lineIntersection = (firstStart, firstEnd, secondStart, secondEnd) => {
82
+ const firstDet = det(firstStart.x, firstStart.y, firstEnd.x, firstEnd.y);
83
+ const secondDet = det(secondStart.x, secondStart.y, secondEnd.x, secondEnd.y);
84
+ const divisor = det(firstStart.x - firstEnd.x, firstStart.y - firstEnd.y, secondStart.x - secondEnd.x, secondStart.y - secondEnd.y);
85
+ return {
86
+ x: det(firstDet, firstStart.x - firstEnd.x, secondDet, secondStart.x - secondEnd.x) / divisor,
87
+ y: det(firstDet, firstStart.y - firstEnd.y, secondDet, secondStart.y - secondEnd.y) / divisor
88
+ };
89
+ };
90
+ const polygonPath = (points) => {
91
+ const [firstPoint, ...remainingPoints] = points;
92
+ if (!firstPoint) return "";
93
+ return [
94
+ `M ${formatCoordinate(firstPoint.x)} ${formatCoordinate(firstPoint.y)}`,
95
+ ...remainingPoints.map((pointValue) => `L ${formatCoordinate(pointValue.x)} ${formatCoordinate(pointValue.y)}`),
96
+ "Z"
97
+ ].join(" ");
98
+ };
99
+ const formatCoordinate = (value) => Number(value.toFixed(3));
100
+ const lineworkPath = (segments) => segments.map(({ start, end }) => `M ${formatCoordinate(start.x)} ${formatCoordinate(start.y)} L ${formatCoordinate(end.x)} ${formatCoordinate(end.y)}`).join(" ");
101
+ const createStickerPolygons = (boundary) => {
102
+ const edgePoints = [];
103
+ for (let index = 0; index < 3; index += 1) {
104
+ const current = boundary[index];
105
+ const next = boundary[(index + 1) % 3];
106
+ edgePoints[index] = {
107
+ x: 1 / 3 * next.x + 2 / 3 * current.x,
108
+ y: 1 / 3 * next.y + 2 / 3 * current.y
109
+ };
110
+ edgePoints[index + 3] = {
111
+ x: 2 / 3 * next.x + 1 / 3 * current.x,
112
+ y: 2 / 3 * next.y + 1 / 3 * current.y
113
+ };
114
+ }
115
+ const center = lineIntersection(edgePoints[0], edgePoints[4], edgePoints[2], edgePoints[3]);
116
+ const stickers = [];
117
+ for (let index = 0; index < 3; index += 1) {
118
+ stickers[3 * index] = [
119
+ boundary[index],
120
+ edgePoints[index],
121
+ edgePoints[3 + (2 + index) % 3]
122
+ ];
123
+ stickers[3 * index + 1] = [
124
+ edgePoints[index],
125
+ edgePoints[3 + (index + 2) % 3],
126
+ center
127
+ ];
128
+ stickers[3 * index + 2] = [
129
+ edgePoints[index],
130
+ edgePoints[index + 3],
131
+ center
132
+ ];
133
+ }
134
+ return stickers;
135
+ };
136
+ const colorForSticker = (facelet, colors) => colors[PYRAMINX_FACES[facelet] ?? "F"];
137
+ const createFaceStickers = (state, face, colors) => {
138
+ const faceIndex = PYRAMINX_FACES.indexOf(face);
139
+ const stickers = state.image[faceIndex];
140
+ return createStickerPolygons(FACE_BOUNDARIES[face]).map((polygon, stickerIndex) => ({
141
+ points: polygon,
142
+ fill: colorForSticker(stickers[stickerIndex], colors)
143
+ }));
144
+ };
145
+ const segmentKey = ({ start, end }) => {
146
+ const startKey = `${formatCoordinate(start.x)},${formatCoordinate(start.y)}`;
147
+ const endKey = `${formatCoordinate(end.x)},${formatCoordinate(end.y)}`;
148
+ return startKey < endKey ? `${startKey}|${endKey}` : `${endKey}|${startKey}`;
149
+ };
150
+ const createLineworkSegments = (stickers) => {
151
+ const segments = /* @__PURE__ */ new Map();
152
+ for (const sticker of stickers) for (let index = 0; index < sticker.points.length; index += 1) {
153
+ const segment = {
154
+ start: sticker.points[index],
155
+ end: sticker.points[(index + 1) % sticker.points.length]
156
+ };
157
+ segments.set(segmentKey(segment), segment);
158
+ }
159
+ return [...segments.values()];
160
+ };
161
+ const drawStickers = (stickers) => stickers.map((sticker) => path({
162
+ d: polygonPath(sticker.points),
163
+ fill: sticker.fill,
164
+ stroke: "none"
165
+ }));
166
+ const drawLinework = (stickers) => path({
167
+ d: lineworkPath(createLineworkSegments(stickers)),
168
+ fill: "none",
169
+ stroke: STROKE,
170
+ "stroke-linecap": "round",
171
+ "stroke-linejoin": "round",
172
+ "stroke-width": STROKE_WIDTH
173
+ });
174
+ const drawFaces = (state, colors) => {
175
+ const stickers = VISIBLE_FACES.flatMap((face) => createFaceStickers(state, face, colors));
176
+ return [...drawStickers(stickers), drawLinework(stickers)];
177
+ };
178
+ const renderPyraminxIsometricState = (state, colorScheme = {}) => {
179
+ return createSvgDocument(WIDTH, HEIGHT, drawFaces(state, {
180
+ ...DEFAULT_PYRAMINX_COLORS,
181
+ ...colorScheme
182
+ }));
183
+ };
184
+ //#endregion
185
+ export { renderPyraminxIsometricState };
@@ -0,0 +1,9 @@
1
+ import { PyraminxFace } from "../../../scramble-puzzle/src/pyraminx/pyraminx-parser.mjs";
2
+ import { PyraminxState } from "../../../scramble-puzzle/src/pyraminx/pyraminx-state.mjs";
3
+ import { HexColor } from "../color.mjs";
4
+
5
+ //#region .build/vendor/scramble-image/src/renderers/pyraminx.d.ts
6
+ type PyraminxColorScheme = Partial<Record<PyraminxFace, HexColor>>;
7
+ declare const renderPyraminxState: (state: PyraminxState, colorScheme?: PyraminxColorScheme) => string;
8
+ //#endregion
9
+ export { PyraminxColorScheme, renderPyraminxState };
@@ -0,0 +1,111 @@
1
+ import { PYRAMINX_FACES } from "../../../scramble-puzzle/src/pyraminx/pyraminx-parser.mjs";
2
+ import "../../../scramble-puzzle/src/index.mjs";
3
+ import { createSvgDocument } from "../svg/svg-document.mjs";
4
+ import { path } from "../svg/svg-elements.mjs";
5
+ //#region .build/vendor/scramble-image/src/renderers/pyraminx.ts
6
+ const PIECE_SIZE = 30;
7
+ const GAP = 5;
8
+ const WIDTH = 6 * PIECE_SIZE + 4 * GAP;
9
+ const HEIGHT = Math.trunc(2 * 1.5 * Math.sqrt(3) * PIECE_SIZE + 3 * GAP);
10
+ const STROKE = "#000000";
11
+ const STROKE_WIDTH = 1.25;
12
+ const DEFAULT_PYRAMINX_COLORS = {
13
+ F: "#00ff00",
14
+ D: "#ffff00",
15
+ L: "#ff0000",
16
+ R: "#0000ff"
17
+ };
18
+ const det = (a, b, c, d) => a * d - b * c;
19
+ const lineIntersection = (firstStart, firstEnd, secondStart, secondEnd) => {
20
+ const firstDet = det(firstStart.x, firstStart.y, firstEnd.x, firstEnd.y);
21
+ const secondDet = det(secondStart.x, secondStart.y, secondEnd.x, secondEnd.y);
22
+ const divisor = det(firstStart.x - firstEnd.x, firstStart.y - firstEnd.y, secondStart.x - secondEnd.x, secondStart.y - secondEnd.y);
23
+ return {
24
+ x: det(firstDet, firstStart.x - firstEnd.x, secondDet, secondStart.x - secondEnd.x) / divisor,
25
+ y: det(firstDet, firstStart.y - firstEnd.y, secondDet, secondStart.y - secondEnd.y) / divisor
26
+ };
27
+ };
28
+ const triangleBoundary = (x, y, pointsUp) => {
29
+ const radius = Math.trunc(Math.sqrt(3) * PIECE_SIZE);
30
+ return [
31
+ 7 / 6,
32
+ 11 / 6,
33
+ .5
34
+ ].map((angle) => (pointsUp ? angle + 1 / 3 : angle) * Math.PI).map((angle) => ({
35
+ x: x + radius * Math.cos(angle),
36
+ y: y + radius * Math.sin(angle)
37
+ }));
38
+ };
39
+ const polygonPath = (points) => {
40
+ const [firstPoint, ...remainingPoints] = points;
41
+ if (firstPoint === void 0) return "";
42
+ return [
43
+ `M ${firstPoint.x} ${firstPoint.y}`,
44
+ ...remainingPoints.map((pointValue) => `L ${pointValue.x} ${pointValue.y}`),
45
+ "Z"
46
+ ].join(" ");
47
+ };
48
+ const createStickerPolygons = (boundary) => {
49
+ const edgePoints = [];
50
+ for (let index = 0; index < 3; index += 1) {
51
+ const current = boundary[index];
52
+ const next = boundary[(index + 1) % 3];
53
+ edgePoints[index] = {
54
+ x: 1 / 3 * next.x + 2 / 3 * current.x,
55
+ y: 1 / 3 * next.y + 2 / 3 * current.y
56
+ };
57
+ edgePoints[index + 3] = {
58
+ x: 2 / 3 * next.x + 1 / 3 * current.x,
59
+ y: 2 / 3 * next.y + 1 / 3 * current.y
60
+ };
61
+ }
62
+ const center = lineIntersection(edgePoints[0], edgePoints[4], edgePoints[2], edgePoints[3]);
63
+ const stickers = [];
64
+ for (let index = 0; index < 3; index += 1) {
65
+ stickers[3 * index] = [
66
+ boundary[index],
67
+ edgePoints[index],
68
+ edgePoints[3 + (2 + index) % 3]
69
+ ];
70
+ stickers[3 * index + 1] = [
71
+ edgePoints[index],
72
+ edgePoints[3 + (index + 2) % 3],
73
+ center
74
+ ];
75
+ stickers[3 * index + 2] = [
76
+ edgePoints[index],
77
+ edgePoints[index + 3],
78
+ center
79
+ ];
80
+ }
81
+ return stickers;
82
+ };
83
+ const faceBoundary = (face) => {
84
+ switch (face) {
85
+ case "F": return triangleBoundary(2 * GAP + 3 * PIECE_SIZE, GAP + Math.sqrt(3) * PIECE_SIZE, true);
86
+ case "D": return triangleBoundary(2 * GAP + 3 * PIECE_SIZE, 2 * GAP + 2 * Math.sqrt(3) * PIECE_SIZE, false);
87
+ case "L": return triangleBoundary(GAP + 1.5 * PIECE_SIZE, GAP + Math.sqrt(3) / 2 * PIECE_SIZE, false);
88
+ case "R": return triangleBoundary(3 * GAP + 4.5 * PIECE_SIZE, GAP + Math.sqrt(3) / 2 * PIECE_SIZE, false);
89
+ }
90
+ };
91
+ const colorForSticker = (facelet, colors) => colors[PYRAMINX_FACES[facelet] ?? "F"];
92
+ const drawFace = (state, face, colors) => {
93
+ const faceIndex = PYRAMINX_FACES.indexOf(face);
94
+ const stickers = state.image[faceIndex];
95
+ return createStickerPolygons(faceBoundary(face)).map((polygon, stickerIndex) => path({
96
+ d: polygonPath(polygon),
97
+ fill: colorForSticker(stickers[stickerIndex], colors),
98
+ stroke: STROKE,
99
+ "stroke-width": STROKE_WIDTH,
100
+ "stroke-linejoin": "round"
101
+ }));
102
+ };
103
+ const renderPyraminxState = (state, colorScheme = {}) => {
104
+ const colors = {
105
+ ...DEFAULT_PYRAMINX_COLORS,
106
+ ...colorScheme
107
+ };
108
+ return createSvgDocument(WIDTH, HEIGHT, PYRAMINX_FACES.flatMap((face) => drawFace(state, face, colors)));
109
+ };
110
+ //#endregion
111
+ export { renderPyraminxState };
@@ -0,0 +1,9 @@
1
+ import { SkewbFace } from "../../../scramble-puzzle/src/skewb/skewb-parser.mjs";
2
+ import { SkewbState } from "../../../scramble-puzzle/src/skewb/skewb-state.mjs";
3
+ import { HexColor } from "../color.mjs";
4
+
5
+ //#region .build/vendor/scramble-image/src/renderers/skewb-isometric.d.ts
6
+ type SkewbIsometricColorScheme = Partial<Record<SkewbFace, HexColor>>;
7
+ declare const renderSkewbIsometricState: (state: SkewbState, colorScheme?: SkewbIsometricColorScheme) => string;
8
+ //#endregion
9
+ export { SkewbIsometricColorScheme, renderSkewbIsometricState };