svg-path-simplify 0.1.2 → 0.2.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/README.md +10 -0
- package/dist/svg-path-simplify.esm.js +3935 -1441
- package/dist/svg-path-simplify.esm.min.js +13 -1
- package/dist/svg-path-simplify.js +3953 -1459
- package/dist/svg-path-simplify.min.js +13 -1
- package/dist/svg-path-simplify.min.js.gz +0 -0
- package/dist/svg-path-simplify.poly.cjs +0 -1
- package/index.html +69 -31
- package/package.json +5 -9
- package/src/constants.js +3 -0
- package/src/index-node.js +0 -1
- package/src/index-poly.js +0 -1
- package/src/index.js +26 -0
- package/src/pathData_simplify_cubic.js +75 -46
- package/src/pathData_simplify_cubicsToArcs.js +566 -0
- package/src/pathData_simplify_harmonize_cpts.js +170 -0
- package/src/pathData_simplify_revertToquadratics.js +21 -0
- package/src/pathSimplify-main.js +274 -61
- package/src/poly-fit-curve-schneider.js +570 -0
- package/src/simplify_poly_RDP.js +146 -0
- package/src/simplify_poly_radial_distance.js +100 -0
- package/src/svg_getViewbox.js +28 -15
- package/src/svgii/geometry.js +389 -63
- package/src/svgii/geometry_area.js +2 -1
- package/src/svgii/pathData_analyze.js +259 -212
- package/src/svgii/pathData_convert.js +91 -663
- package/src/svgii/pathData_fromPoly.js +12 -0
- package/src/svgii/pathData_parse.js +90 -89
- package/src/svgii/pathData_parse_els.js +3 -0
- package/src/svgii/pathData_parse_fontello.js +449 -0
- package/src/svgii/pathData_remove_collinear.js +44 -37
- package/src/svgii/pathData_reorder.js +2 -1
- package/src/svgii/pathData_simplify_redraw.js +343 -0
- package/src/svgii/pathData_simplify_refineCorners.js +18 -9
- package/src/svgii/pathData_simplify_refineExtremes.js +19 -78
- package/src/svgii/pathData_split.js +42 -45
- package/src/svgii/pathData_toPolygon.js +130 -4
- package/src/svgii/pathData_transform_scale.js +51 -0
- package/src/svgii/poly_analyze.js +470 -14
- package/src/svgii/poly_to_pathdata.js +224 -19
- package/src/svgii/rounding.js +55 -112
- package/src/svgii/svg_cleanup.js +13 -1
- package/src/svgii/visualize.js +8 -3
- package/{debug.cjs → tests/debug.cjs} +3 -0
- package/{testSVG.js → tests/testSVG.js} +1 -1
- /package/{test.js → tests/test.js} +0 -0
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { checkLineIntersection, getDistManhattan, interpolate, pointAtT } from "./svgii/geometry";
|
|
2
|
+
import { renderPoint } from "./svgii/visualize";
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
export function harmonizeCubicCptsThird(pathData = [], t = 0.666) {
|
|
7
|
+
|
|
8
|
+
let l = pathData.length;
|
|
9
|
+
for (let i = 0; i < l; i++) {
|
|
10
|
+
let com = pathData[i]
|
|
11
|
+
let comPrev = pathData[i - 1] || null
|
|
12
|
+
let { type, values } = com
|
|
13
|
+
let comN = pathData[i + 1] ? pathData[i + 1] : null;
|
|
14
|
+
let adjust = false;
|
|
15
|
+
|
|
16
|
+
//comN && comN.type==='C' &&
|
|
17
|
+
if (type === 'C') {
|
|
18
|
+
let cp1 = { x: values[0], y: values[1] }
|
|
19
|
+
let cp2 = { x: values[2], y: values[3] }
|
|
20
|
+
let valuesL = comPrev.values.slice(-2)
|
|
21
|
+
let p0 = { x: valuesL[0], y: valuesL[1] }
|
|
22
|
+
let p = { x: values[4], y: values[5] }
|
|
23
|
+
|
|
24
|
+
let dist0 = getDistManhattan(p0, p)
|
|
25
|
+
let dist1 = getDistManhattan(p0, cp1)
|
|
26
|
+
let dist2 = getDistManhattan(p, cp2)
|
|
27
|
+
let dist3 = getDistManhattan(cp1, cp2)
|
|
28
|
+
|
|
29
|
+
let ptIV = checkLineIntersection(p0, cp1, p, cp2, false)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
if (ptIV) {
|
|
33
|
+
|
|
34
|
+
// very uneven lengths
|
|
35
|
+
let diff1 = dist1 / dist0
|
|
36
|
+
let diff2 = dist2 / dist0
|
|
37
|
+
let diff3 = diff1 + diff2
|
|
38
|
+
|
|
39
|
+
// exact intersection
|
|
40
|
+
let ptI = ptIV ? checkLineIntersection(p0, cp1, p, cp2, true) : null
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
// cpts are intersection
|
|
44
|
+
if (ptI) {
|
|
45
|
+
adjust = true;
|
|
46
|
+
}
|
|
47
|
+
//cpts are very close
|
|
48
|
+
else if (dist3 < dist0 / 5) {
|
|
49
|
+
adjust = true;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
if (adjust) {
|
|
55
|
+
cp1 = pointAtT([p0, ptIV], t)
|
|
56
|
+
cp2 = pointAtT([p, ptIV], t)
|
|
57
|
+
//renderPoint(markers, ptIV)
|
|
58
|
+
pathData[i].values[0] = cp1.x
|
|
59
|
+
pathData[i].values[1] = cp1.y
|
|
60
|
+
pathData[i].values[2] = cp2.x
|
|
61
|
+
pathData[i].values[3] = cp2.y
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return pathData
|
|
69
|
+
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
export function harmonizeCubicCpts(pathData = [], t = 0.666) {
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
let l = pathData.length;
|
|
78
|
+
for (let i = 1; i < l; i++) {
|
|
79
|
+
let com = pathData[i]
|
|
80
|
+
let comPrev = pathData[i - 1]
|
|
81
|
+
let { type, values } = com
|
|
82
|
+
let comN = pathData[i + 1] ? pathData[i + 1] : null;
|
|
83
|
+
let adjust = false;
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
//comN && comN.type==='C' &&
|
|
87
|
+
if (type === 'C') {
|
|
88
|
+
let cp1 = { x: values[0], y: values[1] }
|
|
89
|
+
let cp2 = { x: values[2], y: values[3] }
|
|
90
|
+
let valuesL = comPrev.values.slice(-2)
|
|
91
|
+
let p0 = { x: valuesL[0], y: valuesL[1] }
|
|
92
|
+
let p = { x: values[4], y: values[5] }
|
|
93
|
+
|
|
94
|
+
let dist0 = getDistManhattan(p0, p)
|
|
95
|
+
let dist1 = getDistManhattan(p0, cp1)
|
|
96
|
+
let dist2 = getDistManhattan(p, cp2)
|
|
97
|
+
let dist3 = getDistManhattan(cp1, cp2)
|
|
98
|
+
|
|
99
|
+
let ptIV = checkLineIntersection(p0, cp1, p, cp2, false)
|
|
100
|
+
let ptI = ptIV ? checkLineIntersection(p0, cp1, p, cp2, true) : null
|
|
101
|
+
|
|
102
|
+
// intersection is on tangent vector
|
|
103
|
+
if (ptIV && !ptI) {
|
|
104
|
+
let ptIV2 = interpolate(p, cp2, 3)
|
|
105
|
+
let pI2 = checkLineIntersection(p, ptIV2, p0, cp1, true)
|
|
106
|
+
|
|
107
|
+
if (pI2) {
|
|
108
|
+
adjust = true;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
// very uneven lengths
|
|
115
|
+
let diff1 = dist1 / dist0
|
|
116
|
+
let diff2 = dist2 / dist0
|
|
117
|
+
let diff3 = diff1 + diff2
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
if (diff1 < 0.3 && diff2 > 0.4) {
|
|
121
|
+
//console.log(diff1, diff2);
|
|
122
|
+
|
|
123
|
+
cp1 = pointAtT([p0, cp1], 1 + t / 2)
|
|
124
|
+
cp2 = pointAtT([p, cp2], t)
|
|
125
|
+
//renderPoint(markers, cp1)
|
|
126
|
+
//renderPoint(markers, cp2, 'magenta')
|
|
127
|
+
|
|
128
|
+
//adjust = true;
|
|
129
|
+
pathData[i].values[0] = cp1.x
|
|
130
|
+
pathData[i].values[1] = cp1.y
|
|
131
|
+
pathData[i].values[2] = cp2.x
|
|
132
|
+
pathData[i].values[3] = cp2.y
|
|
133
|
+
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
// cpts are intersection
|
|
139
|
+
if (ptI) {
|
|
140
|
+
adjust = true;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
//cpts are very close
|
|
144
|
+
else {
|
|
145
|
+
if (ptIV) {
|
|
146
|
+
if (dist3 < dist0 / 5) {
|
|
147
|
+
adjust = true;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
if (adjust) {
|
|
154
|
+
cp1 = pointAtT([p0, ptIV], t)
|
|
155
|
+
cp2 = pointAtT([p, ptIV], t)
|
|
156
|
+
//renderPoint(markers, ptIV)
|
|
157
|
+
pathData[i].values[0] = cp1.x
|
|
158
|
+
pathData[i].values[1] = cp1.y
|
|
159
|
+
pathData[i].values[2] = cp2.x
|
|
160
|
+
pathData[i].values[3] = cp2.y
|
|
161
|
+
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
return pathData
|
|
169
|
+
|
|
170
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { revertCubicQuadratic } from "./svgii/pathData_convert";
|
|
2
|
+
|
|
3
|
+
export function pathDataRevertCubicToQuadratic(pathData) {
|
|
4
|
+
|
|
5
|
+
for (let c = 1, l = pathData.length; c < l; c++) {
|
|
6
|
+
let com = pathData[c]
|
|
7
|
+
let { type, values, p0, cp1 = null, cp2 = null, p = null } = com;
|
|
8
|
+
if (type === 'C') {
|
|
9
|
+
//console.log(com);
|
|
10
|
+
let comQ = revertCubicQuadratic(p0, cp1, cp2, p)
|
|
11
|
+
if (comQ.type === 'Q') {
|
|
12
|
+
comQ.extreme = com.extreme
|
|
13
|
+
comQ.corner = com.corner
|
|
14
|
+
comQ.dimA = com.dimA
|
|
15
|
+
comQ.squareDist = com.squareDist
|
|
16
|
+
pathData[c] = comQ
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return pathData
|
|
21
|
+
}
|