@idraw/util 0.4.3 → 1.0.0-alpha.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.
- package/dist/esm/converter/data-svg.d.ts +2 -0
- package/dist/esm/converter/data-svg.js +19 -0
- package/dist/esm/converter/material-svg.d.ts +2 -0
- package/dist/esm/converter/material-svg.js +63 -0
- package/dist/esm/converter/svg-material.d.ts +2 -0
- package/dist/esm/converter/svg-material.js +188 -0
- package/dist/esm/index.d.ts +32 -21
- package/dist/esm/index.js +32 -21
- package/dist/esm/static.d.ts +1 -0
- package/dist/esm/static.js +1 -0
- package/dist/esm/tool/file.js +2 -2
- package/dist/esm/tool/html.js +27 -27
- package/dist/esm/tool/id.d.ts +1 -0
- package/dist/esm/tool/id.js +4 -0
- package/dist/esm/tool/image.js +6 -6
- package/dist/esm/tool/path-to-box.d.ts +3 -0
- package/dist/esm/tool/path-to-box.js +353 -0
- package/dist/esm/tool/path-to-command.d.ts +4 -0
- package/dist/esm/tool/path-to-command.js +392 -0
- package/dist/esm/tool/path.d.ts +18 -0
- package/dist/esm/tool/path.js +421 -0
- package/dist/esm/tool/svg-path.d.ts +3 -0
- package/dist/esm/{view → tool}/svg-path.js +4 -16
- package/dist/esm/tool/time.d.ts +2 -2
- package/dist/esm/tool/time.js +4 -4
- package/dist/esm/tool/uuid.d.ts +1 -1
- package/dist/esm/tool/uuid.js +6 -6
- package/dist/esm/view/box.d.ts +0 -2
- package/dist/esm/view/box.js +1 -173
- package/dist/esm/view/canvas.js +3 -3
- package/dist/esm/view/check.d.ts +8 -7
- package/dist/esm/view/check.js +34 -34
- package/dist/esm/view/config.d.ts +0 -9
- package/dist/esm/view/config.js +1 -71
- package/dist/esm/view/context2d.d.ts +10 -3
- package/dist/esm/view/context2d.js +39 -18
- package/dist/esm/view/controller.d.ts +5 -5
- package/dist/esm/view/controller.js +105 -102
- package/dist/esm/view/data.d.ts +2 -2
- package/dist/esm/view/data.js +65 -65
- package/dist/esm/view/dom.d.ts +23 -0
- package/dist/esm/view/dom.js +190 -0
- package/dist/esm/view/flat.d.ts +2 -2
- package/dist/esm/view/flat.js +53 -53
- package/dist/esm/view/group.d.ts +3 -3
- package/dist/esm/view/group.js +25 -28
- package/dist/esm/view/handle-material.d.ts +24 -0
- package/dist/esm/view/{handle-element.js → handle-material.js} +98 -75
- package/dist/esm/view/is.d.ts +10 -12
- package/dist/esm/view/is.js +15 -19
- package/dist/esm/view/load.d.ts +2 -2
- package/dist/esm/view/load.js +7 -7
- package/dist/esm/view/material.d.ts +40 -0
- package/dist/esm/view/material.js +476 -0
- package/dist/esm/view/middleware.d.ts +1 -0
- package/dist/esm/view/middleware.js +14 -2
- package/dist/esm/view/modify-record.d.ts +4 -4
- package/dist/esm/view/modify-record.js +2 -2
- package/dist/esm/view/parser.d.ts +2 -2
- package/dist/esm/view/parser.js +3 -3
- package/dist/esm/view/path.d.ts +2 -0
- package/dist/esm/view/path.js +30 -0
- package/dist/esm/view/point-move-material.d.ts +5 -0
- package/dist/esm/view/{point-move-element.js → point-move-material.js} +6 -6
- package/dist/esm/view/point.d.ts +3 -8
- package/dist/esm/view/point.js +1 -21
- package/dist/esm/view/position.d.ts +9 -9
- package/dist/esm/view/position.js +1 -1
- package/dist/esm/view/rect.d.ts +2 -2
- package/dist/esm/view/rect.js +4 -4
- package/dist/esm/view/resize-material.d.ts +4 -0
- package/dist/esm/view/resize-material.js +266 -0
- package/dist/esm/view/rotate.d.ts +11 -11
- package/dist/esm/view/rotate.js +24 -24
- package/dist/esm/view/static.d.ts +13 -0
- package/dist/esm/view/static.js +89 -0
- package/dist/esm/view/styles.d.ts +11 -0
- package/dist/esm/view/styles.js +78 -0
- package/dist/esm/view/vertex.d.ts +8 -8
- package/dist/esm/view/vertex.js +28 -28
- package/dist/esm/view/view-box.d.ts +2 -6
- package/dist/esm/view/view-box.js +8 -64
- package/dist/esm/view/view-calc.d.ts +23 -20
- package/dist/esm/view/view-calc.js +104 -93
- package/dist/esm/view/view-content.d.ts +2 -2
- package/dist/esm/view/view-content.js +34 -34
- package/dist/index.global.js +3144 -1548
- package/dist/index.global.min.js +1 -1
- package/package.json +1 -1
- package/dist/esm/view/element.d.ts +0 -35
- package/dist/esm/view/element.js +0 -471
- package/dist/esm/view/handle-element.d.ts +0 -24
- package/dist/esm/view/point-move-element.d.ts +0 -5
- package/dist/esm/view/resize-element.d.ts +0 -4
- package/dist/esm/view/resize-element.js +0 -255
- package/dist/esm/view/svg-path.d.ts +0 -10
package/dist/esm/tool/image.js
CHANGED
|
@@ -5,23 +5,23 @@ export function compressImage(src, opts) {
|
|
|
5
5
|
radio = opts === null || opts === void 0 ? void 0 : opts.radio;
|
|
6
6
|
}
|
|
7
7
|
return new Promise((resolve, reject) => {
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
const { width, height } =
|
|
8
|
+
const img = new Image();
|
|
9
|
+
img.addEventListener('load', () => {
|
|
10
|
+
const { width, height } = img;
|
|
11
11
|
const resultW = width * radio;
|
|
12
12
|
const resultH = height * radio;
|
|
13
13
|
let canvas = document.createElement('canvas');
|
|
14
14
|
canvas.width = resultW;
|
|
15
15
|
canvas.height = resultH;
|
|
16
16
|
const ctx = canvas.getContext('2d');
|
|
17
|
-
ctx.drawImage(
|
|
17
|
+
ctx.drawImage(img, 0, 0, resultW, resultH);
|
|
18
18
|
const base64 = canvas.toDataURL(type);
|
|
19
19
|
canvas = null;
|
|
20
20
|
resolve(base64);
|
|
21
21
|
});
|
|
22
|
-
|
|
22
|
+
img.addEventListener('error', (err) => {
|
|
23
23
|
reject(err);
|
|
24
24
|
});
|
|
25
|
-
|
|
25
|
+
img.src = src;
|
|
26
26
|
});
|
|
27
27
|
}
|
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
import { parseSVGPath } from './svg-path';
|
|
2
|
+
export function calcPathCommondsBoundingBox(commands) {
|
|
3
|
+
let minX = Infinity;
|
|
4
|
+
let minY = Infinity;
|
|
5
|
+
let maxX = -Infinity;
|
|
6
|
+
let maxY = -Infinity;
|
|
7
|
+
let currentPoint = { x: 0, y: 0 };
|
|
8
|
+
let startPoint = { x: 0, y: 0 };
|
|
9
|
+
let lastControlPoint = null;
|
|
10
|
+
const updateBBox = (point) => {
|
|
11
|
+
minX = Math.min(minX, point.x);
|
|
12
|
+
minY = Math.min(minY, point.y);
|
|
13
|
+
maxX = Math.max(maxX, point.x);
|
|
14
|
+
maxY = Math.max(maxY, point.y);
|
|
15
|
+
};
|
|
16
|
+
for (const cmd of commands) {
|
|
17
|
+
const { type, params } = cmd;
|
|
18
|
+
const isRelative = type === type.toLowerCase();
|
|
19
|
+
switch (type.toLowerCase()) {
|
|
20
|
+
case 'm':
|
|
21
|
+
if (params.length >= 2) {
|
|
22
|
+
for (let i = 0; i < params.length; i += 2) {
|
|
23
|
+
let x = params[i];
|
|
24
|
+
let y = params[i + 1];
|
|
25
|
+
if (isRelative) {
|
|
26
|
+
x += currentPoint.x;
|
|
27
|
+
y += currentPoint.y;
|
|
28
|
+
}
|
|
29
|
+
if (i === 0) {
|
|
30
|
+
startPoint = { x, y };
|
|
31
|
+
}
|
|
32
|
+
currentPoint = { x, y };
|
|
33
|
+
updateBBox(currentPoint);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
lastControlPoint = null;
|
|
37
|
+
break;
|
|
38
|
+
case 'l':
|
|
39
|
+
if (params.length >= 2) {
|
|
40
|
+
for (let i = 0; i < params.length; i += 2) {
|
|
41
|
+
let x = params[i];
|
|
42
|
+
let y = params[i + 1];
|
|
43
|
+
if (isRelative) {
|
|
44
|
+
x += currentPoint.x;
|
|
45
|
+
y += currentPoint.y;
|
|
46
|
+
}
|
|
47
|
+
currentPoint = { x, y };
|
|
48
|
+
updateBBox(currentPoint);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
lastControlPoint = null;
|
|
52
|
+
break;
|
|
53
|
+
case 'h':
|
|
54
|
+
for (let i = 0; i < params.length; i++) {
|
|
55
|
+
let x = params[i];
|
|
56
|
+
if (isRelative) {
|
|
57
|
+
x += currentPoint.x;
|
|
58
|
+
}
|
|
59
|
+
currentPoint = { x, y: currentPoint.y };
|
|
60
|
+
updateBBox(currentPoint);
|
|
61
|
+
}
|
|
62
|
+
lastControlPoint = null;
|
|
63
|
+
break;
|
|
64
|
+
case 'v':
|
|
65
|
+
for (let i = 0; i < params.length; i++) {
|
|
66
|
+
let y = params[i];
|
|
67
|
+
if (isRelative) {
|
|
68
|
+
y += currentPoint.y;
|
|
69
|
+
}
|
|
70
|
+
currentPoint = { x: currentPoint.x, y };
|
|
71
|
+
updateBBox(currentPoint);
|
|
72
|
+
}
|
|
73
|
+
lastControlPoint = null;
|
|
74
|
+
break;
|
|
75
|
+
case 'c':
|
|
76
|
+
if (params.length >= 6) {
|
|
77
|
+
for (let i = 0; i < params.length; i += 6) {
|
|
78
|
+
let cp1x = params[i];
|
|
79
|
+
let cp1y = params[i + 1];
|
|
80
|
+
let cp2x = params[i + 2];
|
|
81
|
+
let cp2y = params[i + 3];
|
|
82
|
+
let x = params[i + 4];
|
|
83
|
+
let y = params[i + 5];
|
|
84
|
+
if (isRelative) {
|
|
85
|
+
cp1x += currentPoint.x;
|
|
86
|
+
cp1y += currentPoint.y;
|
|
87
|
+
cp2x += currentPoint.x;
|
|
88
|
+
cp2y += currentPoint.y;
|
|
89
|
+
x += currentPoint.x;
|
|
90
|
+
y += currentPoint.y;
|
|
91
|
+
}
|
|
92
|
+
lastControlPoint = { x: cp2x, y: cp2y };
|
|
93
|
+
const curvePoints = getCubicBezierExtremes(currentPoint.x, currentPoint.y, cp1x, cp1y, cp2x, cp2y, x, y);
|
|
94
|
+
curvePoints.forEach(updateBBox);
|
|
95
|
+
updateBBox({ x, y });
|
|
96
|
+
currentPoint = { x, y };
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
break;
|
|
100
|
+
case 's':
|
|
101
|
+
if (params.length >= 4) {
|
|
102
|
+
for (let i = 0; i < params.length; i += 4) {
|
|
103
|
+
let cp2x = params[i];
|
|
104
|
+
let cp2y = params[i + 1];
|
|
105
|
+
let x = params[i + 2];
|
|
106
|
+
let y = params[i + 3];
|
|
107
|
+
const cp1x = lastControlPoint ? 2 * currentPoint.x - lastControlPoint.x : currentPoint.x;
|
|
108
|
+
const cp1y = lastControlPoint ? 2 * currentPoint.y - lastControlPoint.y : currentPoint.y;
|
|
109
|
+
if (isRelative) {
|
|
110
|
+
cp2x += currentPoint.x;
|
|
111
|
+
cp2y += currentPoint.y;
|
|
112
|
+
x += currentPoint.x;
|
|
113
|
+
y += currentPoint.y;
|
|
114
|
+
}
|
|
115
|
+
lastControlPoint = { x: cp2x, y: cp2y };
|
|
116
|
+
const curvePoints = getCubicBezierExtremes(currentPoint.x, currentPoint.y, cp1x, cp1y, cp2x, cp2y, x, y);
|
|
117
|
+
curvePoints.forEach(updateBBox);
|
|
118
|
+
updateBBox({ x, y });
|
|
119
|
+
currentPoint = { x, y };
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
break;
|
|
123
|
+
case 'q':
|
|
124
|
+
if (params.length >= 4) {
|
|
125
|
+
for (let i = 0; i < params.length; i += 4) {
|
|
126
|
+
let cpx = params[i];
|
|
127
|
+
let cpy = params[i + 1];
|
|
128
|
+
let x = params[i + 2];
|
|
129
|
+
let y = params[i + 3];
|
|
130
|
+
if (isRelative) {
|
|
131
|
+
cpx += currentPoint.x;
|
|
132
|
+
cpy += currentPoint.y;
|
|
133
|
+
x += currentPoint.x;
|
|
134
|
+
y += currentPoint.y;
|
|
135
|
+
}
|
|
136
|
+
lastControlPoint = { x: cpx, y: cpy };
|
|
137
|
+
const curvePoints = getQuadraticBezierExtremes(currentPoint.x, currentPoint.y, cpx, cpy, x, y);
|
|
138
|
+
curvePoints.forEach(updateBBox);
|
|
139
|
+
updateBBox({ x, y });
|
|
140
|
+
currentPoint = { x, y };
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
break;
|
|
144
|
+
case 't':
|
|
145
|
+
if (params.length >= 2) {
|
|
146
|
+
for (let i = 0; i < params.length; i += 2) {
|
|
147
|
+
let x = params[i];
|
|
148
|
+
let y = params[i + 1];
|
|
149
|
+
const cpx = lastControlPoint ? 2 * currentPoint.x - lastControlPoint.x : currentPoint.x;
|
|
150
|
+
const cpy = lastControlPoint ? 2 * currentPoint.y - lastControlPoint.y : currentPoint.y;
|
|
151
|
+
if (isRelative) {
|
|
152
|
+
x += currentPoint.x;
|
|
153
|
+
y += currentPoint.y;
|
|
154
|
+
}
|
|
155
|
+
lastControlPoint = { x: cpx, y: cpy };
|
|
156
|
+
const curvePoints = getQuadraticBezierExtremes(currentPoint.x, currentPoint.y, cpx, cpy, x, y);
|
|
157
|
+
curvePoints.forEach(updateBBox);
|
|
158
|
+
updateBBox({ x, y });
|
|
159
|
+
currentPoint = { x, y };
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
break;
|
|
163
|
+
case 'a':
|
|
164
|
+
if (params.length >= 7) {
|
|
165
|
+
for (let i = 0; i < params.length; i += 7) {
|
|
166
|
+
const rx = Math.abs(params[i]);
|
|
167
|
+
const ry = Math.abs(params[i + 1]);
|
|
168
|
+
const xAxisRotation = params[i + 2];
|
|
169
|
+
const largeArcFlag = params[i + 3];
|
|
170
|
+
const sweepFlag = params[i + 4];
|
|
171
|
+
let x = params[i + 5];
|
|
172
|
+
let y = params[i + 6];
|
|
173
|
+
if (isRelative) {
|
|
174
|
+
x += currentPoint.x;
|
|
175
|
+
y += currentPoint.y;
|
|
176
|
+
}
|
|
177
|
+
const arcPoints = getArcPoints(currentPoint.x, currentPoint.y, rx, ry, xAxisRotation, largeArcFlag, sweepFlag, x, y);
|
|
178
|
+
arcPoints.forEach(updateBBox);
|
|
179
|
+
currentPoint = { x, y };
|
|
180
|
+
lastControlPoint = null;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
break;
|
|
184
|
+
case 'z':
|
|
185
|
+
currentPoint = Object.assign({}, startPoint);
|
|
186
|
+
updateBBox(currentPoint);
|
|
187
|
+
lastControlPoint = null;
|
|
188
|
+
break;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
if (minX === Infinity) {
|
|
192
|
+
minX = minY = maxX = maxY = 0;
|
|
193
|
+
}
|
|
194
|
+
const width = maxX - minX;
|
|
195
|
+
const height = maxY - minY;
|
|
196
|
+
return {
|
|
197
|
+
minX,
|
|
198
|
+
minY,
|
|
199
|
+
maxX,
|
|
200
|
+
maxY,
|
|
201
|
+
width,
|
|
202
|
+
height,
|
|
203
|
+
start: { x: minX, y: minY },
|
|
204
|
+
end: { x: maxX, y: maxY },
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
export function calcSVGPathBoundingBox(pathData) {
|
|
208
|
+
const commands = parseSVGPath(pathData);
|
|
209
|
+
return calcPathCommondsBoundingBox(commands);
|
|
210
|
+
}
|
|
211
|
+
function getCubicBezierExtremes(x0, y0, x1, y1, x2, y2, x3, y3) {
|
|
212
|
+
const points = [];
|
|
213
|
+
points.push({ x: x0, y: y0 });
|
|
214
|
+
points.push({ x: x3, y: y3 });
|
|
215
|
+
const a = 3 * (-x0 + 3 * x1 - 3 * x2 + x3);
|
|
216
|
+
const b = 6 * (x0 - 2 * x1 + x2);
|
|
217
|
+
const c = 3 * (x1 - x0);
|
|
218
|
+
const tValuesX = solveQuadratic(a, b, c);
|
|
219
|
+
for (const t of tValuesX) {
|
|
220
|
+
if (t > 0 && t < 1) {
|
|
221
|
+
const x = cubicBezierValue(t, x0, x1, x2, x3);
|
|
222
|
+
const y = cubicBezierValue(t, y0, y1, y2, y3);
|
|
223
|
+
points.push({ x, y });
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
const d = 3 * (-y0 + 3 * y1 - 3 * y2 + y3);
|
|
227
|
+
const e = 6 * (y0 - 2 * y1 + y2);
|
|
228
|
+
const f = 3 * (y1 - y0);
|
|
229
|
+
const tValuesY = solveQuadratic(d, e, f);
|
|
230
|
+
for (const t of tValuesY) {
|
|
231
|
+
if (t > 0 && t < 1) {
|
|
232
|
+
const x = cubicBezierValue(t, x0, x1, x2, x3);
|
|
233
|
+
const y = cubicBezierValue(t, y0, y1, y2, y3);
|
|
234
|
+
points.push({ x, y });
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return points;
|
|
238
|
+
}
|
|
239
|
+
function getQuadraticBezierExtremes(x0, y0, x1, y1, x2, y2) {
|
|
240
|
+
const points = [];
|
|
241
|
+
points.push({ x: x0, y: y0 });
|
|
242
|
+
points.push({ x: x2, y: y2 });
|
|
243
|
+
const a = x0 - 2 * x1 + x2;
|
|
244
|
+
const b = 2 * (x1 - x0);
|
|
245
|
+
if (a !== 0) {
|
|
246
|
+
const t = -b / (2 * a);
|
|
247
|
+
if (t > 0 && t < 1) {
|
|
248
|
+
const x = quadraticBezierValue(t, x0, x1, x2);
|
|
249
|
+
const y = quadraticBezierValue(t, y0, y1, y2);
|
|
250
|
+
points.push({ x, y });
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
const c = y0 - 2 * y1 + y2;
|
|
254
|
+
const d = 2 * (y1 - y0);
|
|
255
|
+
if (c !== 0) {
|
|
256
|
+
const t = -d / (2 * c);
|
|
257
|
+
if (t > 0 && t < 1) {
|
|
258
|
+
const x = quadraticBezierValue(t, x0, x1, x2);
|
|
259
|
+
const y = quadraticBezierValue(t, y0, y1, y2);
|
|
260
|
+
points.push({ x, y });
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
return points;
|
|
264
|
+
}
|
|
265
|
+
function getArcPoints(x1, y1, rx, ry, xAxisRotation, largeArcFlag, sweepFlag, x2, y2) {
|
|
266
|
+
const points = [];
|
|
267
|
+
const numSegments = 100;
|
|
268
|
+
const phi = (xAxisRotation * Math.PI) / 180;
|
|
269
|
+
const cosPhi = Math.cos(phi);
|
|
270
|
+
const sinPhi = Math.sin(phi);
|
|
271
|
+
const midX = (x1 + x2) / 2;
|
|
272
|
+
const midY = (y1 + y2) / 2;
|
|
273
|
+
const dx = (x1 - x2) / 2;
|
|
274
|
+
const dy = (y1 - y2) / 2;
|
|
275
|
+
const x1p = cosPhi * dx + sinPhi * dy;
|
|
276
|
+
const y1p = -sinPhi * dx + cosPhi * dy;
|
|
277
|
+
let rxAdjusted = rx;
|
|
278
|
+
let ryAdjusted = ry;
|
|
279
|
+
const rxSq = rx * rx;
|
|
280
|
+
const rySq = ry * ry;
|
|
281
|
+
const x1pSq = x1p * x1p;
|
|
282
|
+
const y1pSq = y1p * y1p;
|
|
283
|
+
const lambda = x1pSq / rxSq + y1pSq / rySq;
|
|
284
|
+
if (lambda > 1) {
|
|
285
|
+
rxAdjusted = Math.sqrt(lambda) * rx;
|
|
286
|
+
ryAdjusted = Math.sqrt(lambda) * ry;
|
|
287
|
+
}
|
|
288
|
+
const sign = largeArcFlag === sweepFlag ? -1 : 1;
|
|
289
|
+
const num = Math.max(0, rxAdjusted * rxAdjusted * ryAdjusted * ryAdjusted -
|
|
290
|
+
rxAdjusted * rxAdjusted * y1pSq -
|
|
291
|
+
ryAdjusted * ryAdjusted * x1pSq);
|
|
292
|
+
const denom = rxAdjusted * rxAdjusted * y1pSq + ryAdjusted * ryAdjusted * x1pSq;
|
|
293
|
+
let factor = sign * Math.sqrt(num / denom);
|
|
294
|
+
if (isNaN(factor))
|
|
295
|
+
factor = 0;
|
|
296
|
+
const cxp = factor * ((rxAdjusted * y1p) / ryAdjusted);
|
|
297
|
+
const cyp = factor * ((-ryAdjusted * x1p) / rxAdjusted);
|
|
298
|
+
const cx = cosPhi * cxp - sinPhi * cyp + midX;
|
|
299
|
+
const cy = sinPhi * cxp + cosPhi * cyp + midY;
|
|
300
|
+
const startAngle = Math.atan2((y1p - cyp) / ryAdjusted, (x1p - cxp) / rxAdjusted);
|
|
301
|
+
const endAngle = Math.atan2((-y1p - cyp) / ryAdjusted, (-x1p - cxp) / rxAdjusted);
|
|
302
|
+
let sweepAngle = endAngle - startAngle;
|
|
303
|
+
if (sweepFlag === 0 && sweepAngle > 0) {
|
|
304
|
+
sweepAngle -= 2 * Math.PI;
|
|
305
|
+
}
|
|
306
|
+
else if (sweepFlag === 1 && sweepAngle < 0) {
|
|
307
|
+
sweepAngle += 2 * Math.PI;
|
|
308
|
+
}
|
|
309
|
+
for (let i = 0; i <= numSegments; i++) {
|
|
310
|
+
const t = i / numSegments;
|
|
311
|
+
const angle = startAngle + t * sweepAngle;
|
|
312
|
+
const x = cx + rxAdjusted * Math.cos(angle) * cosPhi - ryAdjusted * Math.sin(angle) * sinPhi;
|
|
313
|
+
const y = cy + rxAdjusted * Math.cos(angle) * sinPhi + ryAdjusted * Math.sin(angle) * cosPhi;
|
|
314
|
+
points.push({ x, y });
|
|
315
|
+
}
|
|
316
|
+
return points;
|
|
317
|
+
}
|
|
318
|
+
function solveQuadratic(a, b, c) {
|
|
319
|
+
const solutions = [];
|
|
320
|
+
if (a === 0) {
|
|
321
|
+
if (b !== 0) {
|
|
322
|
+
const solution = -c / b;
|
|
323
|
+
if (solution >= 0 && solution <= 1) {
|
|
324
|
+
solutions.push(solution);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
return solutions;
|
|
328
|
+
}
|
|
329
|
+
const discriminant = b * b - 4 * a * c;
|
|
330
|
+
if (discriminant > 0) {
|
|
331
|
+
const sqrtDiscriminant = Math.sqrt(discriminant);
|
|
332
|
+
const solution1 = (-b + sqrtDiscriminant) / (2 * a);
|
|
333
|
+
const solution2 = (-b - sqrtDiscriminant) / (2 * a);
|
|
334
|
+
if (solution1 >= 0 && solution1 <= 1)
|
|
335
|
+
solutions.push(solution1);
|
|
336
|
+
if (solution2 >= 0 && solution2 <= 1)
|
|
337
|
+
solutions.push(solution2);
|
|
338
|
+
}
|
|
339
|
+
else if (discriminant === 0) {
|
|
340
|
+
const solution = -b / (2 * a);
|
|
341
|
+
if (solution >= 0 && solution <= 1)
|
|
342
|
+
solutions.push(solution);
|
|
343
|
+
}
|
|
344
|
+
return solutions;
|
|
345
|
+
}
|
|
346
|
+
function cubicBezierValue(t, p0, p1, p2, p3) {
|
|
347
|
+
const mt = 1 - t;
|
|
348
|
+
return mt * mt * mt * p0 + 3 * mt * mt * t * p1 + 3 * mt * t * t * p2 + t * t * t * p3;
|
|
349
|
+
}
|
|
350
|
+
function quadraticBezierValue(t, p0, p1, p2) {
|
|
351
|
+
const mt = 1 - t;
|
|
352
|
+
return mt * mt * p0 + 2 * mt * t * p1 + t * t * p2;
|
|
353
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { PathCommand, Context2DCommand } from '@idraw/types';
|
|
2
|
+
export declare function convertSVGPathToContext2DCommands(d: string): Context2DCommand[];
|
|
3
|
+
export declare function convertPathCommandsToContext2DCommands(svgPathCmds: PathCommand[]): Context2DCommand[];
|
|
4
|
+
export declare function convertContext2DCommandsToSVGPath(cmds: Context2DCommand[]): string;
|