flo-mat 2.0.1 → 2.0.3
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/.eslintrc.cjs +69 -0
- package/README.md +9 -27
- package/browser/index.js +29604 -7008
- package/browser/index.min.js +1 -2
- package/node/circle.d.ts +20 -20
- package/node/circle.js +31 -31
- package/node/circle.js.map +1 -1
- package/node/compare-curvatures-at-interface.d.ts +19 -19
- package/node/compare-curvatures-at-interface.js +124 -124
- package/node/compare-curvatures-at-interface.js.map +1 -1
- package/node/contact-point.d.ts +26 -26
- package/node/contact-point.js +25 -25
- package/node/cp-node/clone.d.ts +8 -8
- package/node/cp-node/clone.js +31 -31
- package/node/cp-node/clone.js.map +1 -1
- package/node/cp-node/remove.d.ts +9 -9
- package/node/cp-node/remove.js +19 -19
- package/node/cp-node/remove.js.map +1 -1
- package/node/cp-node.d.ts +202 -202
- package/node/cp-node.js +320 -320
- package/node/cp-node.js.map +1 -1
- package/node/curve.d.ts +46 -46
- package/node/curve.js +88 -88
- package/node/curve.js.map +1 -1
- package/node/debug/cp-node-for-debugging.d.ts +11 -11
- package/node/debug/cp-node-for-debugging.js +1 -1
- package/node/debug/debug-elem-types.d.ts +32 -32
- package/node/debug/debug-elem-types.js +1 -1
- package/node/debug/debug.d.ts +50 -50
- package/node/debug/debug.js +75 -75
- package/node/debug/functions/draw-elem/bounding-hull.d.ts +3 -3
- package/node/debug/functions/draw-elem/bounding-hull.js +7 -7
- package/node/debug/functions/draw-elem/bounding-hull.js.map +1 -1
- package/node/debug/functions/draw-elem/branch.d.ts +4 -4
- package/node/debug/functions/draw-elem/branch.js +22 -22
- package/node/debug/functions/draw-elem/branch.js.map +1 -1
- package/node/debug/functions/draw-elem/culls.d.ts +4 -4
- package/node/debug/functions/draw-elem/culls.js +21 -21
- package/node/debug/functions/draw-elem/culls.js.map +1 -1
- package/node/debug/functions/draw-elem/draw-circle-percent.d.ts +3 -3
- package/node/debug/functions/draw-elem/draw-circle-percent.js +12 -12
- package/node/debug/functions/draw-elem/draw-circle-percent.js.map +1 -1
- package/node/debug/functions/draw-elem/draw-elem.d.ts +8 -8
- package/node/debug/functions/draw-elem/draw-elem.js +45 -45
- package/node/debug/functions/draw-elem/draw-elem.js.map +1 -1
- package/node/debug/functions/draw-elem/dull-corner.d.ts +4 -4
- package/node/debug/functions/draw-elem/dull-corner.js +10 -10
- package/node/debug/functions/draw-elem/dull-corner.js.map +1 -1
- package/node/debug/functions/draw-elem/leaves.d.ts +4 -4
- package/node/debug/functions/draw-elem/leaves.js +12 -12
- package/node/debug/functions/draw-elem/leaves.js.map +1 -1
- package/node/debug/functions/draw-elem/loop.d.ts +4 -4
- package/node/debug/functions/draw-elem/loop.js +11 -11
- package/node/debug/functions/draw-elem/loops.d.ts +4 -4
- package/node/debug/functions/draw-elem/loops.js +6 -6
- package/node/debug/functions/draw-elem/loose-bounding-box.d.ts +3 -3
- package/node/debug/functions/draw-elem/loose-bounding-box.js +9 -9
- package/node/debug/functions/draw-elem/loose-bounding-box.js.map +1 -1
- package/node/debug/functions/draw-elem/mat.d.ts +4 -4
- package/node/debug/functions/draw-elem/mat.js +30 -30
- package/node/debug/functions/draw-elem/mat.js.map +1 -1
- package/node/debug/functions/draw-elem/max-vertex.d.ts +4 -4
- package/node/debug/functions/draw-elem/max-vertex.js +8 -8
- package/node/debug/functions/draw-elem/max-vertex.js.map +1 -1
- package/node/debug/functions/draw-elem/min-y.d.ts +4 -4
- package/node/debug/functions/draw-elem/min-y.js +13 -13
- package/node/debug/functions/draw-elem/min-y.js.map +1 -1
- package/node/debug/functions/draw-elem/one-prong-at-dull-corner.d.ts +4 -4
- package/node/debug/functions/draw-elem/one-prong-at-dull-corner.js +12 -12
- package/node/debug/functions/draw-elem/one-prong-at-dull-corner.js.map +1 -1
- package/node/debug/functions/draw-elem/one-prong.d.ts +4 -4
- package/node/debug/functions/draw-elem/one-prong.js +16 -16
- package/node/debug/functions/draw-elem/one-prong.js.map +1 -1
- package/node/debug/functions/draw-elem/sharp-corner.d.ts +4 -4
- package/node/debug/functions/draw-elem/sharp-corner.js +9 -9
- package/node/debug/functions/draw-elem/sharp-corner.js.map +1 -1
- package/node/debug/functions/draw-elem/three-prong.d.ts +4 -4
- package/node/debug/functions/draw-elem/three-prong.js +16 -16
- package/node/debug/functions/draw-elem/three-prong.js.map +1 -1
- package/node/debug/functions/draw-elem/tight-bounding-box.d.ts +3 -3
- package/node/debug/functions/draw-elem/tight-bounding-box.js +7 -7
- package/node/debug/functions/draw-elem/tight-bounding-box.js.map +1 -1
- package/node/debug/functions/draw-elem/two-prong.d.ts +4 -4
- package/node/debug/functions/draw-elem/two-prong.js +36 -36
- package/node/debug/functions/draw-elem/two-prong.js.map +1 -1
- package/node/debug/functions/draw-elem/vertex.d.ts +4 -4
- package/node/debug/functions/draw-elem/vertex.js +27 -27
- package/node/debug/functions/draw-elem/vertex.js.map +1 -1
- package/node/debug/functions/general.d.ts +48 -48
- package/node/debug/functions/general.js +52 -52
- package/node/debug/functions/general.js.map +1 -1
- package/node/debug/functions/three-prong.d.ts +11 -11
- package/node/debug/functions/three-prong.js +184 -184
- package/node/debug/functions/three-prong.js.map +1 -1
- package/node/debug/functions/two-prong.d.ts +13 -13
- package/node/debug/functions/two-prong.js +117 -117
- package/node/debug/functions/two-prong.js.map +1 -1
- package/node/debug/three-prong-for-debugging.d.ts +31 -31
- package/node/debug/three-prong-for-debugging.js +20 -20
- package/node/debug/two-prong-for-debugging.d.ts +26 -26
- package/node/debug/two-prong-for-debugging.js +1 -1
- package/node/find-mats.d.ts +26 -26
- package/node/find-mats.js +122 -125
- package/node/find-mats.js.map +1 -1
- package/node/get-boundary-bezier-parts-to-next.d.ts +9 -9
- package/node/get-boundary-bezier-parts-to-next.js +42 -42
- package/node/get-boundary-bezier-parts-to-next.js.map +1 -1
- package/node/get-boundary-beziers-to-next.d.ts +8 -8
- package/node/get-boundary-beziers-to-next.js +44 -44
- package/node/get-boundary-beziers-to-next.js.map +1 -1
- package/node/get-bounding-box-.d.ts +2 -2
- package/node/get-bounding-box-.js +4 -4
- package/node/get-branches.d.ts +12 -12
- package/node/get-branches.js +68 -68
- package/node/get-branches.js.map +1 -1
- package/node/get-curve/get-curve-between.d.ts +9 -9
- package/node/get-curve/get-curve-between.js +56 -56
- package/node/get-curve/get-curve-between.js.map +1 -1
- package/node/get-curve/get-edge-direction.d.ts +9 -9
- package/node/get-curve/get-edge-direction.js +53 -53
- package/node/get-curve/get-edge-direction.js.map +1 -1
- package/node/get-curve-to-next.d.ts +9 -9
- package/node/get-curve-to-next.js +11 -11
- package/node/get-interface-ccw.d.ts +24 -24
- package/node/get-interface-ccw.js +97 -97
- package/node/get-interface-ccw.js.map +1 -1
- package/node/index.d.ts +36 -36
- package/node/index.js +32 -32
- package/node/loop/get-max-coordinate.d.ts +10 -10
- package/node/loop/get-max-coordinate.js +43 -43
- package/node/loop/get-max-coordinate.js.map +1 -1
- package/node/loop.d.ts +16 -16
- package/node/loop.js +34 -34
- package/node/loop.js.map +1 -1
- package/node/mat/add-to-cp-graph.d.ts +16 -16
- package/node/mat/add-to-cp-graph.js +30 -30
- package/node/mat/add-to-cp-graph.js.map +1 -1
- package/node/mat/bezier-piece.d.ts +12 -12
- package/node/mat/bezier-piece.js +1 -1
- package/node/mat/closest-boundary-point/closest-points-on-curve.d.ts +14 -14
- package/node/mat/closest-boundary-point/closest-points-on-curve.js +72 -73
- package/node/mat/closest-boundary-point/closest-points-on-curve.js.map +1 -1
- package/node/mat/closest-boundary-point/cull-bezier-pieces.d.ts +9 -9
- package/node/mat/closest-boundary-point/cull-bezier-pieces.js +19 -19
- package/node/mat/closest-boundary-point/cull-bezier-pieces.js.map +1 -1
- package/node/mat/closest-boundary-point/cull-by-loose-bounding-box.d.ts +11 -11
- package/node/mat/closest-boundary-point/cull-by-loose-bounding-box.js +24 -24
- package/node/mat/closest-boundary-point/cull-by-loose-bounding-box.js.map +1 -1
- package/node/mat/closest-boundary-point/cull-by-tight-boundary-box.d.ts +11 -11
- package/node/mat/closest-boundary-point/cull-by-tight-boundary-box.js +26 -26
- package/node/mat/closest-boundary-point/cull-by-tight-boundary-box.js.map +1 -1
- package/node/mat/closest-boundary-point/get-best-distance-squared.d.ts +8 -8
- package/node/mat/closest-boundary-point/get-best-distance-squared.js +24 -24
- package/node/mat/closest-boundary-point/get-best-distance-squared.js.map +1 -1
- package/node/mat/closest-boundary-point/get-close-boundary-points.d.ts +17 -17
- package/node/mat/closest-boundary-point/get-close-boundary-points.js +80 -80
- package/node/mat/closest-boundary-point/get-close-boundary-points.js.map +1 -1
- package/node/mat/closest-boundary-point/get-closest-boundary-point.d.ts +18 -18
- package/node/mat/closest-boundary-point/get-closest-boundary-point.js +40 -40
- package/node/mat/closest-boundary-point/get-closest-boundary-point.js.map +1 -1
- package/node/mat/corner.d.ts +37 -37
- package/node/mat/corner.js +1 -1
- package/node/mat/create-new-cp-tree.d.ts +9 -9
- package/node/mat/create-new-cp-tree.js +23 -23
- package/node/mat/create-new-cp-tree.js.map +1 -1
- package/node/mat/elem-type-two-prong.d.ts +3 -3
- package/node/mat/elem-type-two-prong.js +1 -1
- package/node/mat/find-mat/add-1-prong.d.ts +12 -12
- package/node/mat/find-mat/add-1-prong.js +42 -42
- package/node/mat/find-mat/add-1-prong.js.map +1 -1
- package/node/mat/find-mat/add-2-prong.d.ts +21 -21
- package/node/mat/find-mat/add-2-prong.js +192 -192
- package/node/mat/find-mat/add-2-prong.js.map +1 -1
- package/node/mat/find-mat/add-3-prong.d.ts +19 -19
- package/node/mat/find-mat/add-3-prong.js +54 -54
- package/node/mat/find-mat/add-3-prong.js.map +1 -1
- package/node/mat/find-mat/add-debug-info.d.ts +9 -9
- package/node/mat/find-mat/add-debug-info.js +67 -69
- package/node/mat/find-mat/add-debug-info.js.map +1 -1
- package/node/mat/find-mat/create-get-interesting-points-on-loop.d.ts +11 -11
- package/node/mat/find-mat/create-get-interesting-points-on-loop.js +51 -51
- package/node/mat/find-mat/create-get-interesting-points-on-loop.js.map +1 -1
- package/node/mat/find-mat/create-initial-cp-graph.d.ts +12 -12
- package/node/mat/find-mat/create-initial-cp-graph.js +40 -40
- package/node/mat/find-mat/create-initial-cp-graph.js.map +1 -1
- package/node/mat/find-mat/find-2-prong/add-debug-info.d.ts +8 -8
- package/node/mat/find-mat/find-2-prong/add-debug-info.js +21 -21
- package/node/mat/find-mat/find-2-prong/add-debug-info.js.map +1 -1
- package/node/mat/find-mat/find-2-prong/cull-bezier-pieces.d.ts +11 -11
- package/node/mat/find-mat/find-2-prong/cull-bezier-pieces.js +29 -29
- package/node/mat/find-mat/find-2-prong/cull-bezier-pieces.js.map +1 -1
- package/node/mat/find-mat/find-2-prong/find-2-prong.d.ts +37 -37
- package/node/mat/find-mat/find-2-prong/find-2-prong.js +232 -232
- package/node/mat/find-mat/find-2-prong/find-2-prong.js.map +1 -1
- package/node/mat/find-mat/find-2-prong/find-equidistant-point-on-line.d.ts +9 -9
- package/node/mat/find-mat/find-2-prong/find-equidistant-point-on-line.js +39 -39
- package/node/mat/find-mat/find-2-prong/find-equidistant-point-on-line.js.map +1 -1
- package/node/mat/find-mat/find-2-prong/get-initial-bezier-pieces.d.ts +11 -11
- package/node/mat/find-mat/find-2-prong/get-initial-bezier-pieces.js +37 -37
- package/node/mat/find-mat/find-2-prong/get-initial-bezier-pieces.js.map +1 -1
- package/node/mat/find-mat/find-2-prong/x-for-debugging.d.ts +9 -9
- package/node/mat/find-mat/find-2-prong/x-for-debugging.js +1 -1
- package/node/mat/find-mat/find-3-prong/calc-better-x.d.ts +19 -19
- package/node/mat/find-mat/find-3-prong/calc-better-x.js +36 -36
- package/node/mat/find-mat/find-3-prong/calc-better-x.js.map +1 -1
- package/node/mat/find-mat/find-3-prong/calc-initial-3-prong-center.d.ts +13 -13
- package/node/mat/find-mat/find-3-prong/calc-initial-3-prong-center.js +25 -25
- package/node/mat/find-mat/find-3-prong/calc-initial-3-prong-center.js.map +1 -1
- package/node/mat/find-mat/find-3-prong/find-3-prong-for-delta3s.d.ts +22 -22
- package/node/mat/find-mat/find-3-prong/find-3-prong-for-delta3s.js +159 -159
- package/node/mat/find-mat/find-3-prong/find-3-prong-for-delta3s.js.map +1 -1
- package/node/mat/find-mat/find-3-prong/find-3-prong.d.ts +16 -16
- package/node/mat/find-mat/find-3-prong/find-3-prong.js +76 -76
- package/node/mat/find-mat/find-3-prong/find-3-prong.js.map +1 -1
- package/node/mat/find-mat/find-3-prong/get-closest-points.d.ts +9 -9
- package/node/mat/find-mat/find-3-prong/get-closest-points.js +16 -16
- package/node/mat/find-mat/find-3-prong/get-closest-points.js.map +1 -1
- package/node/mat/find-mat/find-and-add-2-prongs-on-all-paths.d.ts +15 -15
- package/node/mat/find-mat/find-and-add-2-prongs-on-all-paths.js +20 -20
- package/node/mat/find-mat/find-and-add-2-prongs-on-all-paths.js.map +1 -1
- package/node/mat/find-mat/find-and-add-2-prongs.d.ts +16 -16
- package/node/mat/find-mat/find-and-add-2-prongs.js +73 -74
- package/node/mat/find-mat/find-and-add-2-prongs.js.map +1 -1
- package/node/mat/find-mat/find-and-add-3-prongs.d.ts +13 -13
- package/node/mat/find-mat/find-and-add-3-prongs.js +146 -147
- package/node/mat/find-mat/find-and-add-3-prongs.js.map +1 -1
- package/node/mat/find-mat/find-and-add-hole-closing-2-prongs.d.ts +14 -14
- package/node/mat/find-mat/find-and-add-hole-closing-2-prongs.js +33 -33
- package/node/mat/find-mat/find-and-add-hole-closing-2-prongs.js.map +1 -1
- package/node/mat/find-mat/get-potential-2-prongs.d.ts +4 -4
- package/node/mat/find-mat/get-potential-2-prongs.js +16 -16
- package/node/mat/find-mat/get-potential-2-prongs.js.map +1 -1
- package/node/mat/find-mat/get-sharp-corners.d.ts +4 -4
- package/node/mat/find-mat/get-sharp-corners.js +17 -17
- package/node/mat/find-mat/get-sharp-corners.js.map +1 -1
- package/node/mat/geometry/get-closest-square-distance-to-rect.d.ts +5 -5
- package/node/mat/geometry/get-closest-square-distance-to-rect.js +49 -49
- package/node/mat/geometry/get-closest-squared-distance-to-rotated-rect.d.ts +5 -5
- package/node/mat/geometry/get-closest-squared-distance-to-rotated-rect.js +15 -15
- package/node/mat/geometry/get-closest-squared-distance-to-rotated-rect.js.map +1 -1
- package/node/mat/get-boundary-piece-beziers.d.ts +11 -11
- package/node/mat/get-boundary-piece-beziers.js +58 -58
- package/node/mat/get-boundary-piece-beziers.js.map +1 -1
- package/node/mat/get-contact-circles-at-interface.d.ts +8 -8
- package/node/mat/get-contact-circles-at-interface.js +20 -20
- package/node/mat/get-contact-circles-at-interface.js.map +1 -1
- package/node/mat/get-largest-vertex.d.ts +4 -4
- package/node/mat/get-largest-vertex.js +9 -9
- package/node/mat/get-leaves.d.ts +4 -4
- package/node/mat/get-leaves.js +12 -12
- package/node/mat/get-leaves.js.map +1 -1
- package/node/mat/get-neighboring-cps.d.ts +14 -14
- package/node/mat/get-neighboring-cps.js +30 -30
- package/node/mat/get-neighboring-cps.js.map +1 -1
- package/node/mat/get-two-prong-type.d.ts +5 -5
- package/node/mat/get-two-prong-type.js +8 -8
- package/node/mat/is-another-cp-closeby.d.ts +20 -20
- package/node/mat/is-another-cp-closeby.js +55 -55
- package/node/mat/is-another-cp-closeby.js.map +1 -1
- package/node/mat/simplify-mat-map-only.d.ts +23 -23
- package/node/mat/simplify-mat-map-only.js +80 -80
- package/node/mat/simplify-mat-map-only.js.map +1 -1
- package/node/mat/to-scale-axis/add-debug-info.d.ts +7 -7
- package/node/mat/to-scale-axis/add-debug-info.js +13 -13
- package/node/mat/to-scale-axis/add-debug-info.js.map +1 -1
- package/node/mat/to-scale-axis/cull-non-cycles.d.ts +9 -9
- package/node/mat/to-scale-axis/cull-non-cycles.js +51 -51
- package/node/mat/to-scale-axis/cull-non-cycles.js.map +1 -1
- package/node/mat/to-scale-axis/cull.d.ts +12 -12
- package/node/mat/to-scale-axis/cull.js +132 -132
- package/node/mat/to-scale-axis/cull.js.map +1 -1
- package/node/mat/trim-mat.d.ts +8 -8
- package/node/mat/trim-mat.js +16 -16
- package/node/mat/trim-mat.js.map +1 -1
- package/node/mat.d.ts +22 -22
- package/node/mat.js +1 -1
- package/node/point-on-shape.d.ts +73 -73
- package/node/point-on-shape.js +167 -167
- package/node/point-on-shape.js.map +1 -1
- package/node/simplify-mat.d.ts +16 -16
- package/node/simplify-mat.js +71 -71
- package/node/simplify-mat.js.map +1 -1
- package/node/svg/get-loop-bounds.d.ts +12 -12
- package/node/svg/get-loop-bounds.js +80 -80
- package/node/svg/get-loop-bounds.js.map +1 -1
- package/node/svg/get-min-y-pos.d.ts +8 -8
- package/node/svg/get-min-y-pos.js +9 -9
- package/node/svg/get-shape-bounds.d.ts +9 -9
- package/node/svg/get-shape-bounds.js +35 -35
- package/node/svg/get-shape-bounds.js.map +1 -1
- package/node/sweep-line/sweep-line.d.ts +18 -18
- package/node/sweep-line/sweep-line.js +72 -72
- package/node/sweep-line/sweep-line.js.map +1 -1
- package/node/to-scale-axis.d.ts +16 -16
- package/node/to-scale-axis.js +74 -73
- package/node/to-scale-axis.js.map +1 -1
- package/node/traverse-edges.d.ts +10 -10
- package/node/traverse-edges.js +21 -21
- package/node/traverse-edges.js.map +1 -1
- package/node/traverse-vertices.d.ts +12 -12
- package/node/traverse-vertices.js +27 -27
- package/node/traverse-vertices.js.map +1 -1
- package/package.json +29 -24
- package/src/circle.ts +3 -3
- package/src/compare-curvatures-at-interface.ts +36 -36
- package/src/cp-node/clone.ts +6 -6
- package/src/cp-node/remove.ts +4 -4
- package/src/cp-node.ts +20 -20
- package/src/curve.ts +19 -19
- package/src/debug/functions/draw-elem/bounding-hull.ts +2 -2
- package/src/debug/functions/draw-elem/branch.ts +4 -4
- package/src/debug/functions/draw-elem/culls.ts +4 -4
- package/src/debug/functions/draw-elem/draw-circle-percent.ts +2 -2
- package/src/debug/functions/draw-elem/draw-elem.ts +1 -1
- package/src/debug/functions/draw-elem/dull-corner.ts +3 -3
- package/src/debug/functions/draw-elem/leaves.ts +4 -4
- package/src/debug/functions/draw-elem/loose-bounding-box.ts +2 -2
- package/src/debug/functions/draw-elem/mat.ts +4 -4
- package/src/debug/functions/draw-elem/max-vertex.ts +2 -2
- package/src/debug/functions/draw-elem/min-y.ts +3 -3
- package/src/debug/functions/draw-elem/one-prong-at-dull-corner.ts +4 -4
- package/src/debug/functions/draw-elem/one-prong.ts +4 -4
- package/src/debug/functions/draw-elem/sharp-corner.ts +2 -2
- package/src/debug/functions/draw-elem/three-prong.ts +7 -7
- package/src/debug/functions/draw-elem/tight-bounding-box.ts +1 -1
- package/src/debug/functions/draw-elem/two-prong.ts +1 -1
- package/src/debug/functions/draw-elem/vertex.ts +20 -14
- package/src/debug/functions/general.ts +3 -3
- package/src/debug/functions/three-prong.ts +37 -37
- package/src/debug/functions/two-prong.ts +15 -15
- package/src/find-mats.ts +19 -19
- package/src/get-boundary-bezier-parts-to-next.ts +8 -8
- package/src/get-boundary-beziers-to-next.ts +8 -8
- package/src/get-branches.ts +7 -7
- package/src/get-curve/get-curve-between.ts +21 -21
- package/src/get-curve/get-edge-direction.ts +13 -14
- package/src/get-interface-ccw.ts +12 -12
- package/src/loop/get-max-coordinate.ts +7 -7
- package/src/loop.ts +4 -4
- package/src/mat/add-to-cp-graph.ts +8 -8
- package/src/mat/closest-boundary-point/closest-points-on-curve.ts +5 -6
- package/src/mat/closest-boundary-point/cull-bezier-pieces.ts +1 -1
- package/src/mat/closest-boundary-point/cull-by-loose-bounding-box.ts +5 -5
- package/src/mat/closest-boundary-point/cull-by-tight-boundary-box.ts +5 -5
- package/src/mat/closest-boundary-point/get-best-distance-squared.ts +5 -5
- package/src/mat/closest-boundary-point/get-close-boundary-points.ts +15 -15
- package/src/mat/closest-boundary-point/get-closest-boundary-point.ts +4 -4
- package/src/mat/cmp-cp-on-delta.ts +5 -5
- package/src/mat/create-new-cp-tree.ts +3 -3
- package/src/mat/find-mat/add-1-prong.ts +5 -5
- package/src/mat/find-mat/add-2-prong.ts +42 -42
- package/src/mat/find-mat/add-3-prong.ts +1 -1
- package/src/mat/find-mat/add-debug-info.ts +18 -20
- package/src/mat/find-mat/create-get-interesting-points-on-loop.ts +4 -4
- package/src/mat/find-mat/create-initial-cp-graph.ts +11 -11
- package/src/mat/find-mat/find-2-prong/add-debug-info.ts +4 -4
- package/src/mat/find-mat/find-2-prong/cull-bezier-pieces.ts +5 -5
- package/src/mat/find-mat/find-2-prong/find-2-prong.ts +27 -27
- package/src/mat/find-mat/find-2-prong/find-equidistant-point-on-line.ts +7 -7
- package/src/mat/find-mat/find-2-prong/get-initial-bezier-pieces.ts +4 -4
- package/src/mat/find-mat/find-3-prong/calc-better-x.ts +4 -4
- package/src/mat/find-mat/find-3-prong/calc-initial-3-prong-center.ts +3 -3
- package/src/mat/find-mat/find-3-prong/find-3-prong-for-delta3s.ts +37 -37
- package/src/mat/find-mat/find-3-prong/find-3-prong.ts +16 -16
- package/src/mat/find-mat/find-3-prong/get-closest-points.ts +1 -1
- package/src/mat/find-mat/find-and-add-2-prongs-on-all-paths.ts +2 -2
- package/src/mat/find-mat/find-and-add-2-prongs.ts +14 -16
- package/src/mat/find-mat/find-and-add-3-prongs.ts +19 -19
- package/src/mat/find-mat/find-and-add-hole-closing-2-prongs.ts +6 -6
- package/src/mat/find-mat/get-potential-2-prongs.ts +4 -4
- package/src/mat/find-mat/get-sharp-corners.ts +4 -4
- package/src/mat/find-mat/get-total-abs-curvature.ts +1 -1
- package/src/mat/geometry/get-closest-squared-distance-to-rotated-rect.ts +3 -3
- package/src/mat/get-boundary-piece-beziers.ts +5 -5
- package/src/mat/get-contact-circles-at-interface.ts +1 -1
- package/src/mat/get-edges-as-array.ts +2 -2
- package/src/mat/get-leaves.ts +2 -2
- package/src/mat/get-neighboring-cps.ts +1 -1
- package/src/mat/is-another-cp-closeby.ts +9 -9
- package/src/mat/simplify-mat-map-only.ts +15 -15
- package/src/mat/to-scale-axis/add-debug-info.ts +6 -3
- package/src/mat/to-scale-axis/add-to-tree.ts +10 -10
- package/src/mat/to-scale-axis/calc-groups.ts +19 -19
- package/src/mat/to-scale-axis/create-spacial-tree.ts +4 -4
- package/src/mat/to-scale-axis/cull-non-cycles.ts +5 -5
- package/src/mat/to-scale-axis/cull.ts +5 -5
- package/src/mat/to-scale-axis/get-engulfed-vertices.ts +18 -18
- package/src/mat/trim-mat.ts +1 -1
- package/src/point-on-shape.ts +16 -16
- package/src/simplify-mat.ts +10 -10
- package/src/svg/get-curvature-at-interface.ts +6 -8
- package/src/svg/get-extreme.ts +1 -1
- package/src/svg/get-loop-bounds.ts +13 -13
- package/src/svg/get-shape-bounds.ts +4 -4
- package/src/sweep-line/are-boxes-intersecting.ts +4 -4
- package/src/sweep-line/sweep-line.ts +8 -8
- package/src/to-scale-axis.ts +18 -17
- package/src/traverse-edges.ts +2 -2
- package/src/traverse-vertices.ts +2 -2
- package/tsconfig.json +0 -1
- package/webpack.config.cjs +12 -63
- package/browser/index.min.js.LICENSE.txt +0 -2819
- package/browser/index.module.js +0 -7149
- package/browser/index.module.min.js +0 -2
- package/browser/index.module.min.js.LICENSE.txt +0 -2819
|
@@ -13,17 +13,16 @@ import { isPosSharpCorner } from '../point-on-shape.js';
|
|
|
13
13
|
* @param cpNode
|
|
14
14
|
*/
|
|
15
15
|
function getEdgeDirection(cpNode: CpNode) {
|
|
16
|
+
const circleCenter = cpNode.cp.circle.center;
|
|
16
17
|
|
|
17
|
-
|
|
18
|
+
const cp1 = cpNode;
|
|
19
|
+
const cp2 = cpNode.nextOnCircle;
|
|
18
20
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
+
const pos1 = cp1.cp.pointOnShape;
|
|
22
|
+
const pos2 = cp2.cp.pointOnShape;
|
|
21
23
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
let p1 = pos1.p;
|
|
26
|
-
let p2 = pos2.p;
|
|
24
|
+
const p1 = pos1.p;
|
|
25
|
+
const p2 = pos2.p;
|
|
27
26
|
|
|
28
27
|
let vDir;
|
|
29
28
|
|
|
@@ -46,20 +45,20 @@ function getEdgeDirection(cpNode: CpNode) {
|
|
|
46
45
|
curve2 = pos1.curve;
|
|
47
46
|
}
|
|
48
47
|
|
|
49
|
-
|
|
50
|
-
|
|
48
|
+
const tan1 = toUnitVector(tangent(curve1.ps, 0));
|
|
49
|
+
const tan2 = reverse( toUnitVector(tangent(curve2.ps, 1)) );
|
|
51
50
|
|
|
52
|
-
|
|
51
|
+
const x = dot(tan1, tan2);
|
|
53
52
|
// Recall the identities sin(acos(x)) = sqrt(1-x^2), etc. Also
|
|
54
53
|
// recall the half angle formulas. Then the rotation matrix, R, can
|
|
55
54
|
// be calculated.
|
|
56
|
-
|
|
57
|
-
|
|
55
|
+
const cosθ = Math.sqrt((1+x)/2);
|
|
56
|
+
const sinθ = Math.sqrt((1-x)/2);
|
|
58
57
|
|
|
59
58
|
vDir = rotate(sinθ, cosθ, tan2);
|
|
60
59
|
}
|
|
61
60
|
|
|
62
|
-
|
|
61
|
+
const v = translate(
|
|
63
62
|
toUnitVector(vDir),
|
|
64
63
|
circleCenter
|
|
65
64
|
);
|
package/src/get-interface-ccw.ts
CHANGED
|
@@ -27,14 +27,14 @@ import { compareCurvaturesAtInterface } from "./compare-curvatures-at-interface.
|
|
|
27
27
|
*/
|
|
28
28
|
// TODO - improve and make at least 46-bitlength precondition
|
|
29
29
|
function getInterfaceCcw(psI: number[][], psO: number[][]) {
|
|
30
|
-
|
|
30
|
+
const lenI = psI.length;
|
|
31
31
|
|
|
32
32
|
// second last control point of incoming curve
|
|
33
|
-
|
|
33
|
+
const p0 = psI[lenI-2];
|
|
34
34
|
// last control point of incoming curve / first control point of outgoing
|
|
35
|
-
|
|
35
|
+
const p1 = psO[0];
|
|
36
36
|
// second control point of outgoing curve
|
|
37
|
-
|
|
37
|
+
const p2 = psO[1];
|
|
38
38
|
|
|
39
39
|
/*
|
|
40
40
|
if (typeof _bez_debug_ !== 'undefined') {
|
|
@@ -63,18 +63,18 @@ function getInterfaceCcw(psI: number[][], psO: number[][]) {
|
|
|
63
63
|
*/
|
|
64
64
|
|
|
65
65
|
// Max one bit can be added in the calculations below due to bit-alignment
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
66
|
+
const xE = p1[0] - p0[0]; // tangent x-coordinate
|
|
67
|
+
const yE = p1[1] - p0[1]; // tangent y-coordinate
|
|
68
|
+
const xS = p2[0] - p1[0]; // tangent x-coordinate
|
|
69
|
+
const yS = p2[1] - p1[1]; // tangent y-coordinate
|
|
70
70
|
|
|
71
71
|
// If the tangent is to be found at t === 0 or t === 1 then using a basic
|
|
72
72
|
// property of bezier curves we can find the tangents easily as below
|
|
73
73
|
|
|
74
74
|
// (non-normalized) tangent of incoming curve at t === 1
|
|
75
|
-
|
|
75
|
+
const tangentAtEnd = [xE,yE];
|
|
76
76
|
// (non-normalized) tangent of outgoing curve at t === 0
|
|
77
|
-
|
|
77
|
+
const tangentAtStart = [xS,yS];
|
|
78
78
|
|
|
79
79
|
// The cross calculated below will have a max bitlength of
|
|
80
80
|
// (2*(maxBitLength+1))+1 === e.g. (2*(25+1)) + 1 === 53
|
|
@@ -82,7 +82,7 @@ function getInterfaceCcw(psI: number[][], psO: number[][]) {
|
|
|
82
82
|
//let crossTangents = cross(tangentAtEnd, tangentAtStart);
|
|
83
83
|
|
|
84
84
|
// The cross below is exact by adaptive infinite precision
|
|
85
|
-
|
|
85
|
+
const crossTangents = orient2d(p0, p1, p2);
|
|
86
86
|
|
|
87
87
|
if (crossTangents !== 0) {
|
|
88
88
|
return crossTangents;
|
|
@@ -91,7 +91,7 @@ function getInterfaceCcw(psI: number[][], psO: number[][]) {
|
|
|
91
91
|
// The dot calculated below will have a max bitlength of
|
|
92
92
|
// (2*(maxBitLength+1))+1 === e.g. (2*(25+1)) + 1 === 53
|
|
93
93
|
// If the preconditions are met it is exact
|
|
94
|
-
|
|
94
|
+
const dotTangents = dot(tangentAtEnd, tangentAtStart);
|
|
95
95
|
if (dotTangents > 0) {
|
|
96
96
|
// Curves go in same direction at interface - neither clock or
|
|
97
97
|
// anti-clockwise.
|
|
@@ -17,10 +17,10 @@ function getLoopsMetrics(loops: number[][][][]): {
|
|
|
17
17
|
let minY = Number.POSITIVE_INFINITY;
|
|
18
18
|
let maxY = Number.NEGATIVE_INFINITY;
|
|
19
19
|
|
|
20
|
-
for (
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
for (const loop of loops) { for (const ps of loop) { for (const p of ps) {
|
|
21
|
+
const x = p[0];
|
|
22
|
+
const y = p[1];
|
|
23
|
+
const c = max(abs(x), abs(y));
|
|
24
24
|
if (c > maxCoordinate) { maxCoordinate = c; }
|
|
25
25
|
if (x < minX) { minX = x; }
|
|
26
26
|
if (x > maxX) { maxX = x; }
|
|
@@ -28,9 +28,9 @@ function getLoopsMetrics(loops: number[][][][]): {
|
|
|
28
28
|
if (y > maxY) { maxY = y; }
|
|
29
29
|
} } }
|
|
30
30
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
const width = maxX - minX;
|
|
32
|
+
const height = maxY - minY;
|
|
33
|
+
const maxRadius = max(width, height);
|
|
34
34
|
|
|
35
35
|
return { maxCoordinate, maxRadius };
|
|
36
36
|
}
|
package/src/loop.ts
CHANGED
|
@@ -17,9 +17,9 @@ interface Loop {
|
|
|
17
17
|
* @param beziers A pre-ordered array of bezier curves to add initially.
|
|
18
18
|
*/
|
|
19
19
|
function loopFromBeziers(beziers: number[][][] = []) {
|
|
20
|
-
|
|
20
|
+
const curves: Curve[] = [];
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
const loop: Loop = {
|
|
23
23
|
beziers,
|
|
24
24
|
curves
|
|
25
25
|
};
|
|
@@ -30,7 +30,7 @@ function loopFromBeziers(beziers: number[][][] = []) {
|
|
|
30
30
|
|
|
31
31
|
for (let i=0; i<beziers.length; i++) {
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
const curve: Curve = {
|
|
34
34
|
loop,
|
|
35
35
|
ps: beziers[i],
|
|
36
36
|
prev,
|
|
@@ -45,7 +45,7 @@ function loopFromBeziers(beziers: number[][][] = []) {
|
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
// close loop
|
|
48
|
-
|
|
48
|
+
const lastCurve = curves[curves.length-1];
|
|
49
49
|
curves[0].prev = lastCurve;
|
|
50
50
|
lastCurve.next = curves[0];
|
|
51
51
|
|
|
@@ -23,16 +23,16 @@ function addToCpGraph(
|
|
|
23
23
|
poss : IPointOnShape[],
|
|
24
24
|
neighbors? : CpNode[][]) {
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
const newCps = poss.map((pos, i) => {
|
|
27
|
+
const cpTree = cpTrees.get(pos.curve.loop);
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
const newCp_: ContactPoint = { pointOnShape: pos, circle, order: orders[i], order2: 0 };
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
const neighboringCp = neighbors
|
|
32
32
|
? neighbors[i]
|
|
33
33
|
: getNeighbouringPoints(cpTree, pos, orders[i], 0);
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
const newCp = CpNode.insert(
|
|
36
36
|
false,
|
|
37
37
|
false,
|
|
38
38
|
cpTree,
|
|
@@ -43,10 +43,10 @@ function addToCpGraph(
|
|
|
43
43
|
return newCp;
|
|
44
44
|
});
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
const len = poss.length;
|
|
47
47
|
for (let i=0; i<len; i++) {
|
|
48
|
-
|
|
49
|
-
|
|
48
|
+
const indxPrev = i === 0 ? len-1 : i-1;
|
|
49
|
+
const indxNext = i === len-1 ? 0 : i+1;
|
|
50
50
|
|
|
51
51
|
newCps[i].prevOnCircle = newCps[indxPrev];
|
|
52
52
|
newCps[i].nextOnCircle = newCps[indxNext];
|
|
@@ -33,8 +33,7 @@ function closestPointsOnCurve(
|
|
|
33
33
|
: _poly;
|
|
34
34
|
|
|
35
35
|
// let roots: Omit<RootInterval,'multiplicity'>[] = allRootsMultiWithErrBounds(
|
|
36
|
-
|
|
37
|
-
roots = allRootsCertified(poly, tS, tE);
|
|
36
|
+
const roots: Omit<RootInterval,'multiplicity'>[] = allRootsCertified(poly, tS, tE);
|
|
38
37
|
|
|
39
38
|
// Also test the endpoints
|
|
40
39
|
let push0 = true;
|
|
@@ -64,12 +63,12 @@ function closestPointsOnCurve(
|
|
|
64
63
|
roots.push({ tS: tE, tE: tE });
|
|
65
64
|
}
|
|
66
65
|
|
|
67
|
-
|
|
66
|
+
const ps = roots.map(
|
|
68
67
|
root => {
|
|
69
|
-
|
|
70
|
-
|
|
68
|
+
const tS = root.tS;
|
|
69
|
+
const tE = root.tE;
|
|
71
70
|
// TODO - tS, tE should always stay within [0,1] - modify findRootsMulti
|
|
72
|
-
|
|
71
|
+
const t = tS < 0
|
|
73
72
|
? 0
|
|
74
73
|
: tE > 1 ? 1 : (tS + tE)/2;
|
|
75
74
|
// TODO - why does evalDeCasteljau not work here?
|
|
@@ -17,7 +17,7 @@ function cullBezierPieces(
|
|
|
17
17
|
const CULL_THRESHOLD = 0;
|
|
18
18
|
|
|
19
19
|
if (bezierPieces.length > CULL_THRESHOLD) {
|
|
20
|
-
|
|
20
|
+
const bestSquaredDistance = getBestDistanceSquared(
|
|
21
21
|
bezierPieces, p
|
|
22
22
|
);
|
|
23
23
|
bezierPieces = cullByLooseBoundingBox(
|
|
@@ -16,15 +16,15 @@ function cullByLooseBoundingBox(
|
|
|
16
16
|
p: number[],
|
|
17
17
|
dSquared: number) {
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
const candidateBezierPieces = [];
|
|
20
20
|
|
|
21
21
|
for (let i=0; i<bezierPieces.length; i++) {
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
const bezierPiece = bezierPieces[i];
|
|
23
|
+
const ps = bezierPiece.curve.ps;
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
const boundingBox = getBoundingBox_(ps);
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
const d = getClosestSquareDistanceToRect(
|
|
28
28
|
boundingBox,
|
|
29
29
|
p
|
|
30
30
|
);
|
|
@@ -20,14 +20,14 @@ function cullByTightBoundingBox(
|
|
|
20
20
|
p: number[],
|
|
21
21
|
bestSquaredDistance: number) {
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
const candidateBezierPieces = [];
|
|
24
24
|
|
|
25
25
|
for (let i=0; i<bezierPieces.length; i++) {
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
const bezierPiece = bezierPieces[i];
|
|
27
|
+
const ps = bezierPiece.curve.ps;
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
const tightBoundingBox = getBoundingBoxTight_(ps);
|
|
30
|
+
const d = getClosestSquaredDistanceToRotatedRect(
|
|
31
31
|
tightBoundingBox,
|
|
32
32
|
p
|
|
33
33
|
);
|
|
@@ -14,14 +14,14 @@ function getBestDistanceSquared(
|
|
|
14
14
|
|
|
15
15
|
let bestSquaredDistance = Number.POSITIVE_INFINITY;
|
|
16
16
|
for (let i=0; i<bezierPieces.length; i++) {
|
|
17
|
-
|
|
17
|
+
const bezierPiece = bezierPieces[i];
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
const ps = bezierPiece.curve.ps;
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
const p1 = evalDeCasteljau(ps, bezierPiece.ts[0]);
|
|
22
|
+
const p2 = evalDeCasteljau(ps, bezierPiece.ts[1]);
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
const d = Math.min(
|
|
25
25
|
squaredDistanceBetween(p, p1),
|
|
26
26
|
squaredDistanceBetween(p, p2)
|
|
27
27
|
);
|
|
@@ -21,20 +21,20 @@ function getCloseBoundaryPoints(
|
|
|
21
21
|
y: IPointOnShape,
|
|
22
22
|
distance: number) {
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
const touchedCurve = y.curve;
|
|
25
|
+
const t = y.t;
|
|
26
|
+
const p_ = y.p;
|
|
27
27
|
|
|
28
28
|
bezierPieces = cullBezierPieces(bezierPieces, point);
|
|
29
29
|
|
|
30
30
|
// TODO - integrate with is-another-cp-closeby - we MUST check angle too!
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
const DISTANCE_TOLERANCE = 1e-9;
|
|
32
|
+
const posInfos: { pos: IPointOnShape; d: number }[] = [];
|
|
33
33
|
for (let i=0; i<bezierPieces.length; i++) {
|
|
34
|
-
|
|
34
|
+
const bezierPiece = bezierPieces[i];
|
|
35
35
|
|
|
36
36
|
// TOOD - important - should be able to return multiple points
|
|
37
|
-
|
|
37
|
+
const ps = closestPointsOnCurve(
|
|
38
38
|
bezierPiece.curve,
|
|
39
39
|
point,
|
|
40
40
|
bezierPiece.ts,
|
|
@@ -45,8 +45,8 @@ function getCloseBoundaryPoints(
|
|
|
45
45
|
//if (ps === undefined) { continue; }
|
|
46
46
|
|
|
47
47
|
for (let j=0; j<ps.length; j++) {
|
|
48
|
-
|
|
49
|
-
|
|
48
|
+
const p = ps[j];
|
|
49
|
+
const d = distanceBetween(p.p, point);
|
|
50
50
|
|
|
51
51
|
let curve = bezierPiece.curve;
|
|
52
52
|
let t_= p.t;
|
|
@@ -67,23 +67,23 @@ function getCloseBoundaryPoints(
|
|
|
67
67
|
// TODO - in future remove all these checks and join n-prongs when they
|
|
68
68
|
// are being added - much simpler and more symmetric. Remeber order when
|
|
69
69
|
// comparing closeness!
|
|
70
|
-
|
|
70
|
+
const indexesToCheck: number[] = [];
|
|
71
71
|
for (let i=0; i<posInfos.length; i++) {
|
|
72
|
-
|
|
72
|
+
const pi = posInfos[i];
|
|
73
73
|
// Only check if they are close to the edges. Why??
|
|
74
74
|
//if (pi.pos.t < 1e-2 || 1-pi.pos.t < 1e-2) {
|
|
75
75
|
indexesToCheck.push(i);
|
|
76
76
|
//}
|
|
77
77
|
}
|
|
78
|
-
|
|
78
|
+
const indexesToRemove: number[] = [];
|
|
79
79
|
for (let i=0; i<indexesToCheck.length; i++) {
|
|
80
80
|
for (let j=i+1; j<indexesToCheck.length; j++) {
|
|
81
81
|
if (i === j) { continue; }
|
|
82
|
-
|
|
83
|
-
|
|
82
|
+
const p1 = posInfos[indexesToCheck[i]].pos.p;
|
|
83
|
+
const p2 = posInfos[indexesToCheck[j]].pos.p;
|
|
84
84
|
// Below checks for source point too - similar to
|
|
85
85
|
// isAnotherCpCloseBy
|
|
86
|
-
|
|
86
|
+
const p3 = p_;
|
|
87
87
|
if ((Math.abs(p1[0] - p2[0]) < 1e-6 &&
|
|
88
88
|
Math.abs(p1[1] - p2[1]) < 1e-6) ||
|
|
89
89
|
|
|
@@ -27,9 +27,9 @@ function getClosestBoundaryPoint(
|
|
|
27
27
|
let bestDistance = Number.POSITIVE_INFINITY;
|
|
28
28
|
let posInfo: { pos: IPointOnShape; d: number };
|
|
29
29
|
for (let i=0; i<bezierPieces.length; i++) {
|
|
30
|
-
|
|
30
|
+
const bezierPiece = bezierPieces[i];
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
const ps = closestPointsOnCurve(
|
|
33
33
|
bezierPiece.curve,
|
|
34
34
|
point,
|
|
35
35
|
bezierPiece.ts,
|
|
@@ -37,11 +37,11 @@ function getClosestBoundaryPoint(
|
|
|
37
37
|
t
|
|
38
38
|
);
|
|
39
39
|
|
|
40
|
-
|
|
40
|
+
const p = getObjClosestTo(point, ps, p => p.p)
|
|
41
41
|
|
|
42
42
|
if (p === undefined) { continue; }
|
|
43
43
|
|
|
44
|
-
|
|
44
|
+
const d = distanceBetween(p.p, point);
|
|
45
45
|
|
|
46
46
|
let curve = bezierPiece.curve;
|
|
47
47
|
let t_= p.t;
|
|
@@ -20,12 +20,12 @@ function cmpCpOnδ(
|
|
|
20
20
|
return 1;
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
const cpBef = δ[0].cp;
|
|
24
|
+
const cpAft = δ[1].cp;
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
const cmp = compareCps(cpBef, cpAft);
|
|
27
|
+
const cmpPrev = compareCps(cpBef, cp);
|
|
28
|
+
const cmpNext = compareCps(cp, cpAft);
|
|
29
29
|
|
|
30
30
|
if (cmp < 0) {
|
|
31
31
|
if (cmpPrev > 0 || cmpNext > 0) {
|
|
@@ -8,14 +8,14 @@ import { Loop } from '../loop.js';
|
|
|
8
8
|
* @param cpNode
|
|
9
9
|
*/
|
|
10
10
|
function createNewCpTree(cpNode: CpNode) {
|
|
11
|
-
|
|
11
|
+
const newCpTrees: Map<Loop,LlRbTree<CpNode>> = new Map();
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
const cps = cpNode.getAllOnLoop();
|
|
14
14
|
|
|
15
15
|
cps.forEach(f);
|
|
16
16
|
|
|
17
17
|
function f(cpNode: CpNode) {
|
|
18
|
-
|
|
18
|
+
const loop = cpNode.cp.pointOnShape.curve.loop;
|
|
19
19
|
let cpTree = newCpTrees.get(loop);
|
|
20
20
|
if (!cpTree) {
|
|
21
21
|
// qqq cpTree = new LlRbTree(CpNode.comparator, [], true);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
/** @
|
|
2
|
-
declare
|
|
1
|
+
/** @internal */
|
|
2
|
+
declare const _debug_: Debug;
|
|
3
3
|
|
|
4
4
|
import { LlRbTree } from 'flo-ll-rb-tree';
|
|
5
5
|
import { Debug } from '../../debug/debug.js';
|
|
@@ -44,10 +44,10 @@ function add1Prong(
|
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
//let circle = PointOnShape.getOsculatingCircle(maxOsculatingCircleRadius, pos);
|
|
47
|
-
|
|
47
|
+
const circle = getOsculatingCircle(maxOsculatingCircleRadius, pos);
|
|
48
48
|
|
|
49
|
-
//
|
|
50
|
-
|
|
49
|
+
//const order = PointOnShape.calcOrder(circle, pos);
|
|
50
|
+
const order = calcPosOrder(circle, pos);
|
|
51
51
|
// Make sure there isn't already a ContactPoint close by - it can cause
|
|
52
52
|
// floating point stability issues.
|
|
53
53
|
if (isAnotherCpCloseby(cpGraphs, pos, circle, order, 0, 1000, 'magenta')) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
/** @
|
|
2
|
-
declare
|
|
1
|
+
/** @internal */
|
|
2
|
+
declare const _debug_: Debug;
|
|
3
3
|
|
|
4
4
|
import { LlRbTree } from 'flo-ll-rb-tree';
|
|
5
5
|
import { exponent } from 'big-float-ts';
|
|
@@ -34,8 +34,8 @@ function add2Prong(
|
|
|
34
34
|
extreme : number): CpNode {
|
|
35
35
|
|
|
36
36
|
//let orderSource = PointOnShape.calcOrder(circle, posSource);
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
const orderSource = calcPosOrder(circle, posSource);
|
|
38
|
+
const orderAntipodes = posAntipodes.map(
|
|
39
39
|
posAntipode => {
|
|
40
40
|
//console.log(circle.center)
|
|
41
41
|
//return PointOnShape.calcOrder(circle, posAntipode.pos);
|
|
@@ -58,8 +58,8 @@ function add2Prong(
|
|
|
58
58
|
|
|
59
59
|
let isCloseByAntipodes = false;
|
|
60
60
|
for (let i=0; i<posAntipodes.length; i++) {
|
|
61
|
-
|
|
62
|
-
|
|
61
|
+
const posAntipode = posAntipodes[i];
|
|
62
|
+
const orderAntipode = orderAntipodes[i];
|
|
63
63
|
|
|
64
64
|
if (isAnotherCpCloseby(cpGraphs, posAntipode.pos, circle, orderAntipode, 0, extreme, 'red')) {
|
|
65
65
|
isCloseByAntipodes = true;
|
|
@@ -80,22 +80,22 @@ function add2Prong(
|
|
|
80
80
|
}
|
|
81
81
|
|
|
82
82
|
// Antipode
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
83
|
+
const newCpAntipodes: CpNode[] = [];
|
|
84
|
+
const cpAntipodes: ContactPoint[] = [];
|
|
85
|
+
const cpTreeAntipodes: LlRbTree<CpNode>[] = [];
|
|
86
|
+
const deltaAntipodes: CpNode[][] = [];
|
|
87
|
+
const loopAntipodes: Loop[] = [];
|
|
88
88
|
for (let i=0; i<posAntipodes.length; i++) {
|
|
89
|
-
|
|
90
|
-
|
|
89
|
+
const posAntipode = posAntipodes[i];
|
|
90
|
+
const orderAntipode = orderAntipodes[i];
|
|
91
91
|
|
|
92
|
-
|
|
92
|
+
const cpAntipode: ContactPoint = { pointOnShape: posAntipode.pos, circle, order: orderAntipode, order2: 0 };
|
|
93
93
|
cpAntipodes.push(cpAntipode);
|
|
94
|
-
|
|
94
|
+
const loopAntipode = posAntipode.pos.curve.loop;
|
|
95
95
|
loopAntipodes.push(loopAntipode);
|
|
96
|
-
|
|
96
|
+
const cpTreeAntipode = cpGraphs.get(loopAntipode);
|
|
97
97
|
cpTreeAntipodes.push(cpTreeAntipode);
|
|
98
|
-
|
|
98
|
+
const deltaAntipode = getNeighbouringPoints(
|
|
99
99
|
cpTreeAntipode, posAntipode.pos, orderAntipode, 0
|
|
100
100
|
);
|
|
101
101
|
deltaAntipodes.push(deltaAntipode);
|
|
@@ -111,13 +111,13 @@ function add2Prong(
|
|
|
111
111
|
|
|
112
112
|
|
|
113
113
|
// Source
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
114
|
+
const cpSource: ContactPoint = { pointOnShape: posSource, circle, order: orderSource, order2: 0 };
|
|
115
|
+
const loopSource = posSource.curve.loop;
|
|
116
|
+
const cpTreeSource = cpGraphs.get(loopSource);
|
|
117
|
+
const deltaSource = getNeighbouringPoints(
|
|
118
118
|
cpTreeSource, posSource, orderSource, 0
|
|
119
119
|
);
|
|
120
|
-
|
|
120
|
+
const newCpSource = CpNode.insert(
|
|
121
121
|
holeClosing,
|
|
122
122
|
false,
|
|
123
123
|
cpTreeSource,
|
|
@@ -134,19 +134,19 @@ function add2Prong(
|
|
|
134
134
|
newCpAntipodes[0].prevOnCircle = newCpSource;
|
|
135
135
|
newCpAntipodes[0].nextOnCircle = newCpSource;
|
|
136
136
|
} else {
|
|
137
|
-
|
|
137
|
+
const cpNodes = newCpAntipodes.slice();
|
|
138
138
|
cpNodes.push(newCpSource);
|
|
139
139
|
|
|
140
140
|
// Order points according to their angle with the x-axis
|
|
141
141
|
cpNodes.sort(byAngle(circle));
|
|
142
142
|
|
|
143
143
|
for (let i=0; i<cpNodes.length; i++) {
|
|
144
|
-
|
|
145
|
-
|
|
144
|
+
const iNext = (i+1 === cpNodes.length) ? 0 : i+1;
|
|
145
|
+
const iPrev = (i === 0) ? cpNodes.length-1 : i-1;
|
|
146
146
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
147
|
+
const cpNodeCurr = cpNodes[i];
|
|
148
|
+
const cpNodeNext = cpNodes[iNext];
|
|
149
|
+
const cpNodePrev = cpNodes[iPrev];
|
|
150
150
|
|
|
151
151
|
cpNodeCurr.nextOnCircle = cpNodeNext;
|
|
152
152
|
cpNodeCurr.prevOnCircle = cpNodePrev;
|
|
@@ -157,11 +157,11 @@ function add2Prong(
|
|
|
157
157
|
if (holeClosing) {
|
|
158
158
|
// TODO - important - take care of case where there are more than 1 antipode
|
|
159
159
|
// Duplicate ContactPoints
|
|
160
|
-
|
|
161
|
-
|
|
160
|
+
const cpB2: ContactPoint = { pointOnShape: posAntipodes[0].pos, circle, order: cpAntipodes[0].order, order2: +1 };
|
|
161
|
+
const newCpB2Node = CpNode.insert(true, false, cpTreeAntipodes[0], cpB2, newCpAntipodes[0]);
|
|
162
162
|
|
|
163
|
-
|
|
164
|
-
|
|
163
|
+
const cpB1: ContactPoint = { pointOnShape: posSource, circle, order: cpSource.order, order2: -1 };
|
|
164
|
+
const newCpB1Node = CpNode.insert(true, false, cpTreeSource, cpB1, newCpSource.prev);
|
|
165
165
|
|
|
166
166
|
// Connect graph
|
|
167
167
|
newCpB1Node.prevOnCircle = newCpB2Node;
|
|
@@ -185,7 +185,7 @@ function add2Prong(
|
|
|
185
185
|
elems = _debug_.generated.elems['twoProng_regular'];
|
|
186
186
|
}
|
|
187
187
|
|
|
188
|
-
|
|
188
|
+
const elem = elems[elems.length-1];
|
|
189
189
|
|
|
190
190
|
if (!newCpSource) { console.log('asas')}
|
|
191
191
|
elem.cpNode = newCpSource;
|
|
@@ -230,10 +230,10 @@ function getSize(x: number, y: number) {
|
|
|
230
230
|
|
|
231
231
|
/** @hidden */
|
|
232
232
|
function byAngle(circle: Circle) {
|
|
233
|
-
|
|
234
|
-
|
|
233
|
+
const c = circle.center;
|
|
234
|
+
const r = circle.radius;
|
|
235
235
|
|
|
236
|
-
|
|
236
|
+
const exp = exponent(r);
|
|
237
237
|
|
|
238
238
|
return function(_a: CpNode, _b: CpNode) {
|
|
239
239
|
let a = _a.cp.pointOnShape.p;
|
|
@@ -244,14 +244,14 @@ function byAngle(circle: Circle) {
|
|
|
244
244
|
b = [b[0]-c[0], b[1]-c[1]];
|
|
245
245
|
|
|
246
246
|
// Scale
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
247
|
+
const ax = scale(a[0], exp);
|
|
248
|
+
const ay = scale(a[1], exp);
|
|
249
|
+
const bx = scale(b[0], exp);
|
|
250
|
+
const by = scale(b[1], exp);
|
|
251
251
|
|
|
252
252
|
// Get 'size'
|
|
253
|
-
|
|
254
|
-
|
|
253
|
+
const sa = getSize(ax, ay);
|
|
254
|
+
const sb = getSize(bx, by);
|
|
255
255
|
|
|
256
256
|
return sb - sa;
|
|
257
257
|
}
|