clipper2-ts 1.5.4-3.9a869ba
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/LICENSE +24 -0
- package/README.md +67 -0
- package/dist/Clipper.d.ts +114 -0
- package/dist/Clipper.d.ts.map +1 -0
- package/dist/Clipper.js +1134 -0
- package/dist/Clipper.js.map +1 -0
- package/dist/Core.d.ts +150 -0
- package/dist/Core.d.ts.map +1 -0
- package/dist/Core.js +645 -0
- package/dist/Core.js.map +1 -0
- package/dist/Engine.d.ts +337 -0
- package/dist/Engine.d.ts.map +1 -0
- package/dist/Engine.js +2972 -0
- package/dist/Engine.js.map +1 -0
- package/dist/Minkowski.d.ts +16 -0
- package/dist/Minkowski.d.ts.map +1 -0
- package/dist/Minkowski.js +131 -0
- package/dist/Minkowski.js.map +1 -0
- package/dist/Offset.d.ts +85 -0
- package/dist/Offset.d.ts.map +1 -0
- package/dist/Offset.js +649 -0
- package/dist/Offset.js.map +1 -0
- package/dist/RectClip.d.ts +80 -0
- package/dist/RectClip.d.ts.map +1 -0
- package/dist/RectClip.js +1009 -0
- package/dist/RectClip.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +71 -0
- package/dist/index.js.map +1 -0
- package/package.json +64 -0
- package/src/Clipper.ts +1106 -0
- package/src/Core.ts +683 -0
- package/src/Engine.ts +3116 -0
- package/src/Minkowski.ts +153 -0
- package/src/Offset.ts +711 -0
- package/src/RectClip.ts +1028 -0
- package/src/index.ts +146 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
Boost Software License - Version 1.0 - August 17th, 2003
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person or organization
|
|
4
|
+
obtaining a copy of the software and accompanying documentation covered by
|
|
5
|
+
this license (the "Software") to use, reproduce, display, distribute,
|
|
6
|
+
execute, and transmit the Software, and to prepare derivative works of the
|
|
7
|
+
Software, and to permit third-parties to whom the Software is furnished to
|
|
8
|
+
do so, all subject to the following:
|
|
9
|
+
|
|
10
|
+
The copyright notices in the Software and this entire statement, including
|
|
11
|
+
the above license grant, this restriction and the following disclaimer,
|
|
12
|
+
must be included in all copies of the Software, in whole or in part, and
|
|
13
|
+
all derivative works of the Software, unless such copies or derivative
|
|
14
|
+
works are solely in the form of machine-executable object code generated by
|
|
15
|
+
a source language processor.
|
|
16
|
+
|
|
17
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
18
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
19
|
+
FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
|
20
|
+
SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
|
21
|
+
FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
|
22
|
+
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
23
|
+
DEALINGS IN THE SOFTWARE.
|
|
24
|
+
|
package/README.md
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# clipper2-ts
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/@countertype/clipper2-ts)
|
|
4
|
+
[](https://github.com/countertype/clipper2-ts/blob/main/LICENSE)
|
|
5
|
+
|
|
6
|
+
TypeScript port of Angus Johnson's [Clipper2](https://github.com/AngusJohnson/Clipper2) library for polygon clipping and offsetting
|
|
7
|
+
|
|
8
|
+
## Installation
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
npm install @countertype/clipper2-ts
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Usage
|
|
15
|
+
|
|
16
|
+
```typescript
|
|
17
|
+
import { Clipper, FillRule, JoinType, EndType } from '@countertype/clipper2-ts';
|
|
18
|
+
|
|
19
|
+
// Define polygons as arrays of points
|
|
20
|
+
const subject = [[
|
|
21
|
+
{ x: 0, y: 0 },
|
|
22
|
+
{ x: 100, y: 0 },
|
|
23
|
+
{ x: 100, y: 100 },
|
|
24
|
+
{ x: 0, y: 100 }
|
|
25
|
+
]];
|
|
26
|
+
|
|
27
|
+
const clip = [[
|
|
28
|
+
{ x: 50, y: 50 },
|
|
29
|
+
{ x: 150, y: 50 },
|
|
30
|
+
{ x: 150, y: 150 },
|
|
31
|
+
{ x: 50, y: 150 }
|
|
32
|
+
]];
|
|
33
|
+
|
|
34
|
+
// Boolean operations
|
|
35
|
+
const intersection = Clipper.intersect(subject, clip, FillRule.NonZero);
|
|
36
|
+
const union = Clipper.union(subject, clip, FillRule.NonZero);
|
|
37
|
+
const difference = Clipper.difference(subject, clip, FillRule.NonZero);
|
|
38
|
+
const xor = Clipper.xor(subject, clip, FillRule.NonZero);
|
|
39
|
+
|
|
40
|
+
// Polygon offsetting (inflate/deflate)
|
|
41
|
+
const offset = Clipper.inflatePaths(subject, 10, JoinType.Round, EndType.Polygon);
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## API
|
|
45
|
+
|
|
46
|
+
This port follows the structure and functionality of Clipper2's C# implementation, with method names adapted to JavaScript conventions. Where C# uses `PascalCase` for methods (`AddPath`, `Execute`), this port uses `camelCase` (`addPath`, `execute`). Class names remain unchanged
|
|
47
|
+
|
|
48
|
+
For detailed API documentation, see the [official Clipper2 docs](https://www.angusj.com/clipper2/Docs/Overview.htm)
|
|
49
|
+
|
|
50
|
+
## Testing
|
|
51
|
+
|
|
52
|
+
The port includes 235 tests validating against Clipper2's reference test suite:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
npm test # Run all 235 tests
|
|
56
|
+
npm test:coverage # Run with coverage report
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Test results: 194/195 polygon tests pass (99.5%), matching C# reference implementation exactly. The single failure (Test 16, bow-tie polygon) also fails in C#
|
|
60
|
+
|
|
61
|
+
## License
|
|
62
|
+
|
|
63
|
+
Boost Software License 1.0 (same as Clipper2)
|
|
64
|
+
|
|
65
|
+
## Credits
|
|
66
|
+
|
|
67
|
+
Original library by Angus Johnson. TypeScript port by Jeremy Tribby
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/*******************************************************************************
|
|
2
|
+
* Author : Angus Johnson *
|
|
3
|
+
* Date : 5 March 2025 *
|
|
4
|
+
* Website : https://www.angusj.com *
|
|
5
|
+
* Copyright : Angus Johnson 2010-2025 *
|
|
6
|
+
* Purpose : This module contains simple functions that will likely cover *
|
|
7
|
+
* most polygon boolean and offsetting needs, while also avoiding *
|
|
8
|
+
* the inherent complexities of the other modules. *
|
|
9
|
+
* License : https://www.boost.org/LICENSE_1_0.txt *
|
|
10
|
+
*******************************************************************************/
|
|
11
|
+
import { Point64, PointD, Path64, PathD, Paths64, PathsD, Rect64, RectD, ClipType, FillRule, PointInPolygonResult } from './Core';
|
|
12
|
+
import { PolyTree64, PolyTreeD, PolyPathD } from './Engine';
|
|
13
|
+
import { JoinType, EndType } from './Offset';
|
|
14
|
+
export declare namespace Clipper {
|
|
15
|
+
const invalidRect64: Rect64;
|
|
16
|
+
const invalidRectD: RectD;
|
|
17
|
+
function intersect(subject: Paths64, clip: Paths64, fillRule: FillRule): Paths64;
|
|
18
|
+
function intersectD(subject: PathsD, clip: PathsD, fillRule: FillRule, precision?: number): PathsD;
|
|
19
|
+
function union(subject: Paths64, fillRule: FillRule): Paths64;
|
|
20
|
+
function union(subject: Paths64, clip: Paths64, fillRule: FillRule): Paths64;
|
|
21
|
+
function unionD(subject: PathsD, fillRule: FillRule): PathsD;
|
|
22
|
+
function unionD(subject: PathsD, clip: PathsD, fillRule: FillRule, precision?: number): PathsD;
|
|
23
|
+
function difference(subject: Paths64, clip: Paths64, fillRule: FillRule): Paths64;
|
|
24
|
+
function differenceD(subject: PathsD, clip: PathsD, fillRule: FillRule, precision?: number): PathsD;
|
|
25
|
+
function xor(subject: Paths64, clip: Paths64, fillRule: FillRule): Paths64;
|
|
26
|
+
function xorD(subject: PathsD, clip: PathsD, fillRule: FillRule, precision?: number): PathsD;
|
|
27
|
+
function booleanOp(clipType: ClipType, subject: Paths64 | null, clip: Paths64 | null, fillRule: FillRule): Paths64;
|
|
28
|
+
function booleanOpWithPolyTree(clipType: ClipType, subject: Paths64 | null, clip: Paths64 | null, polytree: PolyTree64, fillRule: FillRule): void;
|
|
29
|
+
function booleanOpD(clipType: ClipType, subject: PathsD, clip: PathsD | null, fillRule: FillRule, precision?: number): PathsD;
|
|
30
|
+
function booleanOpDWithPolyTree(clipType: ClipType, subject: PathsD | null, clip: PathsD | null, polytree: PolyTreeD, fillRule: FillRule, precision?: number): void;
|
|
31
|
+
function inflatePaths(paths: Paths64, delta: number, joinType: JoinType, endType: EndType, miterLimit?: number, arcTolerance?: number): Paths64;
|
|
32
|
+
function inflatePathsD(paths: PathsD, delta: number, joinType: JoinType, endType: EndType, miterLimit?: number, precision?: number, arcTolerance?: number): PathsD;
|
|
33
|
+
function rectClip(rect: Rect64, paths: Paths64): Paths64;
|
|
34
|
+
function rectClip(rect: Rect64, path: Path64): Paths64;
|
|
35
|
+
function rectClip(rect: RectD, paths: PathsD, precision?: number): PathsD;
|
|
36
|
+
function rectClip(rect: RectD, path: PathD, precision?: number): PathsD;
|
|
37
|
+
function rectClipLines(rect: Rect64, paths: Paths64): Paths64;
|
|
38
|
+
function rectClipLines(rect: Rect64, path: Path64): Paths64;
|
|
39
|
+
function rectClipLines(rect: RectD, paths: PathsD, precision?: number): PathsD;
|
|
40
|
+
function rectClipLines(rect: RectD, path: PathD, precision?: number): PathsD;
|
|
41
|
+
function minkowskiSum(pattern: Path64, path: Path64, isClosed: boolean): Paths64;
|
|
42
|
+
function minkowskiSumD(pattern: PathD, path: PathD, isClosed: boolean): PathsD;
|
|
43
|
+
function minkowskiDiff(pattern: Path64, path: Path64, isClosed: boolean): Paths64;
|
|
44
|
+
function minkowskiDiffD(pattern: PathD, path: PathD, isClosed: boolean): PathsD;
|
|
45
|
+
function area(path: Path64): number;
|
|
46
|
+
function areaPaths(paths: Paths64): number;
|
|
47
|
+
function areaD(path: PathD): number;
|
|
48
|
+
function areaPathsD(paths: PathsD): number;
|
|
49
|
+
function isPositive(poly: Path64): boolean;
|
|
50
|
+
function isPositiveD(poly: PathD): boolean;
|
|
51
|
+
function path64ToString(path: Path64): string;
|
|
52
|
+
function paths64ToString(paths: Paths64): string;
|
|
53
|
+
function pathDToString(path: PathD, precision?: number): string;
|
|
54
|
+
function pathsDToString(paths: PathsD, precision?: number): string;
|
|
55
|
+
function offsetPath(path: Path64, dx: number, dy: number): Path64;
|
|
56
|
+
function scalePoint64(pt: Point64, scale: number): Point64;
|
|
57
|
+
function scalePointD(pt: Point64, scale: number): PointD;
|
|
58
|
+
function scaleRect(rec: RectD, scale: number): Rect64;
|
|
59
|
+
function scalePath(path: Path64, scale: number): Path64;
|
|
60
|
+
function scalePaths(paths: Paths64, scale: number): Paths64;
|
|
61
|
+
function scalePathD(path: PathD, scale: number): PathD;
|
|
62
|
+
function scalePathsD(paths: PathsD, scale: number): PathsD;
|
|
63
|
+
function scalePath64(path: PathD, scale: number): Path64;
|
|
64
|
+
function scalePaths64(paths: PathsD, scale: number): Paths64;
|
|
65
|
+
function scalePathDFromInt(path: Path64, scale: number): PathD;
|
|
66
|
+
function scalePathsDFromInt(paths: Paths64, scale: number): PathsD;
|
|
67
|
+
function path64FromD(path: PathD): Path64;
|
|
68
|
+
function paths64FromD(paths: PathsD): Paths64;
|
|
69
|
+
function pathsD(paths: Paths64): PathsD;
|
|
70
|
+
function pathD(path: Path64): PathD;
|
|
71
|
+
function translatePath(path: Path64, dx: number, dy: number): Path64;
|
|
72
|
+
function translatePaths(paths: Paths64, dx: number, dy: number): Paths64;
|
|
73
|
+
function translatePathD(path: PathD, dx: number, dy: number): PathD;
|
|
74
|
+
function translatePathsD(paths: PathsD, dx: number, dy: number): PathsD;
|
|
75
|
+
function reversePath(path: Path64): Path64;
|
|
76
|
+
function reversePathD(path: PathD): PathD;
|
|
77
|
+
function reversePaths(paths: Paths64): Paths64;
|
|
78
|
+
function reversePathsD(paths: PathsD): PathsD;
|
|
79
|
+
function getBounds(path: Path64): Rect64;
|
|
80
|
+
function getBoundsPaths(paths: Paths64): Rect64;
|
|
81
|
+
function getBoundsD(path: PathD): RectD;
|
|
82
|
+
function getBoundsPathsD(paths: PathsD): RectD;
|
|
83
|
+
function makePath(arr: number[]): Path64;
|
|
84
|
+
function makePathD(arr: number[]): PathD;
|
|
85
|
+
function sqr(val: number): number;
|
|
86
|
+
function distanceSqr(pt1: Point64, pt2: Point64): number;
|
|
87
|
+
function midPoint(pt1: Point64, pt2: Point64): Point64;
|
|
88
|
+
function midPointD(pt1: PointD, pt2: PointD): PointD;
|
|
89
|
+
function inflateRect(rec: Rect64, dx: number, dy: number): void;
|
|
90
|
+
function inflateRectD(rec: RectD, dx: number, dy: number): void;
|
|
91
|
+
function pointsNearEqual(pt1: PointD, pt2: PointD, distanceSqrd: number): boolean;
|
|
92
|
+
function stripNearDuplicates(path: PathD, minEdgeLenSqrd: number, isClosedPath: boolean): PathD;
|
|
93
|
+
function stripDuplicates(path: Path64, isClosedPath: boolean): Path64;
|
|
94
|
+
function polyTreeToPaths64(polyTree: PolyTree64): Paths64;
|
|
95
|
+
function addPolyNodeToPathsD(polyPath: PolyPathD, paths: PathsD): void;
|
|
96
|
+
function polyTreeToPathsD(polyTree: PolyTreeD): PathsD;
|
|
97
|
+
function perpendicDistFromLineSqrd(pt: PointD, line1: PointD, line2: PointD): number;
|
|
98
|
+
function perpendicDistFromLineSqrd64(pt: Point64, line1: Point64, line2: Point64): number;
|
|
99
|
+
function ramerDouglasPeucker(path: Path64, epsilon: number): Path64;
|
|
100
|
+
function ramerDouglasPeuckerPaths(paths: Paths64, epsilon: number): Paths64;
|
|
101
|
+
function ramerDouglasPeuckerD(path: PathD, epsilon: number): PathD;
|
|
102
|
+
function ramerDouglasPeuckerPathsD(paths: PathsD, epsilon: number): PathsD;
|
|
103
|
+
function simplifyPath(path: Path64, epsilon: number, isClosedPath?: boolean): Path64;
|
|
104
|
+
function simplifyPaths(paths: Paths64, epsilon: number, isClosedPaths?: boolean): Paths64;
|
|
105
|
+
function simplifyPathD(path: PathD, epsilon: number, isClosedPath?: boolean): PathD;
|
|
106
|
+
function simplifyPathsD(paths: PathsD, epsilon: number, isClosedPath?: boolean): PathsD;
|
|
107
|
+
function trimCollinear(path: Path64, isOpen?: boolean): Path64;
|
|
108
|
+
function trimCollinearD(path: PathD, precision: number, isOpen?: boolean): PathD;
|
|
109
|
+
function pointInPolygon(pt: Point64, polygon: Path64): PointInPolygonResult;
|
|
110
|
+
function pointInPolygonD(pt: PointD, polygon: PathD, precision?: number): PointInPolygonResult;
|
|
111
|
+
function ellipse(center: Point64, radiusX: number, radiusY?: number, steps?: number): Path64;
|
|
112
|
+
function ellipseD(center: PointD, radiusX: number, radiusY?: number, steps?: number): PathD;
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=Clipper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Clipper.d.ts","sourceRoot":"","sources":["../src/Clipper.ts"],"names":[],"mappings":"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"}
|