plotboilerplate 1.20.2 → 1.22.0
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/dist/index.esm.js +2012 -1366
- package/dist/index.esm.js.map +1 -1
- package/dist/index.esm.min.js +1 -1
- package/dist/index.esm.min.js.map +1 -1
- package/dist/plotboilerplate.browser.min.js +1 -1
- package/dist/plotboilerplate.browser.min.js.map +1 -1
- package/dist/plotboilerplate.js +1199 -541
- package/dist/plotboilerplate.min.js +1 -1
- package/package.json +3 -2
- package/src/cjs/BezierPath.d.ts +27 -49
- package/src/cjs/BezierPath.js +67 -234
- package/src/cjs/BezierPath.js.map +1 -1
- package/src/cjs/Bounds.d.ts +14 -1
- package/src/cjs/Bounds.js +21 -1
- package/src/cjs/Bounds.js.map +1 -1
- package/src/cjs/CubicBezierCurve.d.ts +70 -1
- package/src/cjs/CubicBezierCurve.js +130 -12
- package/src/cjs/CubicBezierCurve.js.map +1 -1
- package/src/cjs/Line.d.ts +2 -1
- package/src/cjs/Line.js +1 -0
- package/src/cjs/Line.js.map +1 -1
- package/src/cjs/PBText.d.ts +2 -1
- package/src/cjs/PBText.js +10 -9
- package/src/cjs/PBText.js.map +1 -1
- package/src/cjs/PlotBoilerplate.d.ts +4 -13
- package/src/cjs/PlotBoilerplate.js +61 -15
- package/src/cjs/PlotBoilerplate.js.map +1 -1
- package/src/cjs/Polygon.d.ts +47 -1
- package/src/cjs/Polygon.js +116 -1
- package/src/cjs/Polygon.js.map +1 -1
- package/src/cjs/VEllipse.js +1 -1
- package/src/cjs/VEllipse.js.map +1 -1
- package/src/cjs/Vector.d.ts +4 -4
- package/src/cjs/Vector.js +2 -2
- package/src/cjs/Vector.js.map +1 -1
- package/src/cjs/VertTuple.d.ts +2 -1
- package/src/cjs/VertTuple.js +4 -3
- package/src/cjs/VertTuple.js.map +1 -1
- package/src/cjs/Vertex.d.ts +14 -3
- package/src/cjs/Vertex.js +18 -3
- package/src/cjs/Vertex.js.map +1 -1
- package/src/cjs/draw.d.ts +154 -75
- package/src/cjs/draw.js +308 -137
- package/src/cjs/draw.js.map +1 -1
- package/src/cjs/drawgl.d.ts +87 -50
- package/src/cjs/drawgl.js +86 -31
- package/src/cjs/drawgl.js.map +1 -1
- package/src/cjs/drawutilssvg.d.ts +226 -53
- package/src/cjs/drawutilssvg.js +374 -92
- package/src/cjs/drawutilssvg.js.map +1 -1
- package/src/cjs/interfaces/DrawLib.d.ts +157 -79
- package/src/cjs/interfaces/DrawLib.js +6 -0
- package/src/cjs/interfaces/DrawLib.js.map +1 -1
- package/src/cjs/interfaces/core.d.ts +13 -2
- package/src/cjs/interfaces/core.js +1 -0
- package/src/cjs/interfaces/core.js.map +1 -1
- package/src/cjs/utils/Params.d.ts +15 -0
- package/src/cjs/utils/Params.js +49 -0
- package/src/cjs/utils/Params.js.map +1 -0
- package/src/cjs/utils/algorithms/ContourLineDetection.d.ts +150 -0
- package/src/cjs/utils/algorithms/ContourLineDetection.js +367 -0
- package/src/cjs/utils/algorithms/ContourLineDetection.js.map +1 -0
- package/src/cjs/utils/algorithms/clearDuplicateVertices.d.ts +21 -0
- package/src/cjs/utils/algorithms/clearDuplicateVertices.js +48 -0
- package/src/cjs/utils/algorithms/clearDuplicateVertices.js.map +1 -0
- package/src/cjs/utils/creategui.js +16 -10
- package/src/cjs/utils/datastructures/DataGrid2d.d.ts +47 -0
- package/src/cjs/utils/datastructures/DataGrid2d.js +20 -0
- package/src/cjs/utils/datastructures/DataGrid2d.js.map +1 -0
- package/src/cjs/utils/datastructures/DataGrid2dListAdapter.d.ts +65 -0
- package/src/cjs/utils/datastructures/DataGrid2dListAdapter.js +84 -0
- package/src/cjs/utils/datastructures/DataGrid2dListAdapter.js.map +1 -0
- package/src/cjs/utils/datastructures/GenericPath.d.ts +14 -3
- package/src/cjs/utils/datastructures/GenericPath.js +20 -3
- package/src/cjs/utils/datastructures/GenericPath.js.map +1 -1
- package/src/cjs/utils/detectDarkMode.d.ts +10 -0
- package/src/cjs/utils/detectDarkMode.js +32 -0
- package/src/cjs/utils/detectDarkMode.js.map +1 -0
- package/src/esm/BezierPath.d.ts +27 -49
- package/src/esm/BezierPath.js +67 -234
- package/src/esm/BezierPath.js.map +1 -1
- package/src/esm/Bounds.d.ts +14 -1
- package/src/esm/Bounds.js +19 -1
- package/src/esm/Bounds.js.map +1 -1
- package/src/esm/CubicBezierCurve.d.ts +70 -1
- package/src/esm/CubicBezierCurve.js +130 -12
- package/src/esm/CubicBezierCurve.js.map +1 -1
- package/src/esm/Line.d.ts +2 -1
- package/src/esm/Line.js +1 -0
- package/src/esm/Line.js.map +1 -1
- package/src/esm/PBText.d.ts +2 -1
- package/src/esm/PBText.js +10 -9
- package/src/esm/PBText.js.map +1 -1
- package/src/esm/PlotBoilerplate.d.ts +4 -13
- package/src/esm/PlotBoilerplate.js +62 -16
- package/src/esm/PlotBoilerplate.js.map +1 -1
- package/src/esm/Polygon.d.ts +47 -1
- package/src/esm/Polygon.js +114 -1
- package/src/esm/Polygon.js.map +1 -1
- package/src/esm/VEllipse.js +1 -1
- package/src/esm/VEllipse.js.map +1 -1
- package/src/esm/Vector.d.ts +4 -4
- package/src/esm/Vector.js +2 -2
- package/src/esm/Vector.js.map +1 -1
- package/src/esm/VertTuple.d.ts +2 -1
- package/src/esm/VertTuple.js +4 -3
- package/src/esm/VertTuple.js.map +1 -1
- package/src/esm/Vertex.d.ts +14 -3
- package/src/esm/Vertex.js +18 -3
- package/src/esm/Vertex.js.map +1 -1
- package/src/esm/draw.d.ts +154 -75
- package/src/esm/draw.js +304 -135
- package/src/esm/draw.js.map +1 -1
- package/src/esm/drawgl.d.ts +87 -50
- package/src/esm/drawgl.js +86 -31
- package/src/esm/drawgl.js.map +1 -1
- package/src/esm/drawutilssvg.d.ts +226 -53
- package/src/esm/drawutilssvg.js +369 -92
- package/src/esm/drawutilssvg.js.map +1 -1
- package/src/esm/interfaces/DrawLib.d.ts +157 -79
- package/src/esm/interfaces/DrawLib.js +6 -0
- package/src/esm/interfaces/DrawLib.js.map +1 -1
- package/src/esm/interfaces/core.d.ts +13 -2
- package/src/esm/interfaces/core.js +1 -0
- package/src/esm/interfaces/core.js.map +1 -1
- package/src/esm/utils/Params.d.ts +15 -0
- package/src/esm/utils/Params.js +44 -0
- package/src/esm/utils/Params.js.map +1 -0
- package/src/esm/utils/algorithms/ContourLineDetection.d.ts +150 -0
- package/src/esm/utils/algorithms/ContourLineDetection.js +362 -0
- package/src/esm/utils/algorithms/ContourLineDetection.js.map +1 -0
- package/src/esm/utils/algorithms/clearDuplicateVertices.d.ts +21 -0
- package/src/esm/utils/algorithms/clearDuplicateVertices.js +44 -0
- package/src/esm/utils/algorithms/clearDuplicateVertices.js.map +1 -0
- package/src/esm/utils/datastructures/DataGrid2d.d.ts +47 -0
- package/src/esm/utils/datastructures/DataGrid2d.js +19 -0
- package/src/esm/utils/datastructures/DataGrid2d.js.map +1 -0
- package/src/esm/utils/datastructures/DataGrid2dListAdapter.d.ts +65 -0
- package/src/esm/utils/datastructures/DataGrid2dListAdapter.js +79 -0
- package/src/esm/utils/datastructures/DataGrid2dListAdapter.js.map +1 -0
- package/src/esm/utils/datastructures/GenericPath.d.ts +14 -3
- package/src/esm/utils/datastructures/GenericPath.js +20 -3
- package/src/esm/utils/datastructures/GenericPath.js.map +1 -1
- package/src/esm/utils/detectDarkMode.d.ts +10 -0
- package/src/esm/utils/detectDarkMode.js +28 -0
- package/src/esm/utils/detectDarkMode.js.map +1 -0
- package/src/ts/BezierPath.ts +72 -241
- package/src/ts/Bounds.ts +25 -1
- package/src/ts/CubicBezierCurve.ts +139 -12
- package/src/ts/Line.ts +2 -1
- package/src/ts/PBText.ts +10 -9
- package/src/ts/PlotBoilerplate.ts +56 -19
- package/src/ts/Polygon.ts +121 -1
- package/src/ts/VEllipse.ts +2 -2
- package/src/ts/Vector.ts +4 -4
- package/src/ts/VertTuple.ts +4 -3
- package/src/ts/Vertex.ts +20 -4
- package/src/ts/draw.ts +311 -115
- package/src/ts/drawgl.ts +133 -71
- package/src/ts/drawutilssvg.ts +543 -121
- package/src/ts/interfaces/DrawLib.ts +219 -83
- package/src/ts/interfaces/core.ts +14 -2
- package/src/ts/utils/Params.ts +47 -0
- package/src/ts/utils/algorithms/ContourLineDetection.ts +485 -0
- package/src/ts/utils/algorithms/clearDuplicateVertices.ts +49 -0
- package/src/ts/utils/datastructures/DataGrid2d.ts +54 -0
- package/src/ts/utils/datastructures/DataGrid2dListAdapter.ts +121 -0
- package/src/ts/utils/datastructures/GenericPath.ts +21 -3
- package/src/ts/utils/detectDarkMode.ts +30 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A 2D datagrid interface for getting/storing data in some 2 dimensional array style types.
|
|
3
|
+
*
|
|
4
|
+
* _|---- xIndex --->
|
|
5
|
+
* | d[0][0], d[1][0], d[2][0], ..., d[xSegmentCount-1][0]
|
|
6
|
+
* yIndex
|
|
7
|
+
* | d[0][1], d[1][1], d[2][1], ..., d[xSegmentCount-1][1]
|
|
8
|
+
* |
|
|
9
|
+
* v ...
|
|
10
|
+
*
|
|
11
|
+
* d[0][ySegmentCount-1], ..., ..., d[xSegmentCount-1][ySegmentCount-1]
|
|
12
|
+
*
|
|
13
|
+
*
|
|
14
|
+
* @date 2023-11-04
|
|
15
|
+
* @author Ikaros Kappler
|
|
16
|
+
* @version 1.0.0
|
|
17
|
+
*/
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=DataGrid2d.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataGrid2d.js","sourceRoot":"","sources":["../../../ts/utils/datastructures/DataGrid2d.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A DataGrid2d implementation on a linear array of triplets/Vector3.
|
|
3
|
+
*
|
|
4
|
+
* @author Ikaros Kappler
|
|
5
|
+
* @date 2023-10-28
|
|
6
|
+
* @modified 2023-11-04 Converted to a Typescript class.
|
|
7
|
+
* @version 1.0.0
|
|
8
|
+
**/
|
|
9
|
+
import { DataGridFace4, IDataGrid2d } from "./DataGrid2d";
|
|
10
|
+
declare type Triplet<T> = {
|
|
11
|
+
x: T;
|
|
12
|
+
y: T;
|
|
13
|
+
z: T;
|
|
14
|
+
};
|
|
15
|
+
declare type RasterPosition = {
|
|
16
|
+
xIndex: number;
|
|
17
|
+
yIndex: number;
|
|
18
|
+
xRel?: number;
|
|
19
|
+
yRel?: number;
|
|
20
|
+
};
|
|
21
|
+
export declare class DataGrid2dListAdapter<T> implements IDataGrid2d<T> {
|
|
22
|
+
/**
|
|
23
|
+
* @override
|
|
24
|
+
*/
|
|
25
|
+
readonly xSegmentCount: number;
|
|
26
|
+
/**
|
|
27
|
+
* @override
|
|
28
|
+
*/
|
|
29
|
+
readonly ySegmentCount: number;
|
|
30
|
+
minDataValue: T;
|
|
31
|
+
maxDataValue: T;
|
|
32
|
+
minXValue: T;
|
|
33
|
+
maxXValue: T;
|
|
34
|
+
minYValue: T;
|
|
35
|
+
maxYValue: T;
|
|
36
|
+
private _dataList;
|
|
37
|
+
/**
|
|
38
|
+
* Create a new DataGrid2d from the given
|
|
39
|
+
* @throws Error if xSegmentCount*ySegmentCount is larger than the capacity of the array/list.
|
|
40
|
+
* @param list
|
|
41
|
+
* @param xSegmentCount
|
|
42
|
+
* @param ySegmentCount
|
|
43
|
+
*/
|
|
44
|
+
constructor(list: Array<Triplet<T>>, xSegmentCount: number, ySegmentCount: number);
|
|
45
|
+
getIndicesFromBufferIndex(bufferIndex: number): RasterPosition;
|
|
46
|
+
getCoordsFromBufferIndex(bufferIndex: number): RasterPosition;
|
|
47
|
+
coordinateIndicesToBufferIndex(xIndex: number, yIndex: number): number;
|
|
48
|
+
/**
|
|
49
|
+
* @override
|
|
50
|
+
*/
|
|
51
|
+
getMinDataValue(): T;
|
|
52
|
+
/**
|
|
53
|
+
* @override
|
|
54
|
+
*/
|
|
55
|
+
getMaxDataValue(): T;
|
|
56
|
+
/**
|
|
57
|
+
* @override
|
|
58
|
+
*/
|
|
59
|
+
getDataValueAt(xIndex: number, yIndex: number, isDebug?: boolean): T | null;
|
|
60
|
+
/**
|
|
61
|
+
* @override
|
|
62
|
+
*/
|
|
63
|
+
getDataFace4At(xIndex: number, yIndex: number, buffer: DataGridFace4<T>): void;
|
|
64
|
+
}
|
|
65
|
+
export {};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A DataGrid2d implementation on a linear array of triplets/Vector3.
|
|
3
|
+
*
|
|
4
|
+
* @author Ikaros Kappler
|
|
5
|
+
* @date 2023-10-28
|
|
6
|
+
* @modified 2023-11-04 Converted to a Typescript class.
|
|
7
|
+
* @version 1.0.0
|
|
8
|
+
**/
|
|
9
|
+
export class DataGrid2dListAdapter {
|
|
10
|
+
/**
|
|
11
|
+
* Create a new DataGrid2d from the given
|
|
12
|
+
* @throws Error if xSegmentCount*ySegmentCount is larger than the capacity of the array/list.
|
|
13
|
+
* @param list
|
|
14
|
+
* @param xSegmentCount
|
|
15
|
+
* @param ySegmentCount
|
|
16
|
+
*/
|
|
17
|
+
constructor(list, xSegmentCount, ySegmentCount) {
|
|
18
|
+
if (xSegmentCount * ySegmentCount > list.length) {
|
|
19
|
+
throw `Cannot create DataGrid2dListAdapter, the list (length ${list.length}) does not provide enough items for ${xSegmentCount}x${ySegmentCount} required entries.`;
|
|
20
|
+
}
|
|
21
|
+
// this.canvas = document.getElementById(canvasId);
|
|
22
|
+
this.xSegmentCount = xSegmentCount;
|
|
23
|
+
this.ySegmentCount = ySegmentCount;
|
|
24
|
+
this._dataList = list;
|
|
25
|
+
}
|
|
26
|
+
getIndicesFromBufferIndex(bufferIndex) {
|
|
27
|
+
return { xIndex: Math.floor(bufferIndex % this.xSegmentCount), yIndex: Math.floor(bufferIndex / this.xSegmentCount) };
|
|
28
|
+
}
|
|
29
|
+
getCoordsFromBufferIndex(bufferIndex) {
|
|
30
|
+
var index = this.getIndicesFromBufferIndex(bufferIndex);
|
|
31
|
+
// Note that the xSegmentCount and ySegmentCount counts plane squares, each consisting of four vertices
|
|
32
|
+
index.xRel = index.xIndex / (this.xSegmentCount - 1);
|
|
33
|
+
index.yRel = index.yIndex / (this.ySegmentCount - 1);
|
|
34
|
+
return index;
|
|
35
|
+
}
|
|
36
|
+
coordinateIndicesToBufferIndex(xIndex, yIndex) {
|
|
37
|
+
return yIndex * this.xSegmentCount + xIndex;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* @override
|
|
41
|
+
*/
|
|
42
|
+
getMinDataValue() {
|
|
43
|
+
return this.minDataValue;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* @override
|
|
47
|
+
*/
|
|
48
|
+
getMaxDataValue() {
|
|
49
|
+
return this.maxDataValue;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* @override
|
|
53
|
+
*/
|
|
54
|
+
getDataValueAt(xIndex, yIndex, isDebug) {
|
|
55
|
+
// var bufferIndex = yIndex * this.xSegmentCount + xIndex;
|
|
56
|
+
var bufferIndex = this.coordinateIndicesToBufferIndex(xIndex, yIndex);
|
|
57
|
+
if (isDebug) {
|
|
58
|
+
console.log("xIndex", xIndex, "yIndex", yIndex, "bufferIndex", bufferIndex);
|
|
59
|
+
}
|
|
60
|
+
if (bufferIndex > this._dataList.length) {
|
|
61
|
+
console.error("ERR buffer index is out of bounds! xIndex", xIndex, "yIndex", yIndex, "bufferIndex", bufferIndex);
|
|
62
|
+
}
|
|
63
|
+
if (!this._dataList[bufferIndex]) {
|
|
64
|
+
console.error("ERR buffer element is null! xIndex", xIndex, "yIndex", yIndex, "bufferIndex", bufferIndex);
|
|
65
|
+
}
|
|
66
|
+
return this._dataList && bufferIndex < this._dataList.length ? this._dataList[bufferIndex].z : null;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* @override
|
|
70
|
+
*/
|
|
71
|
+
getDataFace4At(xIndex, yIndex, buffer) {
|
|
72
|
+
// buffer: array[2][2]
|
|
73
|
+
buffer[0][0] = this.getDataValueAt(xIndex, yIndex);
|
|
74
|
+
buffer[1][0] = this.getDataValueAt(xIndex + 1, yIndex);
|
|
75
|
+
buffer[1][1] = this.getDataValueAt(xIndex + 1, yIndex + 1);
|
|
76
|
+
buffer[0][1] = this.getDataValueAt(xIndex, yIndex + 1);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=DataGrid2dListAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataGrid2dListAdapter.js","sourceRoot":"","sources":["../../../ts/utils/datastructures/DataGrid2dListAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @author
|
|
3
|
-
* @version
|
|
4
|
-
* @date
|
|
2
|
+
* @author Ikaros Kappler
|
|
3
|
+
* @version 1.1.0
|
|
4
|
+
* @date 2022-10-17
|
|
5
|
+
* @modified 2023-11-27 Added the `GenericPath.getAllStartEndPoints()` function.
|
|
5
6
|
*/
|
|
6
7
|
import { Path, PathSegment } from "../../interfaces/additionals";
|
|
7
8
|
import { Vertex } from "../../Vertex";
|
|
@@ -72,4 +73,14 @@ export declare class GenericPath implements Path {
|
|
|
72
73
|
* @return {Vertex} The end point of the ending point's tangent.
|
|
73
74
|
*/
|
|
74
75
|
getEndTangent(): Vertex;
|
|
76
|
+
/**
|
|
77
|
+
* Get the sequence of all start/end points of this path.
|
|
78
|
+
* Assumption is: each path segment's end point is located on the next segment's start point
|
|
79
|
+
* to shape a full connected path.
|
|
80
|
+
*
|
|
81
|
+
* No arcs are considered here, just plain linear segments.
|
|
82
|
+
*
|
|
83
|
+
* @returns {Array<Vertex>}
|
|
84
|
+
*/
|
|
85
|
+
getAllStartEndPoints(): Array<Vertex>;
|
|
75
86
|
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @author
|
|
3
|
-
* @version
|
|
4
|
-
* @date
|
|
2
|
+
* @author Ikaros Kappler
|
|
3
|
+
* @version 1.1.0
|
|
4
|
+
* @date 2022-10-17
|
|
5
|
+
* @modified 2023-11-27 Added the `GenericPath.getAllStartEndPoints()` function.
|
|
5
6
|
*/
|
|
6
7
|
export class GenericPath {
|
|
7
8
|
constructor(startSegment) {
|
|
@@ -96,5 +97,21 @@ export class GenericPath {
|
|
|
96
97
|
getEndTangent() {
|
|
97
98
|
return this.segments[this.segments.length - 1].getEndTangent();
|
|
98
99
|
}
|
|
100
|
+
/**
|
|
101
|
+
* Get the sequence of all start/end points of this path.
|
|
102
|
+
* Assumption is: each path segment's end point is located on the next segment's start point
|
|
103
|
+
* to shape a full connected path.
|
|
104
|
+
*
|
|
105
|
+
* No arcs are considered here, just plain linear segments.
|
|
106
|
+
*
|
|
107
|
+
* @returns {Array<Vertex>}
|
|
108
|
+
*/
|
|
109
|
+
getAllStartEndPoints() {
|
|
110
|
+
const verts = [this.segments[0].getStartPoint()];
|
|
111
|
+
this.segments.forEach((segment) => {
|
|
112
|
+
verts.push(segment.getEndPoint());
|
|
113
|
+
});
|
|
114
|
+
return verts;
|
|
115
|
+
}
|
|
99
116
|
}
|
|
100
117
|
//# sourceMappingURL=GenericPath.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GenericPath.js","sourceRoot":"","sources":["../../../ts/utils/datastructures/GenericPath.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"GenericPath.js","sourceRoot":"","sources":["../../../ts/utils/datastructures/GenericPath.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,OAAO,WAAW;IAGtB,YAAY,YAAyB;QACnC,IAAI,CAAC,QAAQ,GAAG,CAAC,YAAY,CAAC,CAAC;IACjC,CAAC;IAED;;;;;;OAMG;IACH,eAAe;QACb,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED;;;;;;OAMG;IACH,YAAY,CAAC,KAAa;QACxB,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED;;;;;;OAMG;IACH,KAAK;QACH,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3F,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;YAClD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;SAC3D;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;;;OAMG;IACH,OAAO;QACL,MAAM,WAAW,GAAuB,EAAE,CAAC;QAC3C,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;YAClD,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;SAC9C;QACD,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;OAMG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IAC1C,CAAC;IAED;;;;;;OAMG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAC/D,CAAC;IAED;;;;;;OAMG;IACH,eAAe;QACb,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;IAC5C,CAAC;IAED;;;;;;OAMG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACjE,CAAC;IAED;;;;;;;;OAQG;IACH,oBAAoB;QAClB,MAAM,KAAK,GAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC;QAChE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAoB,EAAE,EAAE;YAC7C,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QACH,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @author Ikaros Kappler
|
|
3
|
+
* @date 2021-11-07
|
|
4
|
+
* @modified 2023-09-25 Ported to Typescript and added system darkmode detection.
|
|
5
|
+
* @version 1.1.0
|
|
6
|
+
*
|
|
7
|
+
* @param {Record<string,string>} GUP
|
|
8
|
+
* @returns {boolean}
|
|
9
|
+
*/
|
|
10
|
+
export declare const detectDarkMode: (GUP?: Record<string, string>) => boolean;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @author Ikaros Kappler
|
|
3
|
+
* @date 2021-11-07
|
|
4
|
+
* @modified 2023-09-25 Ported to Typescript and added system darkmode detection.
|
|
5
|
+
* @version 1.1.0
|
|
6
|
+
*
|
|
7
|
+
* @param {Record<string,string>} GUP
|
|
8
|
+
* @returns {boolean}
|
|
9
|
+
*/
|
|
10
|
+
export const detectDarkMode = (GUP) => {
|
|
11
|
+
// Respect overrides
|
|
12
|
+
if (typeof GUP !== "undefined" && GUP.hasOwnProperty("darkmode") && GUP["darkmode"]) {
|
|
13
|
+
// const overrideValue = PlotBoilerplate.utils.fetch.bool(GUP, "darkmode", null);
|
|
14
|
+
const overrideValue = !!JSON.parse(GUP["darkmode"]);
|
|
15
|
+
if (overrideValue !== null) {
|
|
16
|
+
return overrideValue;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
if (globalThis.matchMedia && globalThis.matchMedia("(prefers-color-scheme: dark)").matches) {
|
|
20
|
+
// dark mode by system
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
// else: dark mode by daytime
|
|
24
|
+
const hours = new Date().getHours();
|
|
25
|
+
const isDayTime = hours > 6 && hours < 18;
|
|
26
|
+
return !isDayTime;
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=detectDarkMode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detectDarkMode.js","sourceRoot":"","sources":["../../ts/utils/detectDarkMode.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,GAA4B,EAAE,EAAE;IAC7D,oBAAoB;IACpB,IAAI,OAAO,GAAG,KAAK,WAAW,IAAI,GAAG,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,EAAE;QACnF,iFAAiF;QACjF,MAAM,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;QACpD,IAAI,aAAa,KAAK,IAAI,EAAE;YAC1B,OAAO,aAAa,CAAC;SACtB;KACF;IACD,IAAI,UAAU,CAAC,UAAU,IAAI,UAAU,CAAC,UAAU,CAAC,8BAA8B,CAAC,CAAC,OAAO,EAAE;QAC1F,sBAAsB;QACtB,OAAO,IAAI,CAAC;KACb;IACD,6BAA6B;IAC7B,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;IACpC,MAAM,SAAS,GAAG,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;IAC1C,OAAO,CAAC,SAAS,CAAC;AACpB,CAAC,CAAC"}
|
package/src/ts/BezierPath.ts
CHANGED
|
@@ -23,7 +23,9 @@
|
|
|
23
23
|
* @modified 2022-01-31 Added `BezierPath.getEvenDistributionVertices(number)`.
|
|
24
24
|
* @modified 2022-02-02 Added the `destroy` method.
|
|
25
25
|
* @modified 2022-02-02 Cleared the `toSVGString` function (deprecated). Use `drawutilssvg` instead.
|
|
26
|
-
* @
|
|
26
|
+
* @modified 2023-10-06 Adding the `BezierPath.toPathPoints()` method.
|
|
27
|
+
* @modified 2023-10-07 Adding the `BezierPath.fromCurve(CubicBezierCurve)` static function.
|
|
28
|
+
* @version 2.6.0
|
|
27
29
|
*
|
|
28
30
|
* @file BezierPath
|
|
29
31
|
* @public
|
|
@@ -139,10 +141,13 @@ export class BezierPath implements SVGSerializable {
|
|
|
139
141
|
* @name BezierPath
|
|
140
142
|
* @param {Vertex[]} pathPoints - An array of path vertices (no control points).
|
|
141
143
|
**/
|
|
142
|
-
private constructor(
|
|
144
|
+
private constructor() {
|
|
145
|
+
// pathPoints: Array<Vertex> | undefined | null) {
|
|
143
146
|
this.uid = UIDGenerator.next();
|
|
144
147
|
|
|
145
|
-
if (!pathPoints)
|
|
148
|
+
// if (!pathPoints) {
|
|
149
|
+
// pathPoints = [];
|
|
150
|
+
// }
|
|
146
151
|
this.totalArcLength = 0.0;
|
|
147
152
|
// Set this flag to true if you want the first point and
|
|
148
153
|
// last point of the path to be auto adjusted, too.
|
|
@@ -300,220 +305,6 @@ export class BezierPath implements SVGSerializable {
|
|
|
300
305
|
return this.bezierCurves[curveIndex];
|
|
301
306
|
}
|
|
302
307
|
|
|
303
|
-
/**
|
|
304
|
-
* Remove the end point of this path (which removes the last curve from this path).<br>
|
|
305
|
-
* <br>
|
|
306
|
-
* Please note that this function does never remove the first curve, thus the path
|
|
307
|
-
* cannot be empty after this call.
|
|
308
|
-
*
|
|
309
|
-
* @method removeEndPoint
|
|
310
|
-
* @instance
|
|
311
|
-
* @memberof BezierPath
|
|
312
|
-
* @return {boolean} Indicating if the last curve was removed.
|
|
313
|
-
**/
|
|
314
|
-
/*
|
|
315
|
-
BezierPath.prototype.removeEndPoint = function() {
|
|
316
|
-
if( this.bezierCurves.length <= 1 )
|
|
317
|
-
return false;
|
|
318
|
-
|
|
319
|
-
var newArray = [ this.bezierCurves.length-1 ];
|
|
320
|
-
for( var i = 0; i < this.bezierCurves.length-1; i++ ) {
|
|
321
|
-
newArray[i] = this.bezierCurves[i];
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
// Update arc length
|
|
325
|
-
this.totalArcLength -= this.bezierCurves[ this.bezierCurves.length-1 ].getLength();
|
|
326
|
-
this.bezierCurves = newArray;
|
|
327
|
-
return true;
|
|
328
|
-
}
|
|
329
|
-
*/
|
|
330
|
-
|
|
331
|
-
/**
|
|
332
|
-
* Remove the start point of this path (which removes the first curve from this path).<br>
|
|
333
|
-
* <br>
|
|
334
|
-
* Please note that this function does never remove the last curve, thus the path
|
|
335
|
-
* cannot be empty after this call.<br>
|
|
336
|
-
*
|
|
337
|
-
* @method removeStartPoint
|
|
338
|
-
* @instance
|
|
339
|
-
* @memberof BezierPath
|
|
340
|
-
* @return {boolean} Indicating if the first curve was removed.
|
|
341
|
-
**/
|
|
342
|
-
/*
|
|
343
|
-
BezierPath.prototype.removeStartPoint = function() {
|
|
344
|
-
|
|
345
|
-
if( this.bezierCurves.length <= 1 )
|
|
346
|
-
return false;
|
|
347
|
-
|
|
348
|
-
var newArray = [ this.bezierCurves.length-1 ];
|
|
349
|
-
for( var i = 1; i < this.bezierCurves.length; i++ ) {
|
|
350
|
-
|
|
351
|
-
newArray[i-1] = this.bezierCurves[i];
|
|
352
|
-
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
// Update arc length
|
|
356
|
-
this.totalArcLength -= this.bezierCurves[ 0 ].getLength();
|
|
357
|
-
this.bezierCurves = newArray;
|
|
358
|
-
|
|
359
|
-
return true;
|
|
360
|
-
}
|
|
361
|
-
*/
|
|
362
|
-
|
|
363
|
-
/**
|
|
364
|
-
* Removes a path point inside the path.
|
|
365
|
-
*
|
|
366
|
-
* This function joins the bezier curve at the given index with
|
|
367
|
-
* its predecessor, which means that the start point at the given
|
|
368
|
-
* curve index will be removed.
|
|
369
|
-
*
|
|
370
|
-
* @method joinAt
|
|
371
|
-
* @param {number} curveIndex - The index of the curve to be joined with its predecessor.
|
|
372
|
-
* @instance
|
|
373
|
-
* @memberof BezierPath
|
|
374
|
-
* @return {boolean} True if the passed index indicated an inner vertex and the two curves were joined.
|
|
375
|
-
**/
|
|
376
|
-
/*
|
|
377
|
-
BezierPath.prototype.joinAt = function( curveIndex ) {
|
|
378
|
-
|
|
379
|
-
if( curveIndex < 0 || curveIndex >= this.bezierCurves.length )
|
|
380
|
-
return false;
|
|
381
|
-
|
|
382
|
-
var leftCurve = this.bezierCurves[ curveIndex-1 ];
|
|
383
|
-
var rightCurve = this.bezierCurves[ curveIndex ];
|
|
384
|
-
|
|
385
|
-
// Make the length of the new handle double that long
|
|
386
|
-
var leftControlPoint = leftCurve.getStartControlPoint().clone();
|
|
387
|
-
leftControlPoint.sub( leftCurve.getStartPoint() );
|
|
388
|
-
leftControlPoint.multiplyScalar( 2.0 );
|
|
389
|
-
leftControlPoint.add( leftCurve.getStartPoint() );
|
|
390
|
-
|
|
391
|
-
var rightControlPoint = rightCurve.getEndControlPoint().clone();
|
|
392
|
-
rightControlPoint.sub( rightCurve.getEndPoint() );
|
|
393
|
-
rightControlPoint.multiplyScalar( 2.0 );
|
|
394
|
-
rightControlPoint.add( rightCurve.getEndPoint() );
|
|
395
|
-
|
|
396
|
-
var newCurve = new IKRS.CubicBezierCurve( leftCurve.getStartPoint(),
|
|
397
|
-
rightCurve.getEndPoint(),
|
|
398
|
-
leftControlPoint,
|
|
399
|
-
rightControlPoint
|
|
400
|
-
);
|
|
401
|
-
// Place into array
|
|
402
|
-
var newArray = [ this.bezierCurves.length - 1 ];
|
|
403
|
-
|
|
404
|
-
for( var i = 0; i < curveIndex-1; i++ )
|
|
405
|
-
newArray[ i ] = this.bezierCurves[i];
|
|
406
|
-
|
|
407
|
-
newArray[ curveIndex-1 ] = newCurve;
|
|
408
|
-
|
|
409
|
-
// Shift trailing curves left
|
|
410
|
-
for( var i = curveIndex; i+1 < this.bezierCurves.length; i++ )
|
|
411
|
-
newArray[ i ] = this.bezierCurves[ i+1 ];
|
|
412
|
-
|
|
413
|
-
this.bezierCurves = newArray;
|
|
414
|
-
this.updateArcLengths();
|
|
415
|
-
|
|
416
|
-
return true;
|
|
417
|
-
}
|
|
418
|
-
*/
|
|
419
|
-
|
|
420
|
-
/**
|
|
421
|
-
* Add a new inner curve point to the path.<br>
|
|
422
|
-
* <br>
|
|
423
|
-
* This function splits the bezier curve at the given index and given
|
|
424
|
-
* curve segment index.
|
|
425
|
-
*
|
|
426
|
-
* @method splitAt
|
|
427
|
-
* @param {number} curveIndex - The index of the curve to split.
|
|
428
|
-
* @param {nunber} segmentIndex - The index of the curve segment where the split should be performed.
|
|
429
|
-
* @instance
|
|
430
|
-
* @memberof BezierPath
|
|
431
|
-
* @return {boolean} True if the passed indices were valid and the path was split.
|
|
432
|
-
**/
|
|
433
|
-
/*
|
|
434
|
-
BezierPath.prototype.splitAt = function( curveIndex,
|
|
435
|
-
segmentIndex
|
|
436
|
-
) {
|
|
437
|
-
// Must be a valid curve index
|
|
438
|
-
if( curveIndex < 0 || curveIndex >= this.bezierCurves.length )
|
|
439
|
-
return false;
|
|
440
|
-
|
|
441
|
-
var oldCurve = this.bezierCurves[ curveIndex ];
|
|
442
|
-
|
|
443
|
-
// Segment must be an INNER point!
|
|
444
|
-
// (the outer points are already bezier end/start points!)
|
|
445
|
-
if( segmentIndex < 1 || segmentIndex-1 >= oldCurve.segmentCache.length )
|
|
446
|
-
return false;
|
|
447
|
-
|
|
448
|
-
// Make room for a new curve
|
|
449
|
-
for( var c = this.bezierCurves.length; c > curveIndex; c-- ) {
|
|
450
|
-
// Move one position to the right
|
|
451
|
-
this.bezierCurves[ c ] = this.bezierCurves[ c-1 ];
|
|
452
|
-
}
|
|
453
|
-
|
|
454
|
-
// Accumulate segment lengths
|
|
455
|
-
var u = 0;
|
|
456
|
-
for( var i = 0; i < segmentIndex; i++ )
|
|
457
|
-
u += oldCurve.segmentLengths[i];
|
|
458
|
-
//var tangent = oldCurve.getTangentAt( u );
|
|
459
|
-
var tangent = oldCurve.getTangent( u );
|
|
460
|
-
tangent = tangent.multiplyScalar( 0.25 );
|
|
461
|
-
|
|
462
|
-
var leftEndControlPoint = oldCurve.segmentCache[ segmentIndex ].clone();
|
|
463
|
-
leftEndControlPoint.sub( tangent );
|
|
464
|
-
|
|
465
|
-
var rightStartControlPoint = oldCurve.segmentCache[ segmentIndex ].clone();
|
|
466
|
-
rightStartControlPoint.add( tangent );
|
|
467
|
-
|
|
468
|
-
// Make the old existing handles a quarter that long
|
|
469
|
-
var leftStartControlPoint = oldCurve.getStartControlPoint().clone();
|
|
470
|
-
// move to (0,0)
|
|
471
|
-
leftStartControlPoint.sub( oldCurve.getStartPoint() );
|
|
472
|
-
leftStartControlPoint.multiplyScalar( 0.25 );
|
|
473
|
-
leftStartControlPoint.add( oldCurve.getStartPoint() );
|
|
474
|
-
|
|
475
|
-
var rightEndControlPoint = oldCurve.getEndControlPoint().clone();
|
|
476
|
-
// move to (0,0)
|
|
477
|
-
rightEndControlPoint.sub( oldCurve.getEndPoint() );
|
|
478
|
-
rightEndControlPoint.multiplyScalar( 0.25 );
|
|
479
|
-
rightEndControlPoint.add( oldCurve.getEndPoint() );
|
|
480
|
-
|
|
481
|
-
var newLeft = new CubicBezierCurve( oldCurve.getStartPoint(), // old start point
|
|
482
|
-
oldCurve.segmentCache[ segmentIndex ], // new end point
|
|
483
|
-
leftStartControlPoint, // old start control point
|
|
484
|
-
leftEndControlPoint // new end control point
|
|
485
|
-
);
|
|
486
|
-
var newRight = new CubicBezierCurve( oldCurve.segmentCache[ segmentIndex ], // new start point
|
|
487
|
-
oldCurve.getEndPoint(), // old end point
|
|
488
|
-
rightStartControlPoint, // new start control point
|
|
489
|
-
rightEndControlPoint // old end control point
|
|
490
|
-
);
|
|
491
|
-
|
|
492
|
-
// Insert split curve(s) at free index
|
|
493
|
-
this.bezierCurves[ curveIndex ] = newLeft;
|
|
494
|
-
this.bezierCurves[ curveIndex + 1 ] = newRight;
|
|
495
|
-
|
|
496
|
-
// Update total arc length, even if there is only a very little change!
|
|
497
|
-
this.totalArcLength -= oldCurve.getLength();
|
|
498
|
-
this.totalArcLength += newLeft.getLength();
|
|
499
|
-
this.totalArcLength += newRight.getLength();
|
|
500
|
-
|
|
501
|
-
return true;
|
|
502
|
-
};
|
|
503
|
-
*/
|
|
504
|
-
|
|
505
|
-
/*
|
|
506
|
-
insertVertexAt( t:number ) : void {
|
|
507
|
-
console.log('Inserting vertex at', t );
|
|
508
|
-
// Find the curve index
|
|
509
|
-
var u : number = 0;
|
|
510
|
-
var curveIndex : number = -1;
|
|
511
|
-
var localT : number = 0.0;
|
|
512
|
-
for( var i = 0; curveIndex == -1 && i < this.bezierCurves.length; i++ ) {
|
|
513
|
-
|
|
514
|
-
}
|
|
515
|
-
}; */
|
|
516
|
-
|
|
517
308
|
/**
|
|
518
309
|
* Move the whole bezier path by the given (x,y)-amount.
|
|
519
310
|
*
|
|
@@ -551,24 +342,6 @@ export class BezierPath implements SVGSerializable {
|
|
|
551
342
|
* @return {BezierPath} this for chaining.
|
|
552
343
|
**/
|
|
553
344
|
scale(anchor: Vertex, scaleFactor: number): BezierPath {
|
|
554
|
-
// var scaleFactors : XYCoords = { x : scaleFactor, y : scaleFactor };
|
|
555
|
-
// for (var i = 0; i < this.bezierCurves.length; i++) {
|
|
556
|
-
// var curve = this.bezierCurves[i];
|
|
557
|
-
// curve.getStartPoint().scale(scaleFactor, anchor);
|
|
558
|
-
// curve.getStartControlPoint().scale(scaleFactor, anchor);
|
|
559
|
-
// curve.getEndControlPoint().scale(scaleFactor, anchor);
|
|
560
|
-
// // Do NOT scale the end point here!
|
|
561
|
-
// // Don't forget that the curves are connected and on curve's end point
|
|
562
|
-
// // the the successor's start point (same instance)!
|
|
563
|
-
// }
|
|
564
|
-
|
|
565
|
-
// // Finally move the last end point (was not scaled yet)
|
|
566
|
-
// if (this.bezierCurves.length > 0 && !this.adjustCircular) {
|
|
567
|
-
// this.bezierCurves[this.bezierCurves.length - 1].getEndPoint().scale(scaleFactor, anchor);
|
|
568
|
-
// }
|
|
569
|
-
|
|
570
|
-
// this.updateArcLengths();
|
|
571
|
-
// return this;
|
|
572
345
|
return this.scaleXY({ x: scaleFactor, y: scaleFactor }, anchor);
|
|
573
346
|
}
|
|
574
347
|
|
|
@@ -1132,7 +905,7 @@ export class BezierPath implements SVGSerializable {
|
|
|
1132
905
|
* @return {BezierPath}
|
|
1133
906
|
**/
|
|
1134
907
|
clone(): BezierPath {
|
|
1135
|
-
var path: BezierPath = new BezierPath(undefined);
|
|
908
|
+
var path: BezierPath = new BezierPath(); // undefined);
|
|
1136
909
|
for (var i = 0; i < this.bezierCurves.length; i++) {
|
|
1137
910
|
path.bezierCurves.push(this.bezierCurves[i].clone());
|
|
1138
911
|
// Connect splines
|
|
@@ -1168,6 +941,10 @@ export class BezierPath implements SVGSerializable {
|
|
|
1168
941
|
* This function should invalidate any installed listeners and invalidate this object.
|
|
1169
942
|
* After calling this function the object might not hold valid data any more and
|
|
1170
943
|
* should not be used.
|
|
944
|
+
*
|
|
945
|
+
* @method destroy
|
|
946
|
+
* @instance
|
|
947
|
+
* @memberof BezierPath
|
|
1171
948
|
*/
|
|
1172
949
|
destroy() {
|
|
1173
950
|
for (var i = 0; i < this.bezierCurves.length; i++) {
|
|
@@ -1176,6 +953,42 @@ export class BezierPath implements SVGSerializable {
|
|
|
1176
953
|
this.isDestroyed = true;
|
|
1177
954
|
}
|
|
1178
955
|
|
|
956
|
+
/**
|
|
957
|
+
* Convert this path to an array of path points that can be drawn by the default DrawLib
|
|
958
|
+
* implementations.
|
|
959
|
+
*
|
|
960
|
+
* @method toPathPoints
|
|
961
|
+
* @instance
|
|
962
|
+
* @memberof BezierPath
|
|
963
|
+
* @return {Array<XYCoords>}
|
|
964
|
+
*/
|
|
965
|
+
toPathPoints(): Array<XYCoords> {
|
|
966
|
+
if (this.bezierCurves.length === 0) {
|
|
967
|
+
return [];
|
|
968
|
+
}
|
|
969
|
+
if (this.bezierCurves.length === 1) {
|
|
970
|
+
return [
|
|
971
|
+
this.bezierCurves[0].startPoint,
|
|
972
|
+
this.bezierCurves[0].startControlPoint,
|
|
973
|
+
this.bezierCurves[0].endControlPoint,
|
|
974
|
+
this.bezierCurves[0].endPoint
|
|
975
|
+
];
|
|
976
|
+
}
|
|
977
|
+
const arr: Array<XYCoords> = [];
|
|
978
|
+
arr.push(this.bezierCurves[0].startPoint);
|
|
979
|
+
arr.push(this.bezierCurves[0].startControlPoint);
|
|
980
|
+
for (var i = 1; i < this.bezierCurves.length; i++) {
|
|
981
|
+
arr.push(this.bezierCurves[i - 1].endControlPoint);
|
|
982
|
+
arr.push(this.bezierCurves[i - 1].endPoint);
|
|
983
|
+
arr.push(this.bezierCurves[i].startPoint);
|
|
984
|
+
arr.push(this.bezierCurves[i].startControlPoint);
|
|
985
|
+
}
|
|
986
|
+
arr.push(this.bezierCurves[0].endControlPoint);
|
|
987
|
+
arr.push(this.bezierCurves[0].endPoint);
|
|
988
|
+
|
|
989
|
+
return arr;
|
|
990
|
+
}
|
|
991
|
+
|
|
1179
992
|
/**
|
|
1180
993
|
* Create a JSON string representation of this bézier curve.
|
|
1181
994
|
*
|
|
@@ -1215,6 +1028,21 @@ export class BezierPath implements SVGSerializable {
|
|
|
1215
1028
|
return BezierPath.fromArray(obj);
|
|
1216
1029
|
}
|
|
1217
1030
|
|
|
1031
|
+
/**
|
|
1032
|
+
* Construct a new path with a single curve. Adding more curves is always possible.
|
|
1033
|
+
*
|
|
1034
|
+
* @method fromCurve
|
|
1035
|
+
* @param {CubicBezierCurve} curve - The curve to construct a new path from.
|
|
1036
|
+
* @static
|
|
1037
|
+
* @memberof BezierPath
|
|
1038
|
+
* @return {BezierPath} The constructed bezier path instance.
|
|
1039
|
+
*/
|
|
1040
|
+
static fromCurve(curve: CubicBezierCurve): BezierPath {
|
|
1041
|
+
const path = new BezierPath(); // []);
|
|
1042
|
+
path.addCurve(curve);
|
|
1043
|
+
return path;
|
|
1044
|
+
}
|
|
1045
|
+
|
|
1218
1046
|
/**
|
|
1219
1047
|
* Create a BezierPath instance from the given array.
|
|
1220
1048
|
*
|
|
@@ -1225,16 +1053,19 @@ export class BezierPath implements SVGSerializable {
|
|
|
1225
1053
|
* @memberof BezierPath
|
|
1226
1054
|
* @return {BezierPath} The bezier path instance retrieved from the array data.
|
|
1227
1055
|
**/
|
|
1228
|
-
static fromArray(obj: any) {
|
|
1229
|
-
if (!Array.isArray(obj))
|
|
1056
|
+
static fromArray(obj: any): BezierPath {
|
|
1057
|
+
if (!Array.isArray(obj)) {
|
|
1058
|
+
throw "[BezierPath.fromArray] Passed object must be an array.";
|
|
1059
|
+
}
|
|
1230
1060
|
|
|
1231
1061
|
const arr: Array<any> = obj as Array<Array<Vertex>>; // FORCE?
|
|
1232
1062
|
|
|
1233
|
-
if (arr.length < 1)
|
|
1063
|
+
if (arr.length < 1) {
|
|
1234
1064
|
throw "[BezierPath.fromArray] Passed array must contain at least one bezier curve (has " + arr.length + ").";
|
|
1065
|
+
}
|
|
1235
1066
|
|
|
1236
1067
|
// Create an empty bezier path
|
|
1237
|
-
var bPath: BezierPath = new BezierPath(undefined);
|
|
1068
|
+
var bPath: BezierPath = new BezierPath(); // undefined);
|
|
1238
1069
|
var lastCurve: CubicBezierCurve | null = null;
|
|
1239
1070
|
for (var i = 0; i < arr.length; i++) {
|
|
1240
1071
|
// Convert object (or array?) to bezier curve
|
|
@@ -1352,7 +1183,7 @@ export class BezierPath implements SVGSerializable {
|
|
|
1352
1183
|
*/
|
|
1353
1184
|
static fromReducedList(pointArray: Array<number>, adjustCircular?: boolean): BezierPath {
|
|
1354
1185
|
// Convert to object
|
|
1355
|
-
var bezierPath: BezierPath = new BezierPath(null); // No points yet
|
|
1186
|
+
var bezierPath: BezierPath = new BezierPath(); // null); // No points yet
|
|
1356
1187
|
|
|
1357
1188
|
var startPoint: Vertex = new Vertex();
|
|
1358
1189
|
var startControlPoint: Vertex;
|