manga-renderer 1.0.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.
- package/LICENSE +17 -0
- package/README.md +118 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.js +184 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/book/book.d.ts +133 -0
- package/dist/lib/book/book.js +329 -0
- package/dist/lib/book/book.js.map +1 -0
- package/dist/lib/book/envelope.d.ts +26 -0
- package/dist/lib/book/envelope.js +158 -0
- package/dist/lib/book/envelope.js.map +1 -0
- package/dist/lib/book/imagePacking.d.ts +10 -0
- package/dist/lib/book/imagePacking.js +213 -0
- package/dist/lib/book/imagePacking.js.map +1 -0
- package/dist/lib/book/layout.d.ts +41 -0
- package/dist/lib/book/layout.js +14 -0
- package/dist/lib/book/layout.js.map +1 -0
- package/dist/lib/book/notebook.d.ts +72 -0
- package/dist/lib/book/notebook.js +30 -0
- package/dist/lib/book/notebook.js.map +1 -0
- package/dist/lib/book/richChat.d.ts +36 -0
- package/dist/lib/book/richChat.js +87 -0
- package/dist/lib/book/richChat.js.map +1 -0
- package/dist/lib/book/storyboard.d.ts +125 -0
- package/dist/lib/book/storyboard.js +44 -0
- package/dist/lib/book/storyboard.js.map +1 -0
- package/dist/lib/layeredCanvas/dataModels/bubble.d.ts +96 -0
- package/dist/lib/layeredCanvas/dataModels/bubble.js +630 -0
- package/dist/lib/layeredCanvas/dataModels/bubble.js.map +1 -0
- package/dist/lib/layeredCanvas/dataModels/effect.d.ts +25 -0
- package/dist/lib/layeredCanvas/dataModels/effect.js +104 -0
- package/dist/lib/layeredCanvas/dataModels/effect.js.map +1 -0
- package/dist/lib/layeredCanvas/dataModels/film.d.ts +44 -0
- package/dist/lib/layeredCanvas/dataModels/film.js +172 -0
- package/dist/lib/layeredCanvas/dataModels/film.js.map +1 -0
- package/dist/lib/layeredCanvas/dataModels/frameTree.d.ts +99 -0
- package/dist/lib/layeredCanvas/dataModels/frameTree.js +861 -0
- package/dist/lib/layeredCanvas/dataModels/frameTree.js.map +1 -0
- package/dist/lib/layeredCanvas/dataModels/media.d.ts +39 -0
- package/dist/lib/layeredCanvas/dataModels/media.js +69 -0
- package/dist/lib/layeredCanvas/dataModels/media.js.map +1 -0
- package/dist/lib/layeredCanvas/layers/SampleLayer.d.ts +6 -0
- package/dist/lib/layeredCanvas/layers/SampleLayer.js +22 -0
- package/dist/lib/layeredCanvas/layers/SampleLayer.js.map +1 -0
- package/dist/lib/layeredCanvas/layers/arrayLayer.d.ts +49 -0
- package/dist/lib/layeredCanvas/layers/arrayLayer.js +364 -0
- package/dist/lib/layeredCanvas/layers/arrayLayer.js.map +1 -0
- package/dist/lib/layeredCanvas/layers/bubbleLayer.d.ts +97 -0
- package/dist/lib/layeredCanvas/layers/bubbleLayer.js +1418 -0
- package/dist/lib/layeredCanvas/layers/bubbleLayer.js.map +1 -0
- package/dist/lib/layeredCanvas/layers/floorLayer.d.ts +13 -0
- package/dist/lib/layeredCanvas/layers/floorLayer.js +64 -0
- package/dist/lib/layeredCanvas/layers/floorLayer.js.map +1 -0
- package/dist/lib/layeredCanvas/layers/frameLayer.d.ts +106 -0
- package/dist/lib/layeredCanvas/layers/frameLayer.js +1283 -0
- package/dist/lib/layeredCanvas/layers/frameLayer.js.map +1 -0
- package/dist/lib/layeredCanvas/layers/inlinePainterLayer.d.ts +33 -0
- package/dist/lib/layeredCanvas/layers/inlinePainterLayer.js +222 -0
- package/dist/lib/layeredCanvas/layers/inlinePainterLayer.js.map +1 -0
- package/dist/lib/layeredCanvas/layers/paperRendererLayer.d.ts +64 -0
- package/dist/lib/layeredCanvas/layers/paperRendererLayer.js +443 -0
- package/dist/lib/layeredCanvas/layers/paperRendererLayer.js.map +1 -0
- package/dist/lib/layeredCanvas/layers/undoLayer.d.ts +8 -0
- package/dist/lib/layeredCanvas/layers/undoLayer.js +24 -0
- package/dist/lib/layeredCanvas/layers/undoLayer.js.map +1 -0
- package/dist/lib/layeredCanvas/system/keyCache.d.ts +4 -0
- package/dist/lib/layeredCanvas/system/keyCache.js +61 -0
- package/dist/lib/layeredCanvas/system/keyCache.js.map +1 -0
- package/dist/lib/layeredCanvas/system/layeredCanvas.d.ts +172 -0
- package/dist/lib/layeredCanvas/system/layeredCanvas.js +597 -0
- package/dist/lib/layeredCanvas/system/layeredCanvas.js.map +1 -0
- package/dist/lib/layeredCanvas/system/paperArray.d.ts +29 -0
- package/dist/lib/layeredCanvas/system/paperArray.js +108 -0
- package/dist/lib/layeredCanvas/system/paperArray.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/draw/bubbleGraphic.d.ts +7 -0
- package/dist/lib/layeredCanvas/tools/draw/bubbleGraphic.js +728 -0
- package/dist/lib/layeredCanvas/tools/draw/bubbleGraphic.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/draw/clickableIcon.d.ts +42 -0
- package/dist/lib/layeredCanvas/tools/draw/clickableIcon.js +129 -0
- package/dist/lib/layeredCanvas/tools/draw/clickableIcon.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/draw/drawFilmStack.d.ts +4 -0
- package/dist/lib/layeredCanvas/tools/draw/drawFilmStack.js +53 -0
- package/dist/lib/layeredCanvas/tools/draw/drawFilmStack.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/draw/drawText.d.ts +8 -0
- package/dist/lib/layeredCanvas/tools/draw/drawText.js +45 -0
- package/dist/lib/layeredCanvas/tools/draw/drawText.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/draw/richText.d.ts +15 -0
- package/dist/lib/layeredCanvas/tools/draw/richText.js +172 -0
- package/dist/lib/layeredCanvas/tools/draw/richText.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/draw/selectionFrame.d.ts +5 -0
- package/dist/lib/layeredCanvas/tools/draw/selectionFrame.js +63 -0
- package/dist/lib/layeredCanvas/tools/draw/selectionFrame.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/draw/typeSetting.d.ts +16 -0
- package/dist/lib/layeredCanvas/tools/draw/typeSetting.js +2 -0
- package/dist/lib/layeredCanvas/tools/draw/typeSetting.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/draw/verticalText.d.ts +3 -0
- package/dist/lib/layeredCanvas/tools/draw/verticalText.js +230 -0
- package/dist/lib/layeredCanvas/tools/draw/verticalText.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/focusKeeper.d.ts +8 -0
- package/dist/lib/layeredCanvas/tools/focusKeeper.js +15 -0
- package/dist/lib/layeredCanvas/tools/focusKeeper.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/frameExamples.d.ts +382 -0
- package/dist/lib/layeredCanvas/tools/frameExamples.js +758 -0
- package/dist/lib/layeredCanvas/tools/frameExamples.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/geometry/bubbleGeometry.d.ts +12 -0
- package/dist/lib/layeredCanvas/tools/geometry/bubbleGeometry.js +117 -0
- package/dist/lib/layeredCanvas/tools/geometry/bubbleGeometry.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/geometry/convertPoint.d.ts +2 -0
- package/dist/lib/layeredCanvas/tools/geometry/convertPoint.js +25 -0
- package/dist/lib/layeredCanvas/tools/geometry/convertPoint.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/geometry/geometry.d.ts +69 -0
- package/dist/lib/layeredCanvas/tools/geometry/geometry.js +408 -0
- package/dist/lib/layeredCanvas/tools/geometry/geometry.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/geometry/geometry.vitest.d.ts +1 -0
- package/dist/lib/layeredCanvas/tools/geometry/geometry.vitest.js +58 -0
- package/dist/lib/layeredCanvas/tools/geometry/geometry.vitest.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/geometry/quickHull.d.ts +10 -0
- package/dist/lib/layeredCanvas/tools/geometry/quickHull.js +91 -0
- package/dist/lib/layeredCanvas/tools/geometry/quickHull.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/geometry/trapezoid.d.ts +18 -0
- package/dist/lib/layeredCanvas/tools/geometry/trapezoid.js +105 -0
- package/dist/lib/layeredCanvas/tools/geometry/trapezoid.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/grid.d.ts +7 -0
- package/dist/lib/layeredCanvas/tools/grid.js +16 -0
- package/dist/lib/layeredCanvas/tools/grid.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/haiku.d.ts +1 -0
- package/dist/lib/layeredCanvas/tools/haiku.js +17 -0
- package/dist/lib/layeredCanvas/tools/haiku.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/imageUtil.d.ts +8 -0
- package/dist/lib/layeredCanvas/tools/imageUtil.js +58 -0
- package/dist/lib/layeredCanvas/tools/imageUtil.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/kinsoku.d.ts +26 -0
- package/dist/lib/layeredCanvas/tools/kinsoku.js +124 -0
- package/dist/lib/layeredCanvas/tools/kinsoku.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/misc.d.ts +25 -0
- package/dist/lib/layeredCanvas/tools/misc.js +46 -0
- package/dist/lib/layeredCanvas/tools/misc.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/perfectFreehandUtil.d.ts +2 -0
- package/dist/lib/layeredCanvas/tools/perfectFreehandUtil.js +21 -0
- package/dist/lib/layeredCanvas/tools/perfectFreehandUtil.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/pictureControl.d.ts +4 -0
- package/dist/lib/layeredCanvas/tools/pictureControl.js +24 -0
- package/dist/lib/layeredCanvas/tools/pictureControl.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/rectHandle.d.ts +6 -0
- package/dist/lib/layeredCanvas/tools/rectHandle.js +17 -0
- package/dist/lib/layeredCanvas/tools/rectHandle.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
export function add2D(v0, v1) {
|
|
2
|
+
return [v0[0] + v1[0], v0[1] + v1[1]];
|
|
3
|
+
}
|
|
4
|
+
export function subtract2D(v0, v1) {
|
|
5
|
+
return [v0[0] - v1[0], v0[1] - v1[1]];
|
|
6
|
+
}
|
|
7
|
+
export function scale2D(v, n) {
|
|
8
|
+
return [v[0] * n, v[1] * n];
|
|
9
|
+
}
|
|
10
|
+
export function multiply2D(v0, v1) {
|
|
11
|
+
return [v0[0] * v1[0], v0[1] * v1[1]];
|
|
12
|
+
}
|
|
13
|
+
export function dot2D(vectorA, vectorB) {
|
|
14
|
+
return vectorA[0] * vectorB[0] + vectorA[1] * vectorB[1];
|
|
15
|
+
}
|
|
16
|
+
export function cross2D(vectorA, vectorB) {
|
|
17
|
+
return vectorA[0] * vectorB[1] - vectorA[1] * vectorB[0];
|
|
18
|
+
}
|
|
19
|
+
export function magnitude2D(vector) {
|
|
20
|
+
return Math.hypot(...vector);
|
|
21
|
+
}
|
|
22
|
+
export function magnitudeSq2D(vector) {
|
|
23
|
+
return vector[0] * vector[0] + vector[1] * vector[1];
|
|
24
|
+
}
|
|
25
|
+
export function distance2D(v0, v1) {
|
|
26
|
+
return magnitude2D(subtract2D(v0, v1));
|
|
27
|
+
}
|
|
28
|
+
export function distanceSq2D(v0, v1) {
|
|
29
|
+
return magnitudeSq2D(subtract2D(v0, v1));
|
|
30
|
+
}
|
|
31
|
+
export function perpendicular2D(v, n = 1) {
|
|
32
|
+
const [x, y] = v;
|
|
33
|
+
return [-y * n, x * n];
|
|
34
|
+
}
|
|
35
|
+
export function reverse2D(v) {
|
|
36
|
+
return [-v[0], -v[1]];
|
|
37
|
+
}
|
|
38
|
+
export function normalize2D(v, n = 1) {
|
|
39
|
+
const [x, y] = v;
|
|
40
|
+
const l = Math.hypot(x, y);
|
|
41
|
+
if (l < 0.0001) {
|
|
42
|
+
return [0.0, 0.0];
|
|
43
|
+
}
|
|
44
|
+
return [n * x / l, n * y / l];
|
|
45
|
+
}
|
|
46
|
+
export function floor2D(v) {
|
|
47
|
+
return [Math.floor(v[0]), Math.floor(v[1])];
|
|
48
|
+
}
|
|
49
|
+
export function ceil2D(v) {
|
|
50
|
+
return [Math.ceil(v[0]), Math.ceil(v[1])];
|
|
51
|
+
}
|
|
52
|
+
export function round2D(v) {
|
|
53
|
+
return [Math.round(v[0]), Math.round(v[1])];
|
|
54
|
+
}
|
|
55
|
+
export function reciprocal2D(v) {
|
|
56
|
+
return [1 / v[0], 1 / v[1]];
|
|
57
|
+
}
|
|
58
|
+
export function projectionScalingFactor2D(a, b) {
|
|
59
|
+
return dot2D(a, b) / dot2D(b, b);
|
|
60
|
+
}
|
|
61
|
+
export function projection2D(a, b) {
|
|
62
|
+
const factor = projectionScalingFactor2D(a, b);
|
|
63
|
+
return [b[0] * factor, b[1] * factor];
|
|
64
|
+
}
|
|
65
|
+
export function signedAngle(lhs, rhs) {
|
|
66
|
+
return Math.atan2(cross2D(lhs, rhs), dot2D(lhs, rhs));
|
|
67
|
+
}
|
|
68
|
+
export function angleBetween(lhs, rhs) {
|
|
69
|
+
return Math.abs(signedAngle(lhs, rhs));
|
|
70
|
+
}
|
|
71
|
+
export function positiveAngle(lhs, rhs) {
|
|
72
|
+
const a = signedAngle(lhs, rhs);
|
|
73
|
+
return a < 0 ? a + Math.PI * 2 : a;
|
|
74
|
+
}
|
|
75
|
+
export function getSide(A, B, C, D) {
|
|
76
|
+
const BA = [A[0] - B[0], A[1] - B[1]];
|
|
77
|
+
const BD = [D[0] - B[0], D[1] - B[1]];
|
|
78
|
+
const BC = [C[0] - B[0], C[1] - B[1]];
|
|
79
|
+
const theta0 = positiveAngle(BA, BD);
|
|
80
|
+
const theta1 = positiveAngle(BA, BC);
|
|
81
|
+
if (theta0 === 0 || theta0 === theta1) {
|
|
82
|
+
return 0;
|
|
83
|
+
}
|
|
84
|
+
else if (theta0 < theta1) {
|
|
85
|
+
return 1;
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
return -1;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
export function slerp2D(ca, cb, t) {
|
|
92
|
+
const calen = magnitude2D(ca);
|
|
93
|
+
const cblen = magnitude2D(cb);
|
|
94
|
+
const lent = calen + (cblen - calen) * t;
|
|
95
|
+
const cq = [ca[0] * lent / calen, ca[1] * lent / calen];
|
|
96
|
+
const angle = signedAngle(ca, cb) * t;
|
|
97
|
+
const xt = cq[0] * Math.cos(angle) - cq[1] * Math.sin(angle);
|
|
98
|
+
const yt = cq[0] * Math.sin(angle) + cq[1] * Math.cos(angle);
|
|
99
|
+
return [xt, yt];
|
|
100
|
+
}
|
|
101
|
+
export function lerp2D(ca, cb, t) {
|
|
102
|
+
return [ca[0] + (cb[0] - ca[0]) * t, ca[1] + (cb[1] - ca[1]) * t];
|
|
103
|
+
}
|
|
104
|
+
export function normalizedAngle(angle) {
|
|
105
|
+
return (angle + Math.PI) % (2 * Math.PI) - Math.PI;
|
|
106
|
+
}
|
|
107
|
+
export function angleDifference(angle1, angle2) {
|
|
108
|
+
const phi = Math.abs(angle1 - angle2) % (Math.PI * 2);
|
|
109
|
+
return phi > Math.PI ? Math.PI * 2 - phi : phi;
|
|
110
|
+
}
|
|
111
|
+
export function superEllipsePoint2D(a, b, n, theta) {
|
|
112
|
+
const cosTheta = Math.cos(theta);
|
|
113
|
+
const sinTheta = Math.sin(theta);
|
|
114
|
+
const x = a * Math.sign(cosTheta) * Math.pow(Math.abs(cosTheta), 2 / n);
|
|
115
|
+
const y = b * Math.sign(sinTheta) * Math.pow(Math.abs(sinTheta), 2 / n);
|
|
116
|
+
return [x, y];
|
|
117
|
+
}
|
|
118
|
+
export function line(p1, p2, offset = [0, 0]) {
|
|
119
|
+
return [[p1[0] + offset[0], p1[1] + offset[1]], [p2[0] + offset[0], p2[1] + offset[1]]];
|
|
120
|
+
}
|
|
121
|
+
export function line2(p1, theta, offset = [0, 0]) {
|
|
122
|
+
const q = [p1[0] + offset[0], p1[1] + offset[1]];
|
|
123
|
+
return [q, [q[0] + Math.cos(theta), q[1] + Math.sin(theta)]];
|
|
124
|
+
}
|
|
125
|
+
export function lineIntersection(line1, line2) {
|
|
126
|
+
const [[x1, y1], [x2, y2]] = line1;
|
|
127
|
+
const [[x3, y3], [x4, y4]] = line2;
|
|
128
|
+
const denom = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);
|
|
129
|
+
if (denom === 0) {
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
const x = ((x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4)) / denom;
|
|
133
|
+
const y = ((x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4)) / denom;
|
|
134
|
+
return [x, y];
|
|
135
|
+
}
|
|
136
|
+
export function deg2rad(deg) {
|
|
137
|
+
return deg * Math.PI / 180;
|
|
138
|
+
}
|
|
139
|
+
export function rad2deg(rad) {
|
|
140
|
+
return rad * 180 / Math.PI;
|
|
141
|
+
}
|
|
142
|
+
export function rotate2D(point, theta) {
|
|
143
|
+
const cosTheta = Math.cos(theta);
|
|
144
|
+
const sinTheta = Math.sin(theta);
|
|
145
|
+
return [point[0] * cosTheta - point[1] * sinTheta, point[0] * sinTheta + point[1] * cosTheta];
|
|
146
|
+
}
|
|
147
|
+
export function clamp(x, min = 0, max = 1) {
|
|
148
|
+
return Math.max(min, Math.min(max, x));
|
|
149
|
+
}
|
|
150
|
+
export function center2D(p0, p1) {
|
|
151
|
+
return [(p0[0] + p1[0]) * 0.5, (p0[1] + p1[1]) * 0.5];
|
|
152
|
+
}
|
|
153
|
+
export function isPointInTriangle(p, tri) {
|
|
154
|
+
const [p0, p1, p2] = tri;
|
|
155
|
+
const area2 = (p1[0] - p0[0]) * (p2[1] - p0[1]) -
|
|
156
|
+
(p1[1] - p0[1]) * (p2[0] - p0[0]);
|
|
157
|
+
if (area2 === 0) {
|
|
158
|
+
// 退化しているため、false を返す
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
const s = (p0[0] - p2[0]) * (p[1] - p2[1]) - (p0[1] - p2[1]) * (p[0] - p2[0]);
|
|
162
|
+
const t = (p1[0] - p0[0]) * (p[1] - p0[1]) - (p1[1] - p0[1]) * (p[0] - p0[0]);
|
|
163
|
+
if ((s < 0) !== (t < 0) && s !== 0 && t !== 0) {
|
|
164
|
+
return false;
|
|
165
|
+
}
|
|
166
|
+
const d = (p2[0] - p1[0]) * (p[1] - p1[1]) - (p2[1] - p1[1]) * (p[0] - p1[0]);
|
|
167
|
+
return d === 0 || (d < 0) === (s + t <= 0);
|
|
168
|
+
}
|
|
169
|
+
export function pointToLineDistance(p, line) {
|
|
170
|
+
const [a, b] = line;
|
|
171
|
+
const ab = subtract2D(b, a);
|
|
172
|
+
const ap = subtract2D(p, a);
|
|
173
|
+
const abLength = Math.hypot(ab[0], ab[1]);
|
|
174
|
+
// 線分がほぼゼロ長の場合、点aから点pへの距離を返す
|
|
175
|
+
if (abLength < 1e-10) {
|
|
176
|
+
return Math.hypot(ap[0], ap[1]);
|
|
177
|
+
}
|
|
178
|
+
// 外積を利用して距離を計算
|
|
179
|
+
const cross = Math.abs(ab[0] * ap[1] - ab[1] * ap[0]);
|
|
180
|
+
return cross / abLength;
|
|
181
|
+
}
|
|
182
|
+
export function pointToSegmentDistance(p, segment) {
|
|
183
|
+
const [a, b] = segment;
|
|
184
|
+
const ab = subtract2D(b, a);
|
|
185
|
+
const ap = subtract2D(p, a);
|
|
186
|
+
const abSquared = dot2D(ab, ab);
|
|
187
|
+
// 線分がほぼゼロ長の場合、点aから点pへの距離を返す
|
|
188
|
+
if (abSquared < 1e-10) {
|
|
189
|
+
return Math.hypot(ap[0], ap[1]);
|
|
190
|
+
}
|
|
191
|
+
// 投影係数 t を計算し、0から1にクランプする
|
|
192
|
+
const t = Math.max(0, Math.min(1, dot2D(ap, ab) / abSquared));
|
|
193
|
+
// 投影点の座標を計算
|
|
194
|
+
const projection = [a[0] + ab[0] * t, a[1] + ab[1] * t];
|
|
195
|
+
// 点pから投影点への距離を計算
|
|
196
|
+
return Math.hypot(p[0] - projection[0], p[1] - projection[1]);
|
|
197
|
+
}
|
|
198
|
+
export function pointToTriangleDistance(p, t, ignoresinverted = false) {
|
|
199
|
+
// 3点が同一直線上にある場合、点と直線の距離を返す
|
|
200
|
+
const colinear = getColinearLineSegment(t);
|
|
201
|
+
if (colinear) {
|
|
202
|
+
return pointToSegmentDistance(p, colinear);
|
|
203
|
+
}
|
|
204
|
+
// 三角形が反時計回りの場合、オプションによっては無視する
|
|
205
|
+
if (ignoresinverted && isTriangleCounterClockwise(t)) {
|
|
206
|
+
return Infinity;
|
|
207
|
+
}
|
|
208
|
+
// 三角形内部に点がある場合、0を返す
|
|
209
|
+
if (isPointInTriangle(p, t)) {
|
|
210
|
+
return 0;
|
|
211
|
+
}
|
|
212
|
+
// 最も近い辺までの距離を計算
|
|
213
|
+
const [A, B, C] = t;
|
|
214
|
+
const d0 = pointToSegmentDistance(p, [A, B]);
|
|
215
|
+
const d1 = pointToSegmentDistance(p, [B, C]);
|
|
216
|
+
const d2 = pointToSegmentDistance(p, [C, A]);
|
|
217
|
+
return Math.min(d0, d1, d2);
|
|
218
|
+
}
|
|
219
|
+
export function rectIntersectsRect(r0, r1) {
|
|
220
|
+
return r0[0] < r1[0] + r1[2] && r0[0] + r0[2] > r1[0] && r0[1] < r1[1] + r1[3] && r0[1] + r0[3] > r1[1];
|
|
221
|
+
}
|
|
222
|
+
export function rectContains(r, p) {
|
|
223
|
+
return p[0] >= r[0] && p[0] <= r[0] + r[2] && p[1] >= r[1] && p[1] <= r[1] + r[3];
|
|
224
|
+
}
|
|
225
|
+
export function rectToPointDistance(r, p) {
|
|
226
|
+
const [x, y] = p;
|
|
227
|
+
const [x0, y0, w, h] = r;
|
|
228
|
+
const [x1, y1] = [x0 + w, y0 + h];
|
|
229
|
+
var dx = Math.max(x0 - x, 0, x - x1);
|
|
230
|
+
var dy = Math.max(y0 - y, 0, y - y1);
|
|
231
|
+
return Math.sqrt(dx * dx + dy * dy);
|
|
232
|
+
}
|
|
233
|
+
export function rectToCorners(r) {
|
|
234
|
+
const [x, y, w, h] = r;
|
|
235
|
+
return [[x, y], [x + w, y], [x + w, y + h], [x, y + h]];
|
|
236
|
+
}
|
|
237
|
+
export function extendRect(r, n) {
|
|
238
|
+
return [r[0] - n, r[1] - n, r[2] + 2 * n, r[3] + 2 * n];
|
|
239
|
+
}
|
|
240
|
+
export function vectorEquals(v0, v1) {
|
|
241
|
+
return v0[0] === v1[0] && v0[1] === v1[1];
|
|
242
|
+
}
|
|
243
|
+
export function isVectorZero(v) {
|
|
244
|
+
return v[0] === 0 && v[1] === 0;
|
|
245
|
+
}
|
|
246
|
+
export function rect2Box(r) {
|
|
247
|
+
return [[r[0], r[1]], [r[0] + r[2], r[1] + r[3]]];
|
|
248
|
+
}
|
|
249
|
+
export function box2Rect(b) {
|
|
250
|
+
return [b[0][0], b[0][1], b[1][0] - b[0][0], b[1][1] - b[0][1]];
|
|
251
|
+
}
|
|
252
|
+
export function ensureMinRectSize(minSize, r) {
|
|
253
|
+
let mx, my;
|
|
254
|
+
if (typeof minSize === 'number') {
|
|
255
|
+
mx = my = minSize;
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
[mx, my] = minSize;
|
|
259
|
+
}
|
|
260
|
+
let [x, y, w, h] = r;
|
|
261
|
+
const nw = Math.max(w, mx);
|
|
262
|
+
const nh = Math.max(h, my);
|
|
263
|
+
x = x + (w - nw) / 2;
|
|
264
|
+
y = y + (h - nh) / 2;
|
|
265
|
+
w = nw;
|
|
266
|
+
h = nh;
|
|
267
|
+
return [x, y, w, h];
|
|
268
|
+
}
|
|
269
|
+
// アスペクト比を変更しない移動量最小の最小外接矩形
|
|
270
|
+
export function computeConstraintedRect(targetRect, constraintRect) {
|
|
271
|
+
const [x0, y0, w, h] = constraintRect;
|
|
272
|
+
const [x1, y1] = [x0 + w, y0 + h];
|
|
273
|
+
const [_tx, _ty, tw, th] = targetRect;
|
|
274
|
+
const [opx, opy] = getRectCenter(targetRect);
|
|
275
|
+
const [cx, cy] = getRectCenter(constraintRect);
|
|
276
|
+
let scale = 1;
|
|
277
|
+
if (tw * scale < w) {
|
|
278
|
+
scale = w / tw;
|
|
279
|
+
}
|
|
280
|
+
if (th * scale < h) {
|
|
281
|
+
scale = h / th;
|
|
282
|
+
}
|
|
283
|
+
const [npx, npy] = [(opx - cx) * scale + cx, (opy - cy) * scale + cy];
|
|
284
|
+
const [nw, nh] = [tw * scale, th * scale];
|
|
285
|
+
const [nx0, ny0] = [npx - nw / 2, npy - nh / 2];
|
|
286
|
+
const [nx1, ny1] = [nx0 + nw, ny0 + nh];
|
|
287
|
+
let [mx, my] = [0, 0];
|
|
288
|
+
if (x0 < nx0) {
|
|
289
|
+
mx -= nx0 - x0;
|
|
290
|
+
}
|
|
291
|
+
if (y0 < ny0) {
|
|
292
|
+
my -= ny0 - y0;
|
|
293
|
+
}
|
|
294
|
+
if (nx1 < x1) {
|
|
295
|
+
mx += x1 - nx1;
|
|
296
|
+
}
|
|
297
|
+
if (ny1 < y1) {
|
|
298
|
+
my += y1 - ny1;
|
|
299
|
+
}
|
|
300
|
+
return { scale, translation: [mx / scale, my / scale] };
|
|
301
|
+
}
|
|
302
|
+
export function computeBoundingRectFromRects(rects) {
|
|
303
|
+
let [x0, y0, x1, y1] = [Infinity, Infinity, -Infinity, -Infinity];
|
|
304
|
+
for (const r of rects) {
|
|
305
|
+
const [x, y, w, h] = r;
|
|
306
|
+
x0 = Math.min(x0, x);
|
|
307
|
+
y0 = Math.min(y0, y);
|
|
308
|
+
x1 = Math.max(x1, x + w);
|
|
309
|
+
y1 = Math.max(y1, y + h);
|
|
310
|
+
}
|
|
311
|
+
return [x0, y0, x1 - x0, y1 - y0];
|
|
312
|
+
}
|
|
313
|
+
export function getRectCenter(r) {
|
|
314
|
+
return [r[0] + r[2] / 2, r[1] + r[3] / 2];
|
|
315
|
+
}
|
|
316
|
+
export function translateRect(r, v) {
|
|
317
|
+
return [r[0] + v[0], r[1] + v[1], r[2], r[3]];
|
|
318
|
+
}
|
|
319
|
+
export function scaleRect(r, s) {
|
|
320
|
+
return [r[0] * s, r[1] * s, r[2] * s, r[3] * s];
|
|
321
|
+
}
|
|
322
|
+
export function minimumBoundingScale(objectSize, containerSize) {
|
|
323
|
+
return Math.max(containerSize[0] / objectSize[0], containerSize[1] / objectSize[1]);
|
|
324
|
+
}
|
|
325
|
+
export function isTriangleClockwise([v0, v1, v2]) {
|
|
326
|
+
const cross = (v1[0] - v0[0]) * (v2[1] - v0[1]) - (v1[1] - v0[1]) * (v2[0] - v0[0]);
|
|
327
|
+
return 0 < cross; // Y軸が数学的座標系と逆のため
|
|
328
|
+
}
|
|
329
|
+
export function isTriangleCounterClockwise([v0, v1, v2]) {
|
|
330
|
+
const cross = (v1[0] - v0[0]) * (v2[1] - v0[1]) - (v1[1] - v0[1]) * (v2[0] - v0[0]);
|
|
331
|
+
return cross < 0; // Y軸が数学的座標系と逆のため
|
|
332
|
+
}
|
|
333
|
+
export function getColinearLineSegment(tri) {
|
|
334
|
+
const [p1, p2, p3] = tri;
|
|
335
|
+
function vectorNearlyEquals(v0, v1) {
|
|
336
|
+
return distanceSq2D(v0, v1) < 1e-10;
|
|
337
|
+
}
|
|
338
|
+
// 同一点の判定(結果が結局点になることもある)
|
|
339
|
+
if (vectorNearlyEquals(p1, p3)) {
|
|
340
|
+
return [p1, p2];
|
|
341
|
+
}
|
|
342
|
+
if (vectorNearlyEquals(p1, p2)) {
|
|
343
|
+
return [p2, p3];
|
|
344
|
+
}
|
|
345
|
+
if (vectorNearlyEquals(p2, p3)) {
|
|
346
|
+
return [p1, p3];
|
|
347
|
+
}
|
|
348
|
+
// ここまできたら3点すべて別
|
|
349
|
+
const [x1, y1] = p1;
|
|
350
|
+
const [x2, y2] = p2;
|
|
351
|
+
const [x3, y3] = p3;
|
|
352
|
+
if (1e-10 <= Math.abs((x2 - x1) * (y3 - y1) - (y2 - y1) * (x3 - x1))) {
|
|
353
|
+
// 面積がある=直線ではない
|
|
354
|
+
return null;
|
|
355
|
+
}
|
|
356
|
+
const [dx, dy] = subtract2D(p3, p1);
|
|
357
|
+
const lengthSquared = magnitudeSq2D([dx, dy]); // すでに判定済みなので0でない
|
|
358
|
+
let t = ((x2 - x1) * dx + (y2 - y1) * dy) / lengthSquared;
|
|
359
|
+
if (t <= 0) {
|
|
360
|
+
return [p2, p3];
|
|
361
|
+
}
|
|
362
|
+
else if (t >= 1) {
|
|
363
|
+
return [p1, p2];
|
|
364
|
+
}
|
|
365
|
+
else {
|
|
366
|
+
return [p1, p3];
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
export function signed2DTriangleArea(a, b, c) {
|
|
370
|
+
return (a[0] - c[0]) * (b[1] - c[1]) - (a[1] - c[1]) * (b[0] - c[0]);
|
|
371
|
+
}
|
|
372
|
+
// ゲームプログラミングのためのリアルタイム衝突判定 p151
|
|
373
|
+
// ただしいくつかの境界条件を加味してrobustにした
|
|
374
|
+
export function testSegmentIntersection(s0, s1) {
|
|
375
|
+
const [a, b] = s0;
|
|
376
|
+
const [c, d] = s1;
|
|
377
|
+
const a1 = signed2DTriangleArea(a, b, d);
|
|
378
|
+
const a2 = signed2DTriangleArea(a, b, c);
|
|
379
|
+
// 修正点: < 0 を <= 0 に変更して端点での交差を許容
|
|
380
|
+
if (a1 * a2 <= 0) {
|
|
381
|
+
const a3 = signed2DTriangleArea(c, d, a);
|
|
382
|
+
const a4 = signed2DTriangleArea(c, d, b);
|
|
383
|
+
// 同様に < 0 を <= 0 に変更
|
|
384
|
+
if (a3 * a4 <= 0) {
|
|
385
|
+
const denominator = a1 - a2;
|
|
386
|
+
// denominator が 0 の場合、線分が平行または重なっている
|
|
387
|
+
if (denominator === 0) {
|
|
388
|
+
// 特殊ケースの処理(必要に応じて実装)
|
|
389
|
+
return null;
|
|
390
|
+
}
|
|
391
|
+
const t = a3 / denominator;
|
|
392
|
+
// t が 0 <= t <= 1 の範囲にあることを確認
|
|
393
|
+
if (t >= 0 && t <= 1) {
|
|
394
|
+
const p = lerp2D(a, b, t);
|
|
395
|
+
return [t, p];
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
return null;
|
|
400
|
+
}
|
|
401
|
+
export function segmentIntersection(s0, s1) {
|
|
402
|
+
const result = testSegmentIntersection(s0, s1);
|
|
403
|
+
return result ? result[1] : null;
|
|
404
|
+
}
|
|
405
|
+
export function denormalizePositionInRect(p, r) {
|
|
406
|
+
return [r[0] + r[2] * p[0], r[1] + r[3] * p[1]];
|
|
407
|
+
}
|
|
408
|
+
//# sourceMappingURL=geometry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometry.js","sourceRoot":"","sources":["../../../../../src/lib/layeredCanvas/tools/geometry/geometry.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,KAAK,CAAC,EAAU,EAAE,EAAU;IAC1C,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAU,EAAE,EAAU;IAC/C,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,CAAS,EAAE,CAAS;IAC1C,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAU,EAAE,EAAU;IAC/C,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,OAAe,EAAE,OAAe;IACpD,OAAO,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAe,EAAE,OAAe;IACtD,OAAO,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAU,EAAE,EAAU;IAC/C,OAAO,WAAW,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,EAAU,EAAE,EAAU;IACjD,OAAO,aAAa,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,CAAS,EAAE,IAAY,CAAC;IACtD,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IACjB,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,CAAS;IACjC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,CAAS,EAAE,IAAY,CAAC;IAClD,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IACjB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3B,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,CAAS;IAC/B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,CAAS;IAC9B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,CAAS;IAC/B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,CAAS;IACpC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,CAAS,EAAE,CAAS;IAC5D,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,CAAS,EAAE,CAAS;IAC/C,MAAM,MAAM,GAAG,yBAAyB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/C,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAW,EAAE,GAAW;IAClD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,GAAW;IACnD,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,GAAW;IACpD,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS;IAChE,MAAM,EAAE,GAAW,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,MAAM,EAAE,GAAW,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,MAAM,EAAE,GAAW,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAErC,IAAI,MAAM,KAAK,CAAC,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtC,OAAO,CAAC,CAAC;IACX,CAAC;SAAM,IAAI,MAAM,GAAG,MAAM,EAAE,CAAC;QAC3B,OAAO,CAAC,CAAC;IACX,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,CAAC,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,EAAU,EAAE,EAAU,EAAE,CAAS;IACvD,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;IAC9B,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,KAAK,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;IACzC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC,CAAC;IAExD,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC7D,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAE7D,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,EAAU,EAAE,EAAU,EAAE,CAAS;IACtD,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAc,EAAE,MAAc;IAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IACtD,OAAO,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,KAAa;IAChF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxE,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,EAAU,EAAE,EAAU,EAAE,SAAiB,CAAC,CAAC,EAAE,CAAC,CAAC;IAClE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1F,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,EAAU,EAAE,KAAa,EAAE,SAAiB,CAAC,CAAC,EAAE,CAAC,CAAC;IACtE,MAAM,CAAC,GAAW,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAuB,EAAE,KAAuB;IAC/E,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC;IACnC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC;IAEnC,MAAM,KAAK,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5D,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC;IACtF,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC;IACtF,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,GAAW;IACjC,OAAO,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,GAAW;IACjC,OAAO,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAa,EAAE,KAAa;IACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACjC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;AAChG,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,CAAS,EAAE,MAAc,CAAC,EAAE,MAAc,CAAC;IAC/D,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,EAAU,EAAE,EAAU;IAC7C,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,CAAS,EAAE,GAA2B;IACtE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC;IAEzB,MAAM,KAAK,GACT,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,qBAAqB;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9E,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAE9E,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAE9E,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,CAAS,EAAE,IAAsB;IACnE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5B,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAE5B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAE1C,4BAA4B;IAC5B,IAAI,QAAQ,GAAG,KAAK,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IAED,eAAe;IACf,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,OAAO,KAAK,GAAG,QAAQ,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,CAAS,EAAE,OAAyB;IACzE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC;IACvB,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5B,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5B,MAAM,SAAS,GAAG,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAEhC,4BAA4B;IAC5B,IAAI,SAAS,GAAG,KAAK,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IAED,0BAA0B;IAC1B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;IAE9D,YAAY;IACZ,MAAM,UAAU,GAAW,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAEhE,iBAAiB;IACjB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,CAAS,EAAE,CAA2B,EAAE,kBAA2B,KAAK;IAC9G,2BAA2B;IAC3B,MAAM,QAAQ,GAAG,sBAAsB,CAAC,CAAC,CAAC,CAAC;IAC3C,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,sBAAsB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC7C,CAAC;IAED,8BAA8B;IAC9B,IAAI,eAAe,IAAI,0BAA0B,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,oBAAoB;IACpB,IAAI,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,CAAC;IACX,CAAC;IAED,gBAAgB;IAChB,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IACpB,MAAM,EAAE,GAAG,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7C,MAAM,EAAE,GAAG,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7C,MAAM,EAAE,GAAG,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7C,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,EAAQ,EAAE,EAAQ;IACnD,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1G,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,CAAO,EAAE,CAAS;IAC7C,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACpF,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,CAAO,EAAE,CAAS;IACpD,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IACjB,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IACzB,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;IAElC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;IACrC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;IACrC,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,GAAC,EAAE,GAAG,EAAE,GAAC,EAAE,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,CAAO;IACnC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IACvB,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,CAAO,EAAE,CAAS;IAC3C,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,EAAU,EAAE,EAAU;IACjD,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,CAAS;IACpC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,CAAO;IAC9B,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,CAAM;IAC7B,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAwB,EAAE,CAAO;IACjE,IAAI,EAAU,EAAE,EAAU,CAAC;IAC3B,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;IACpB,CAAC;SAAM,CAAC;QACN,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC;IACrB,CAAC;IAED,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IACrB,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3B,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC,GAAG,EAAE,CAAC;IACP,CAAC,GAAG,EAAE,CAAC;IACP,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACtB,CAAC;AAED,2BAA2B;AAC3B,MAAM,UAAU,uBAAuB,CAAC,UAAgB,EAAE,cAAoB;IAC5E,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,cAAc,CAAC;IACtC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;IAClC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,UAAU,CAAC;IACtC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;IAC7C,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,aAAa,CAAC,cAAc,CAAC,CAAC;IAE/C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,EAAE,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC;QAAC,KAAK,GAAG,CAAC,GAAG,EAAE,CAAC;IAAC,CAAC;IACvC,IAAI,EAAE,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC;QAAC,KAAK,GAAG,CAAC,GAAG,EAAE,CAAC;IAAC,CAAC;IACvC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,KAAK,GAAG,EAAE,EAAG,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC,CAAC;IAEvE,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,KAAK,CAAC,CAAC;IAC1C,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IAChD,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;IAExC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtB,IAAI,EAAE,GAAG,GAAG,EAAE,CAAC;QAAC,EAAE,IAAI,GAAG,GAAG,EAAE,CAAC;IAAC,CAAC;IACjC,IAAI,EAAE,GAAG,GAAG,EAAE,CAAC;QAAC,EAAE,IAAI,GAAG,GAAG,EAAE,CAAC;IAAC,CAAC;IACjC,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC;QAAC,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC;IAAC,CAAC;IACjC,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC;QAAC,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC;IAAC,CAAC;IAEjC,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,KAAa;IACxD,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC;IAClE,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;QACvB,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACrB,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACrB,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACzB,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,CAAO;IACnC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,CAAO,EAAE,CAAS;IAC9C,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,CAAO,EAAE,CAAS;IAC1C,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,UAAkB,EAAE,aAAqB;IAC5E,OAAO,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAA2B;IACxE,MAAM,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,iBAAiB;AACrC,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAA2B;IAC/E,MAAM,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACpF,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,iBAAiB;AACrC,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,GAA6B;IAClE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC;IAEzB,SAAS,kBAAkB,CAAC,EAAU,EAAE,EAAU;QAChD,OAAO,YAAY,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC;IACtC,CAAC;IAED,yBAAyB;IACzB,IAAI,kBAAkB,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;QAAA,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAAA,CAAC;IAClD,IAAI,kBAAkB,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;QAAA,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAAA,CAAC;IAClD,IAAI,kBAAkB,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;QAAA,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAAA,CAAC;IAElD,gBAAgB;IAEhB,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC;IACpB,IAAI,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;QACrE,eAAe;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACpC,MAAM,aAAa,GAAG,aAAa,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,iBAAiB;IAChE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,aAAa,CAAC;IAE1D,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACT,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACpB,CAAC;SAAM,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAChB,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACpB,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS;IAClE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,gCAAgC;AAChC,6BAA6B;AAC7B,MAAM,UAAU,uBAAuB,CAAC,EAAoB,EAAE,EAAoB;IAChF,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;IAClB,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;IAElB,MAAM,EAAE,GAAG,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACzC,MAAM,EAAE,GAAG,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAEzC,iCAAiC;IACjC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;QACjB,MAAM,EAAE,GAAG,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACzC,MAAM,EAAE,GAAG,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAEzC,qBAAqB;QACrB,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;YACjB,MAAM,WAAW,GAAG,EAAE,GAAG,EAAE,CAAC;YAC5B,qCAAqC;YACrC,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;gBACtB,qBAAqB;gBACrB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC;YAC3B,8BAA8B;YAC9B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC1B,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAChB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,EAAoB,EAAE,EAAoB;IAC5E,MAAM,MAAM,GAAG,uBAAuB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/C,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,CAAS,EAAE,CAAO;IAC1D,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { testSegmentIntersection } from './geometry';
|
|
3
|
+
describe('segmentIntersection', () => {
|
|
4
|
+
it('should return null for parallel lines', () => {
|
|
5
|
+
const s0 = [[0, 0], [1, 1]];
|
|
6
|
+
const s1 = [[0, 1], [1, 2]];
|
|
7
|
+
expect(testSegmentIntersection(s0, s1)).toBeNull();
|
|
8
|
+
});
|
|
9
|
+
it('should return null for non-intersecting lines', () => {
|
|
10
|
+
const s0 = [[0, 0], [1, 0]];
|
|
11
|
+
const s1 = [[0, 1], [1, 1]];
|
|
12
|
+
expect(testSegmentIntersection(s0, s1)).toBeNull();
|
|
13
|
+
});
|
|
14
|
+
it('should return the correct intersection point for intersecting lines', () => {
|
|
15
|
+
const s0 = [[0, 0], [2, 2]];
|
|
16
|
+
const s1 = [[0, 2], [2, 0]];
|
|
17
|
+
const result = testSegmentIntersection(s0, s1);
|
|
18
|
+
expect(result).not.toBeNull();
|
|
19
|
+
if (result) {
|
|
20
|
+
const [t, p] = result;
|
|
21
|
+
expect(t).toBeCloseTo(0.5);
|
|
22
|
+
expect(p).toEqual([1, 1]);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
it('should return null when the intersection point is outside the segments', () => {
|
|
26
|
+
const s0 = [[0, 0], [1, 1]];
|
|
27
|
+
const s1 = [[2, 2], [3, 3]];
|
|
28
|
+
expect(testSegmentIntersection(s0, s1)).toBeNull();
|
|
29
|
+
});
|
|
30
|
+
it('should handle vertical and horizontal lines correctly', () => {
|
|
31
|
+
const s0 = [[1, 0], [1, 2]];
|
|
32
|
+
const s1 = [[0, 1], [2, 1]];
|
|
33
|
+
const result = testSegmentIntersection(s0, s1);
|
|
34
|
+
expect(result).not.toBeNull();
|
|
35
|
+
if (result) {
|
|
36
|
+
const [t, p] = result;
|
|
37
|
+
expect(t).toBeCloseTo(0.5);
|
|
38
|
+
expect(p).toEqual([1, 1]);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
it('should handle overlapping lines by returning null', () => {
|
|
42
|
+
const s0 = [[0, 0], [2, 2]];
|
|
43
|
+
const s1 = [[1, 1], [3, 3]];
|
|
44
|
+
expect(testSegmentIntersection(s0, s1)).toBeNull();
|
|
45
|
+
});
|
|
46
|
+
it('should handle endpoints touching as intersecting', () => {
|
|
47
|
+
const s0 = [[0, 0], [1, 1]];
|
|
48
|
+
const s1 = [[1, 1], [2, 0]];
|
|
49
|
+
const result = testSegmentIntersection(s0, s1);
|
|
50
|
+
expect(result).not.toBeNull();
|
|
51
|
+
if (result) {
|
|
52
|
+
const [t, p] = result;
|
|
53
|
+
expect(t).toBeCloseTo(1);
|
|
54
|
+
expect(p).toEqual([1, 1]);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
//# sourceMappingURL=geometry.vitest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometry.vitest.js","sourceRoot":"","sources":["../../../../../src/lib/layeredCanvas/tools/geometry/geometry.vitest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QuickHull.js
|
|
3
|
+
*
|
|
4
|
+
* Implementation of the QuickHull algorithm for finding convex hull of a set of points
|
|
5
|
+
*
|
|
6
|
+
* @author Clay Gulick
|
|
7
|
+
*/
|
|
8
|
+
var hull = [];
|
|
9
|
+
export function QuickHull(points) {
|
|
10
|
+
hull = [];
|
|
11
|
+
//if there are only three points, this is a triangle, which by definition is already a hull
|
|
12
|
+
if (points.length == 3) {
|
|
13
|
+
points.push(points[0]); //close the poly
|
|
14
|
+
return points;
|
|
15
|
+
}
|
|
16
|
+
var baseline = getMinMaxPoints(points);
|
|
17
|
+
addSegments(baseline, points);
|
|
18
|
+
addSegments([baseline[1], baseline[0]], points); //reverse line direction to get points on other side
|
|
19
|
+
//add the last point to make a closed loop
|
|
20
|
+
hull.push(hull[0]);
|
|
21
|
+
return hull;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Return the min and max points in the set along the X axis
|
|
25
|
+
* Returns [ [x,y], [x,y] ]
|
|
26
|
+
* @param {Array} points - An array of {x,y} objects
|
|
27
|
+
*/
|
|
28
|
+
function getMinMaxPoints(points) {
|
|
29
|
+
var i;
|
|
30
|
+
var minPoint;
|
|
31
|
+
var maxPoint;
|
|
32
|
+
minPoint = points[0];
|
|
33
|
+
maxPoint = points[0];
|
|
34
|
+
for (i = 1; i < points.length; i++) {
|
|
35
|
+
if (points[i][0] < minPoint[0])
|
|
36
|
+
minPoint = points[i];
|
|
37
|
+
if (points[i][0] > maxPoint[0])
|
|
38
|
+
maxPoint = points[i];
|
|
39
|
+
}
|
|
40
|
+
return [minPoint, maxPoint];
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Calculates the distance of a point from a line
|
|
44
|
+
* @param {Array} point - Array [x,y]
|
|
45
|
+
* @param {Array} line - Array of two points [ [x1,y1], [x2,y2] ]
|
|
46
|
+
*/
|
|
47
|
+
function distanceFromLine(point, line) {
|
|
48
|
+
var vY = line[1][1] - line[0][1];
|
|
49
|
+
var vX = line[0][0] - line[1][0];
|
|
50
|
+
return (vX * (point[1] - line[0][1]) + vY * (point[0] - line[0][0]));
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Determines the set of points that lay outside the line (positive), and the most distal point
|
|
54
|
+
* Returns: {points: [ [x1, y1], ... ], max: [x,y] ]
|
|
55
|
+
* @param points
|
|
56
|
+
* @param line
|
|
57
|
+
*/
|
|
58
|
+
function distalPoints(line, points) {
|
|
59
|
+
var i;
|
|
60
|
+
var outer_points = [];
|
|
61
|
+
var point;
|
|
62
|
+
var distal_point;
|
|
63
|
+
var distance = 0;
|
|
64
|
+
var max_distance = 0;
|
|
65
|
+
for (i = 0; i < points.length; i++) {
|
|
66
|
+
point = points[i];
|
|
67
|
+
distance = distanceFromLine(point, line);
|
|
68
|
+
if (distance > 0)
|
|
69
|
+
outer_points.push(point);
|
|
70
|
+
else
|
|
71
|
+
continue; //short circuit
|
|
72
|
+
if (distance > max_distance) {
|
|
73
|
+
distal_point = point;
|
|
74
|
+
max_distance = distance;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return { points: outer_points, max: distal_point };
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Recursively adds hull segments
|
|
81
|
+
* @param line
|
|
82
|
+
* @param points
|
|
83
|
+
*/
|
|
84
|
+
function addSegments(line, points) {
|
|
85
|
+
var distal = distalPoints(line, points);
|
|
86
|
+
if (!distal.max)
|
|
87
|
+
return hull.push(line[0]);
|
|
88
|
+
addSegments([line[0], distal.max], distal.points);
|
|
89
|
+
addSegments([distal.max, line[1]], distal.points);
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=quickHull.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quickHull.js","sourceRoot":"","sources":["../../../../../src/lib/layeredCanvas/tools/geometry/quickHull.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Vector, Rect } from "./geometry";
|
|
2
|
+
export type Trapezoid = {
|
|
3
|
+
topLeft: Vector;
|
|
4
|
+
topRight: Vector;
|
|
5
|
+
bottomLeft: Vector;
|
|
6
|
+
bottomRight: Vector;
|
|
7
|
+
};
|
|
8
|
+
export type TrapezoidCorner = "topLeft" | "topRight" | "bottomLeft" | "bottomRight";
|
|
9
|
+
export declare const trapezoidCorners: readonly ["topLeft", "topRight", "bottomLeft", "bottomRight"];
|
|
10
|
+
export declare function trapezoidPath(ctx: CanvasRenderingContext2D, corners: Trapezoid): void;
|
|
11
|
+
export declare function extendTrapezoid(t: Trapezoid, x: number, y: number): Trapezoid;
|
|
12
|
+
export declare function rectToTrapezoid(r: Rect): Trapezoid;
|
|
13
|
+
export declare function trapezoidBoundingRect(corners: Trapezoid): Rect;
|
|
14
|
+
export declare function trapezoidCenter(corners: Trapezoid): Vector;
|
|
15
|
+
export declare function isPointInTrapezoid(p: Vector, t: Trapezoid): boolean;
|
|
16
|
+
export declare function isPointInQuadrilateral(p: Vector, t: Trapezoid): boolean;
|
|
17
|
+
export declare function pointToQuadrilateralDistance(p: Vector, t: Trapezoid, ignoresinverted: boolean): number;
|
|
18
|
+
export declare function isQuadrilateralConvex(t: Trapezoid): boolean;
|