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.
- package/README.md +25 -5
- package/dist/svg-path-simplify.esm.js +1250 -562
- package/dist/svg-path-simplify.esm.min.js +1 -1
- package/dist/svg-path-simplify.js +4756 -4068
- package/dist/svg-path-simplify.min.js +1 -1
- package/dist/svg-path-simplify.node.js +1250 -562
- package/dist/svg-path-simplify.node.min.js +1 -1
- package/index.html +89 -29
- package/package.json +5 -3
- package/src/detect_input.js +17 -10
- package/src/dom-polyfill.js +29 -0
- package/src/dom-polyfill_back.js +22 -0
- package/src/index.js +10 -1
- package/src/pathData_simplify_cubic.js +114 -143
- package/src/pathData_simplify_cubic_extrapolate.js +64 -35
- package/src/pathSimplify-main.js +113 -165
- package/src/svgii/geometry.js +8 -155
- package/src/svgii/geometry_flatness.js +94 -0
- package/src/svgii/pathData_analyze.js +15 -596
- package/src/svgii/pathData_convert.js +26 -17
- package/src/svgii/pathData_interpolate.js +65 -0
- package/src/svgii/pathData_parse.js +25 -9
- package/src/svgii/pathData_parse_els.js +245 -0
- package/src/svgii/pathData_remove_collinear.js +33 -28
- package/src/svgii/pathData_remove_orphaned.js +21 -0
- package/src/svgii/pathData_remove_zerolength.js +17 -3
- package/src/svgii/pathData_reorder.js +9 -3
- package/src/svgii/pathData_simplify_refineCorners.js +160 -0
- package/src/svgii/pathData_simplify_refineExtremes.js +208 -0
- package/src/svgii/pathData_split.js +43 -15
- package/src/svgii/pathData_stringify.js +3 -12
- package/src/svgii/rounding.js +35 -27
- package/src/svgii/svg_cleanup.js +4 -1
- package/testSVG.js +39 -0
- package/src/pathData_simplify_cubic_arr.js +0 -50
- package/src/svgii/simplify.js +0 -248
- package/src/svgii/simplify_bezier.js +0 -470
- 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
|
+
}
|