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.
Files changed (46) hide show
  1. package/README.md +10 -0
  2. package/dist/svg-path-simplify.esm.js +3935 -1441
  3. package/dist/svg-path-simplify.esm.min.js +13 -1
  4. package/dist/svg-path-simplify.js +3953 -1459
  5. package/dist/svg-path-simplify.min.js +13 -1
  6. package/dist/svg-path-simplify.min.js.gz +0 -0
  7. package/dist/svg-path-simplify.poly.cjs +0 -1
  8. package/index.html +69 -31
  9. package/package.json +5 -9
  10. package/src/constants.js +3 -0
  11. package/src/index-node.js +0 -1
  12. package/src/index-poly.js +0 -1
  13. package/src/index.js +26 -0
  14. package/src/pathData_simplify_cubic.js +75 -46
  15. package/src/pathData_simplify_cubicsToArcs.js +566 -0
  16. package/src/pathData_simplify_harmonize_cpts.js +170 -0
  17. package/src/pathData_simplify_revertToquadratics.js +21 -0
  18. package/src/pathSimplify-main.js +274 -61
  19. package/src/poly-fit-curve-schneider.js +570 -0
  20. package/src/simplify_poly_RDP.js +146 -0
  21. package/src/simplify_poly_radial_distance.js +100 -0
  22. package/src/svg_getViewbox.js +28 -15
  23. package/src/svgii/geometry.js +389 -63
  24. package/src/svgii/geometry_area.js +2 -1
  25. package/src/svgii/pathData_analyze.js +259 -212
  26. package/src/svgii/pathData_convert.js +91 -663
  27. package/src/svgii/pathData_fromPoly.js +12 -0
  28. package/src/svgii/pathData_parse.js +90 -89
  29. package/src/svgii/pathData_parse_els.js +3 -0
  30. package/src/svgii/pathData_parse_fontello.js +449 -0
  31. package/src/svgii/pathData_remove_collinear.js +44 -37
  32. package/src/svgii/pathData_reorder.js +2 -1
  33. package/src/svgii/pathData_simplify_redraw.js +343 -0
  34. package/src/svgii/pathData_simplify_refineCorners.js +18 -9
  35. package/src/svgii/pathData_simplify_refineExtremes.js +19 -78
  36. package/src/svgii/pathData_split.js +42 -45
  37. package/src/svgii/pathData_toPolygon.js +130 -4
  38. package/src/svgii/pathData_transform_scale.js +51 -0
  39. package/src/svgii/poly_analyze.js +470 -14
  40. package/src/svgii/poly_to_pathdata.js +224 -19
  41. package/src/svgii/rounding.js +55 -112
  42. package/src/svgii/svg_cleanup.js +13 -1
  43. package/src/svgii/visualize.js +8 -3
  44. package/{debug.cjs → tests/debug.cjs} +3 -0
  45. package/{testSVG.js → tests/testSVG.js} +1 -1
  46. /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
+ }