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.
Files changed (169) hide show
  1. package/dist/index.esm.js +2012 -1366
  2. package/dist/index.esm.js.map +1 -1
  3. package/dist/index.esm.min.js +1 -1
  4. package/dist/index.esm.min.js.map +1 -1
  5. package/dist/plotboilerplate.browser.min.js +1 -1
  6. package/dist/plotboilerplate.browser.min.js.map +1 -1
  7. package/dist/plotboilerplate.js +1199 -541
  8. package/dist/plotboilerplate.min.js +1 -1
  9. package/package.json +3 -2
  10. package/src/cjs/BezierPath.d.ts +27 -49
  11. package/src/cjs/BezierPath.js +67 -234
  12. package/src/cjs/BezierPath.js.map +1 -1
  13. package/src/cjs/Bounds.d.ts +14 -1
  14. package/src/cjs/Bounds.js +21 -1
  15. package/src/cjs/Bounds.js.map +1 -1
  16. package/src/cjs/CubicBezierCurve.d.ts +70 -1
  17. package/src/cjs/CubicBezierCurve.js +130 -12
  18. package/src/cjs/CubicBezierCurve.js.map +1 -1
  19. package/src/cjs/Line.d.ts +2 -1
  20. package/src/cjs/Line.js +1 -0
  21. package/src/cjs/Line.js.map +1 -1
  22. package/src/cjs/PBText.d.ts +2 -1
  23. package/src/cjs/PBText.js +10 -9
  24. package/src/cjs/PBText.js.map +1 -1
  25. package/src/cjs/PlotBoilerplate.d.ts +4 -13
  26. package/src/cjs/PlotBoilerplate.js +61 -15
  27. package/src/cjs/PlotBoilerplate.js.map +1 -1
  28. package/src/cjs/Polygon.d.ts +47 -1
  29. package/src/cjs/Polygon.js +116 -1
  30. package/src/cjs/Polygon.js.map +1 -1
  31. package/src/cjs/VEllipse.js +1 -1
  32. package/src/cjs/VEllipse.js.map +1 -1
  33. package/src/cjs/Vector.d.ts +4 -4
  34. package/src/cjs/Vector.js +2 -2
  35. package/src/cjs/Vector.js.map +1 -1
  36. package/src/cjs/VertTuple.d.ts +2 -1
  37. package/src/cjs/VertTuple.js +4 -3
  38. package/src/cjs/VertTuple.js.map +1 -1
  39. package/src/cjs/Vertex.d.ts +14 -3
  40. package/src/cjs/Vertex.js +18 -3
  41. package/src/cjs/Vertex.js.map +1 -1
  42. package/src/cjs/draw.d.ts +154 -75
  43. package/src/cjs/draw.js +308 -137
  44. package/src/cjs/draw.js.map +1 -1
  45. package/src/cjs/drawgl.d.ts +87 -50
  46. package/src/cjs/drawgl.js +86 -31
  47. package/src/cjs/drawgl.js.map +1 -1
  48. package/src/cjs/drawutilssvg.d.ts +226 -53
  49. package/src/cjs/drawutilssvg.js +374 -92
  50. package/src/cjs/drawutilssvg.js.map +1 -1
  51. package/src/cjs/interfaces/DrawLib.d.ts +157 -79
  52. package/src/cjs/interfaces/DrawLib.js +6 -0
  53. package/src/cjs/interfaces/DrawLib.js.map +1 -1
  54. package/src/cjs/interfaces/core.d.ts +13 -2
  55. package/src/cjs/interfaces/core.js +1 -0
  56. package/src/cjs/interfaces/core.js.map +1 -1
  57. package/src/cjs/utils/Params.d.ts +15 -0
  58. package/src/cjs/utils/Params.js +49 -0
  59. package/src/cjs/utils/Params.js.map +1 -0
  60. package/src/cjs/utils/algorithms/ContourLineDetection.d.ts +150 -0
  61. package/src/cjs/utils/algorithms/ContourLineDetection.js +367 -0
  62. package/src/cjs/utils/algorithms/ContourLineDetection.js.map +1 -0
  63. package/src/cjs/utils/algorithms/clearDuplicateVertices.d.ts +21 -0
  64. package/src/cjs/utils/algorithms/clearDuplicateVertices.js +48 -0
  65. package/src/cjs/utils/algorithms/clearDuplicateVertices.js.map +1 -0
  66. package/src/cjs/utils/creategui.js +16 -10
  67. package/src/cjs/utils/datastructures/DataGrid2d.d.ts +47 -0
  68. package/src/cjs/utils/datastructures/DataGrid2d.js +20 -0
  69. package/src/cjs/utils/datastructures/DataGrid2d.js.map +1 -0
  70. package/src/cjs/utils/datastructures/DataGrid2dListAdapter.d.ts +65 -0
  71. package/src/cjs/utils/datastructures/DataGrid2dListAdapter.js +84 -0
  72. package/src/cjs/utils/datastructures/DataGrid2dListAdapter.js.map +1 -0
  73. package/src/cjs/utils/datastructures/GenericPath.d.ts +14 -3
  74. package/src/cjs/utils/datastructures/GenericPath.js +20 -3
  75. package/src/cjs/utils/datastructures/GenericPath.js.map +1 -1
  76. package/src/cjs/utils/detectDarkMode.d.ts +10 -0
  77. package/src/cjs/utils/detectDarkMode.js +32 -0
  78. package/src/cjs/utils/detectDarkMode.js.map +1 -0
  79. package/src/esm/BezierPath.d.ts +27 -49
  80. package/src/esm/BezierPath.js +67 -234
  81. package/src/esm/BezierPath.js.map +1 -1
  82. package/src/esm/Bounds.d.ts +14 -1
  83. package/src/esm/Bounds.js +19 -1
  84. package/src/esm/Bounds.js.map +1 -1
  85. package/src/esm/CubicBezierCurve.d.ts +70 -1
  86. package/src/esm/CubicBezierCurve.js +130 -12
  87. package/src/esm/CubicBezierCurve.js.map +1 -1
  88. package/src/esm/Line.d.ts +2 -1
  89. package/src/esm/Line.js +1 -0
  90. package/src/esm/Line.js.map +1 -1
  91. package/src/esm/PBText.d.ts +2 -1
  92. package/src/esm/PBText.js +10 -9
  93. package/src/esm/PBText.js.map +1 -1
  94. package/src/esm/PlotBoilerplate.d.ts +4 -13
  95. package/src/esm/PlotBoilerplate.js +62 -16
  96. package/src/esm/PlotBoilerplate.js.map +1 -1
  97. package/src/esm/Polygon.d.ts +47 -1
  98. package/src/esm/Polygon.js +114 -1
  99. package/src/esm/Polygon.js.map +1 -1
  100. package/src/esm/VEllipse.js +1 -1
  101. package/src/esm/VEllipse.js.map +1 -1
  102. package/src/esm/Vector.d.ts +4 -4
  103. package/src/esm/Vector.js +2 -2
  104. package/src/esm/Vector.js.map +1 -1
  105. package/src/esm/VertTuple.d.ts +2 -1
  106. package/src/esm/VertTuple.js +4 -3
  107. package/src/esm/VertTuple.js.map +1 -1
  108. package/src/esm/Vertex.d.ts +14 -3
  109. package/src/esm/Vertex.js +18 -3
  110. package/src/esm/Vertex.js.map +1 -1
  111. package/src/esm/draw.d.ts +154 -75
  112. package/src/esm/draw.js +304 -135
  113. package/src/esm/draw.js.map +1 -1
  114. package/src/esm/drawgl.d.ts +87 -50
  115. package/src/esm/drawgl.js +86 -31
  116. package/src/esm/drawgl.js.map +1 -1
  117. package/src/esm/drawutilssvg.d.ts +226 -53
  118. package/src/esm/drawutilssvg.js +369 -92
  119. package/src/esm/drawutilssvg.js.map +1 -1
  120. package/src/esm/interfaces/DrawLib.d.ts +157 -79
  121. package/src/esm/interfaces/DrawLib.js +6 -0
  122. package/src/esm/interfaces/DrawLib.js.map +1 -1
  123. package/src/esm/interfaces/core.d.ts +13 -2
  124. package/src/esm/interfaces/core.js +1 -0
  125. package/src/esm/interfaces/core.js.map +1 -1
  126. package/src/esm/utils/Params.d.ts +15 -0
  127. package/src/esm/utils/Params.js +44 -0
  128. package/src/esm/utils/Params.js.map +1 -0
  129. package/src/esm/utils/algorithms/ContourLineDetection.d.ts +150 -0
  130. package/src/esm/utils/algorithms/ContourLineDetection.js +362 -0
  131. package/src/esm/utils/algorithms/ContourLineDetection.js.map +1 -0
  132. package/src/esm/utils/algorithms/clearDuplicateVertices.d.ts +21 -0
  133. package/src/esm/utils/algorithms/clearDuplicateVertices.js +44 -0
  134. package/src/esm/utils/algorithms/clearDuplicateVertices.js.map +1 -0
  135. package/src/esm/utils/datastructures/DataGrid2d.d.ts +47 -0
  136. package/src/esm/utils/datastructures/DataGrid2d.js +19 -0
  137. package/src/esm/utils/datastructures/DataGrid2d.js.map +1 -0
  138. package/src/esm/utils/datastructures/DataGrid2dListAdapter.d.ts +65 -0
  139. package/src/esm/utils/datastructures/DataGrid2dListAdapter.js +79 -0
  140. package/src/esm/utils/datastructures/DataGrid2dListAdapter.js.map +1 -0
  141. package/src/esm/utils/datastructures/GenericPath.d.ts +14 -3
  142. package/src/esm/utils/datastructures/GenericPath.js +20 -3
  143. package/src/esm/utils/datastructures/GenericPath.js.map +1 -1
  144. package/src/esm/utils/detectDarkMode.d.ts +10 -0
  145. package/src/esm/utils/detectDarkMode.js +28 -0
  146. package/src/esm/utils/detectDarkMode.js.map +1 -0
  147. package/src/ts/BezierPath.ts +72 -241
  148. package/src/ts/Bounds.ts +25 -1
  149. package/src/ts/CubicBezierCurve.ts +139 -12
  150. package/src/ts/Line.ts +2 -1
  151. package/src/ts/PBText.ts +10 -9
  152. package/src/ts/PlotBoilerplate.ts +56 -19
  153. package/src/ts/Polygon.ts +121 -1
  154. package/src/ts/VEllipse.ts +2 -2
  155. package/src/ts/Vector.ts +4 -4
  156. package/src/ts/VertTuple.ts +4 -3
  157. package/src/ts/Vertex.ts +20 -4
  158. package/src/ts/draw.ts +311 -115
  159. package/src/ts/drawgl.ts +133 -71
  160. package/src/ts/drawutilssvg.ts +543 -121
  161. package/src/ts/interfaces/DrawLib.ts +219 -83
  162. package/src/ts/interfaces/core.ts +14 -2
  163. package/src/ts/utils/Params.ts +47 -0
  164. package/src/ts/utils/algorithms/ContourLineDetection.ts +485 -0
  165. package/src/ts/utils/algorithms/clearDuplicateVertices.ts +49 -0
  166. package/src/ts/utils/datastructures/DataGrid2d.ts +54 -0
  167. package/src/ts/utils/datastructures/DataGrid2dListAdapter.ts +121 -0
  168. package/src/ts/utils/datastructures/GenericPath.ts +21 -3
  169. 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 Ikaros Kappler
3
- * @version 1.0.0
4
- * @date 2022-10-17
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 Ikaros Kappler
3
- * @version 1.0.0
4
- * @date 2022-10-17
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;;;;GAIG;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;CACF"}
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"}
@@ -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
- * @version 2.5.0
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(pathPoints: Array<Vertex> | undefined | null) {
144
+ private constructor() {
145
+ // pathPoints: Array<Vertex> | undefined | null) {
143
146
  this.uid = UIDGenerator.next();
144
147
 
145
- if (!pathPoints) 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)) throw "[BezierPath.fromArray] Passed object must be an array.";
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;