svg-path-simplify 0.0.7 → 0.0.9

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 (38) hide show
  1. package/README.md +25 -5
  2. package/dist/svg-path-simplify.esm.js +1250 -562
  3. package/dist/svg-path-simplify.esm.min.js +1 -1
  4. package/dist/svg-path-simplify.js +4756 -4068
  5. package/dist/svg-path-simplify.min.js +1 -1
  6. package/dist/svg-path-simplify.node.js +1250 -562
  7. package/dist/svg-path-simplify.node.min.js +1 -1
  8. package/index.html +89 -29
  9. package/package.json +5 -3
  10. package/src/detect_input.js +17 -10
  11. package/src/dom-polyfill.js +29 -0
  12. package/src/dom-polyfill_back.js +22 -0
  13. package/src/index.js +10 -1
  14. package/src/pathData_simplify_cubic.js +114 -143
  15. package/src/pathData_simplify_cubic_extrapolate.js +64 -35
  16. package/src/pathSimplify-main.js +113 -165
  17. package/src/svgii/geometry.js +8 -155
  18. package/src/svgii/geometry_flatness.js +94 -0
  19. package/src/svgii/pathData_analyze.js +15 -596
  20. package/src/svgii/pathData_convert.js +26 -17
  21. package/src/svgii/pathData_interpolate.js +65 -0
  22. package/src/svgii/pathData_parse.js +25 -9
  23. package/src/svgii/pathData_parse_els.js +245 -0
  24. package/src/svgii/pathData_remove_collinear.js +33 -28
  25. package/src/svgii/pathData_remove_orphaned.js +21 -0
  26. package/src/svgii/pathData_remove_zerolength.js +17 -3
  27. package/src/svgii/pathData_reorder.js +9 -3
  28. package/src/svgii/pathData_simplify_refineCorners.js +160 -0
  29. package/src/svgii/pathData_simplify_refineExtremes.js +208 -0
  30. package/src/svgii/pathData_split.js +43 -15
  31. package/src/svgii/pathData_stringify.js +3 -12
  32. package/src/svgii/rounding.js +35 -27
  33. package/src/svgii/svg_cleanup.js +4 -1
  34. package/testSVG.js +39 -0
  35. package/src/pathData_simplify_cubic_arr.js +0 -50
  36. package/src/svgii/simplify.js +0 -248
  37. package/src/svgii/simplify_bezier.js +0 -470
  38. package/src/svgii/simplify_linetos.js +0 -93
@@ -0,0 +1,94 @@
1
+ import { getSquareDistance } from "./geometry";
2
+ import { getPolygonArea } from "./geometry_area";
3
+
4
+ export function commandIsFlat(points, {
5
+ tolerance = 1,
6
+ debug=false
7
+ } = {}) {
8
+
9
+ let isFlat=false;
10
+ let report = {
11
+ flat:true,
12
+ steepness:0
13
+ }
14
+
15
+ let p0 = points[0];
16
+ let p = points[points.length - 1];
17
+
18
+ let xSet = new Set([...points.map(pt => +pt.x.toFixed(8))])
19
+ let ySet = new Set([...points.map(pt => +pt.y.toFixed(8))])
20
+
21
+
22
+ // must be flat
23
+ if(xSet.size===1 || ySet.size===1) return !debug ? true : report;
24
+
25
+ let squareDist = getSquareDistance(p0, p)
26
+ let threshold = squareDist / 1000 * tolerance
27
+ let area = getPolygonArea(points, true)
28
+
29
+ // flat enough
30
+ if(area < threshold) isFlat = true;
31
+
32
+ if(debug){
33
+ report.flat = isFlat;
34
+ //report.steepness = area/threshold
35
+ report.steepness = area/squareDist*10
36
+ }
37
+
38
+ return !debug ? isFlat : report;
39
+ }
40
+
41
+
42
+
43
+ // deprecated
44
+ export function checkBezierFlatness(p0, cpts, p) {
45
+
46
+ let isFlat = false;
47
+
48
+ let isCubic = cpts.length === 2;
49
+
50
+ let cp1 = cpts[0]
51
+ let cp2 = isCubic ? cpts[1] : cp1;
52
+
53
+ if (p0.x === cp1.x && p0.y === cp1.y && p.x === cp2.x && p.y === cp2.y) return true;
54
+
55
+ let dx1 = cp1.x - p0.x;
56
+ let dy1 = cp1.y - p0.y;
57
+
58
+ let dx2 = p.x - cp2.x;
59
+ let dy2 = p.y - cp2.y;
60
+
61
+ let cross1 = Math.abs(dx1 * dy2 - dy1 * dx2);
62
+
63
+ if (!cross1) return true
64
+
65
+ let dx0 = p.x - p0.x;
66
+ let dy0 = p.y - p0.y;
67
+ let cross0 = Math.abs(dx0 * dy1 - dy0 * dx1);
68
+
69
+ if (!cross0) return true
70
+
71
+ let area = getPolygonArea([p0, ...cpts, p], true)
72
+ let dist1 = getSquareDistance(p0, p)
73
+ let thresh = dist1 / 200;
74
+
75
+
76
+ // if(area<thresh) return true;
77
+ isFlat = area < thresh;
78
+ //console.log('area', area, thresh, isFlat);
79
+
80
+
81
+ /*
82
+ //let diff = Math.abs(cross0 - cross1)
83
+ //let rat0 = 1/cross0 * diff;
84
+ let rat = (cross0 / cross1)
85
+
86
+ if (rat < 1.1) {
87
+ console.log('cross', cross0, cross1, 'rat', rat );
88
+ isFlat = true;
89
+ }
90
+ */
91
+
92
+ return isFlat;
93
+
94
+ }