plotboilerplate 1.23.3 → 1.24.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 (159) hide show
  1. package/README.md +6 -0
  2. package/dist/index.esm.js +1390 -265
  3. package/dist/index.esm.js.map +1 -1
  4. package/dist/index.esm.min.js +1 -1
  5. package/dist/index.esm.min.js.map +1 -1
  6. package/dist/plotboilerplate.browser.min.js +1 -1
  7. package/dist/plotboilerplate.browser.min.js.map +1 -1
  8. package/dist/plotboilerplate.js +1264 -99
  9. package/dist/plotboilerplate.min.js +1 -1
  10. package/package.json +1 -1
  11. package/src/cjs/BezierPath.d.ts +41 -5
  12. package/src/cjs/BezierPath.js +52 -2
  13. package/src/cjs/BezierPath.js.map +1 -1
  14. package/src/cjs/Bounds.d.ts +67 -3
  15. package/src/cjs/Bounds.js +101 -3
  16. package/src/cjs/Bounds.js.map +1 -1
  17. package/src/cjs/Circle.d.ts +46 -4
  18. package/src/cjs/Circle.js +82 -3
  19. package/src/cjs/Circle.js.map +1 -1
  20. package/src/cjs/CircleSector.d.ts +51 -2
  21. package/src/cjs/CircleSector.js +112 -3
  22. package/src/cjs/CircleSector.js.map +1 -1
  23. package/src/cjs/CubicBezierCurve.d.ts +113 -7
  24. package/src/cjs/CubicBezierCurve.js +281 -33
  25. package/src/cjs/CubicBezierCurve.js.map +1 -1
  26. package/src/cjs/Line.d.ts +38 -3
  27. package/src/cjs/Line.js +64 -1
  28. package/src/cjs/Line.js.map +1 -1
  29. package/src/cjs/PlotBoilerplate.js +2 -9
  30. package/src/cjs/PlotBoilerplate.js.map +1 -1
  31. package/src/cjs/Polygon.d.ts +48 -4
  32. package/src/cjs/Polygon.js +91 -16
  33. package/src/cjs/Polygon.js.map +1 -1
  34. package/src/cjs/Triangle.d.ts +52 -3
  35. package/src/cjs/Triangle.js +80 -1
  36. package/src/cjs/Triangle.js.map +1 -1
  37. package/src/cjs/VEllipse.d.ts +62 -3
  38. package/src/cjs/VEllipse.js +181 -17
  39. package/src/cjs/VEllipse.js.map +1 -1
  40. package/src/cjs/VEllipseSector.d.ts +86 -2
  41. package/src/cjs/VEllipseSector.js +148 -4
  42. package/src/cjs/VEllipseSector.js.map +1 -1
  43. package/src/cjs/Vector.d.ts +12 -2
  44. package/src/cjs/Vector.js +15 -2
  45. package/src/cjs/Vector.js.map +1 -1
  46. package/src/cjs/VertTuple.d.ts +28 -4
  47. package/src/cjs/VertTuple.js +36 -3
  48. package/src/cjs/VertTuple.js.map +1 -1
  49. package/src/cjs/Vertex.d.ts +17 -2
  50. package/src/cjs/Vertex.js +18 -1
  51. package/src/cjs/Vertex.js.map +1 -1
  52. package/src/cjs/interfaces/core.d.ts +39 -0
  53. package/src/cjs/interfaces/core.js +2 -0
  54. package/src/cjs/interfaces/core.js.map +1 -1
  55. package/src/cjs/utils/algorithms/convexPolygonIncircle.d.ts +2 -1
  56. package/src/cjs/utils/algorithms/convexPolygonIncircle.js +14 -6
  57. package/src/cjs/utils/algorithms/convexPolygonIncircle.js.map +1 -1
  58. package/src/cjs/utils/createRandomizedPolygon.d.ts +14 -0
  59. package/src/cjs/utils/createRandomizedPolygon.js +32 -0
  60. package/src/cjs/utils/createRandomizedPolygon.js.map +1 -0
  61. package/src/cjs/utils/helpers/BezierPathInteractionHelper.d.ts +9 -7
  62. package/src/cjs/utils/helpers/BezierPathInteractionHelper.js +37 -23
  63. package/src/cjs/utils/helpers/BezierPathInteractionHelper.js.map +1 -1
  64. package/src/cjs/utils/helpers/CircleSectorHelper.d.ts +10 -1
  65. package/src/cjs/utils/helpers/CircleSectorHelper.js +19 -20
  66. package/src/cjs/utils/helpers/CircleSectorHelper.js.map +1 -1
  67. package/src/cjs/utils/helpers/VEllipseHelper.d.ts +30 -0
  68. package/src/cjs/utils/helpers/VEllipseHelper.js +86 -0
  69. package/src/cjs/utils/helpers/VEllipseHelper.js.map +1 -0
  70. package/src/cjs/utils/helpers/VEllipseSectorHelper.d.ts +42 -3
  71. package/src/cjs/utils/helpers/VEllipseSectorHelper.js +107 -25
  72. package/src/cjs/utils/helpers/VEllipseSectorHelper.js.map +1 -1
  73. package/src/createDemoDrawables.js +3 -1
  74. package/src/esm/BezierPath.d.ts +41 -5
  75. package/src/esm/BezierPath.js +50 -2
  76. package/src/esm/BezierPath.js.map +1 -1
  77. package/src/esm/Bounds.d.ts +67 -3
  78. package/src/esm/Bounds.js +101 -3
  79. package/src/esm/Bounds.js.map +1 -1
  80. package/src/esm/Circle.d.ts +46 -4
  81. package/src/esm/Circle.js +79 -3
  82. package/src/esm/Circle.js.map +1 -1
  83. package/src/esm/CircleSector.d.ts +51 -2
  84. package/src/esm/CircleSector.js +108 -3
  85. package/src/esm/CircleSector.js.map +1 -1
  86. package/src/esm/CubicBezierCurve.d.ts +113 -7
  87. package/src/esm/CubicBezierCurve.js +277 -33
  88. package/src/esm/CubicBezierCurve.js.map +1 -1
  89. package/src/esm/Line.d.ts +38 -3
  90. package/src/esm/Line.js +62 -1
  91. package/src/esm/Line.js.map +1 -1
  92. package/src/esm/PlotBoilerplate.js +2 -9
  93. package/src/esm/PlotBoilerplate.js.map +1 -1
  94. package/src/esm/Polygon.d.ts +48 -4
  95. package/src/esm/Polygon.js +89 -16
  96. package/src/esm/Polygon.js.map +1 -1
  97. package/src/esm/Triangle.d.ts +52 -3
  98. package/src/esm/Triangle.js +77 -1
  99. package/src/esm/Triangle.js.map +1 -1
  100. package/src/esm/VEllipse.d.ts +62 -3
  101. package/src/esm/VEllipse.js +178 -17
  102. package/src/esm/VEllipse.js.map +1 -1
  103. package/src/esm/VEllipseSector.d.ts +86 -2
  104. package/src/esm/VEllipseSector.js +146 -7
  105. package/src/esm/VEllipseSector.js.map +1 -1
  106. package/src/esm/Vector.d.ts +12 -2
  107. package/src/esm/Vector.js +15 -2
  108. package/src/esm/Vector.js.map +1 -1
  109. package/src/esm/VertTuple.d.ts +28 -4
  110. package/src/esm/VertTuple.js +36 -3
  111. package/src/esm/VertTuple.js.map +1 -1
  112. package/src/esm/Vertex.d.ts +17 -2
  113. package/src/esm/Vertex.js +18 -1
  114. package/src/esm/Vertex.js.map +1 -1
  115. package/src/esm/interfaces/core.d.ts +39 -0
  116. package/src/esm/interfaces/core.js +2 -0
  117. package/src/esm/interfaces/core.js.map +1 -1
  118. package/src/esm/utils/algorithms/convexPolygonIncircle.d.ts +2 -1
  119. package/src/esm/utils/algorithms/convexPolygonIncircle.js +15 -7
  120. package/src/esm/utils/algorithms/convexPolygonIncircle.js.map +1 -1
  121. package/src/esm/utils/algorithms/createRandomizedPolygon.d.ts +14 -0
  122. package/src/esm/utils/algorithms/createRandomizedPolygon.js +28 -0
  123. package/src/esm/utils/algorithms/createRandomizedPolygon.js.map +1 -0
  124. package/src/esm/utils/createRandomizedPolygon.d.ts +14 -0
  125. package/src/esm/utils/createRandomizedPolygon.js +28 -0
  126. package/src/esm/utils/createRandomizedPolygon.js.map +1 -0
  127. package/src/esm/utils/helpers/BezierPathInteractionHelper.d.ts +9 -7
  128. package/src/esm/utils/helpers/BezierPathInteractionHelper.js +35 -22
  129. package/src/esm/utils/helpers/BezierPathInteractionHelper.js.map +1 -1
  130. package/src/esm/utils/helpers/CircleSectorHelper.d.ts +10 -1
  131. package/src/esm/utils/helpers/CircleSectorHelper.js +19 -20
  132. package/src/esm/utils/helpers/CircleSectorHelper.js.map +1 -1
  133. package/src/esm/utils/helpers/VEllipseHelper.d.ts +30 -0
  134. package/src/esm/utils/helpers/VEllipseHelper.js +81 -0
  135. package/src/esm/utils/helpers/VEllipseHelper.js.map +1 -0
  136. package/src/esm/utils/helpers/VEllipseSectorHelper.d.ts +42 -3
  137. package/src/esm/utils/helpers/VEllipseSectorHelper.js +106 -24
  138. package/src/esm/utils/helpers/VEllipseSectorHelper.js.map +1 -1
  139. package/src/ts/BezierPath.ts +58 -5
  140. package/src/ts/Bounds.ts +110 -6
  141. package/src/ts/Circle.ts +87 -5
  142. package/src/ts/CircleSector.ts +115 -5
  143. package/src/ts/CubicBezierCurve.ts +332 -42
  144. package/src/ts/Line.ts +66 -3
  145. package/src/ts/PlotBoilerplate.ts +3 -9
  146. package/src/ts/Polygon.ts +103 -22
  147. package/src/ts/Triangle.ts +85 -3
  148. package/src/ts/VEllipse.ts +214 -19
  149. package/src/ts/VEllipseSector.ts +154 -8
  150. package/src/ts/Vector.ts +16 -2
  151. package/src/ts/VertTuple.ts +39 -4
  152. package/src/ts/Vertex.ts +20 -2
  153. package/src/ts/interfaces/core.ts +42 -0
  154. package/src/ts/utils/algorithms/convexPolygonIncircle.ts +82 -78
  155. package/src/ts/utils/createRandomizedPolygon.ts +31 -0
  156. package/src/ts/utils/helpers/BezierPathInteractionHelper.ts +45 -29
  157. package/src/ts/utils/helpers/CircleSectorHelper.ts +115 -125
  158. package/src/ts/utils/helpers/VEllipseHelper.ts +113 -0
  159. package/src/ts/utils/helpers/VEllipseSectorHelper.ts +142 -25
@@ -15,7 +15,11 @@
15
15
  * @modified 2021-03-19 Added the `VEllipse.rotate` function.
16
16
  * @modified 2022-02-02 Added the `destroy` method.
17
17
  * @modified 2022-02-02 Cleared the `VEllipse.toSVGString` function (deprecated). Use `drawutilssvg` instead.
18
- * @version 1.3.0
18
+ * @modified 2025-03-31 ATTENTION: modified the winding direction of the `tangentAt` method to match with the Circle method. This is a breaking change!
19
+ * @modified 2025-03-31 Adding the `VEllipse.move(amount: XYCoords)` method.
20
+ * @modified 2025-04-19 Adding the `VEllipse.getBounds()` method.
21
+ * @modified 2025-04-24 Adding the `VEllipse.getExtremePoints()` method for calculating minima and maxima.
22
+ * @version 1.4.0
19
23
  *
20
24
  * @file VEllipse
21
25
  * @fileoverview Ellipses with a center and an x- and a y-axis (stored as a vertex).
@@ -25,6 +29,8 @@ import { Vector } from "./Vector";
25
29
  import { Vertex } from "./Vertex";
26
30
  import { UIDGenerator } from "./UIDGenerator";
27
31
  import { CubicBezierCurve } from "./CubicBezierCurve";
32
+ import { Circle } from "./Circle";
33
+ import { Bounds } from "./Bounds";
28
34
  /**
29
35
  * @classdesc An ellipse class based on two vertices [centerX,centerY] and [radiusX,radiusY].
30
36
  *
@@ -106,11 +112,96 @@ export class VEllipse {
106
112
  * @return {number} The signed vertical radius of this ellipse.
107
113
  */
108
114
  signedRadiusV() {
109
- // return Math.abs(this.axis.y - this.center.y);
110
115
  // Rotate axis back to origin before calculating radius
111
- // return Math.abs(new Vertex(this.axis).rotate(-this.rotation,this.center).y - this.center.y);
112
116
  return new Vertex(this.axis).rotate(-this.rotation, this.center).y - this.center.y;
113
117
  }
118
+ /**
119
+ * Get the the minima and maxima (points) of this (rotated) ellipse.
120
+ *
121
+ * @method getExtremePoints
122
+ * @instance
123
+ * @memberof VEllipse
124
+ * @return {[Vertex, Vertex, Vertex, Vertex]} Get the the minima and maxima (points) of this (rotated) ellipse.
125
+ */
126
+ getExtremePoints() {
127
+ const a = this.radiusH();
128
+ const b = this.radiusV();
129
+ // Calculate t_x values
130
+ const t_x1 = Math.atan2(-b * Math.sin(this.rotation), a * Math.cos(this.rotation));
131
+ const t_x2 = t_x1 + Math.PI;
132
+ // Calculate x values at t_x
133
+ const x_x1 = this.center.x + a * Math.cos(t_x1) * Math.cos(this.rotation) - b * Math.sin(t_x1) * Math.sin(this.rotation);
134
+ const y_x1 = this.center.y + a * Math.cos(t_x1) * Math.sin(this.rotation) + b * Math.sin(t_x1) * Math.cos(this.rotation);
135
+ const x_x2 = this.center.x + a * Math.cos(t_x2) * Math.cos(this.rotation) - b * Math.sin(t_x2) * Math.sin(this.rotation);
136
+ const y_x2 = this.center.y + a * Math.cos(t_x2) * Math.sin(this.rotation) + b * Math.sin(t_x2) * Math.cos(this.rotation);
137
+ let x_max, x_min;
138
+ if (x_x1 > x_x2) {
139
+ x_max = new Vertex(x_x1, y_x1);
140
+ x_min = new Vertex(x_x2, y_x2);
141
+ }
142
+ else {
143
+ x_max = new Vertex(x_x2, y_x2);
144
+ x_min = new Vertex(x_x1, y_x1);
145
+ }
146
+ // Calculate t_y values
147
+ const t_y1 = Math.atan2(b * Math.cos(this.rotation), a * Math.sin(this.rotation));
148
+ const t_y2 = t_y1 + Math.PI;
149
+ // Calculate y values at t_y
150
+ const x_y1 = this.center.x + a * Math.cos(t_y1) * Math.cos(this.rotation) - b * Math.sin(t_y1) * Math.sin(this.rotation);
151
+ const y_y1 = this.center.y + a * Math.cos(t_y1) * Math.sin(this.rotation) + b * Math.sin(t_y1) * Math.cos(this.rotation);
152
+ const x_y2 = this.center.x + a * Math.cos(t_y2) * Math.cos(this.rotation) - b * Math.sin(t_y2) * Math.sin(this.rotation);
153
+ const y_y2 = this.center.y + a * Math.cos(t_y2) * Math.sin(this.rotation) + b * Math.sin(t_y2) * Math.cos(this.rotation);
154
+ let y_max, y_min;
155
+ if (y_y1 > y_y2) {
156
+ y_max = new Vertex(x_y1, y_y1);
157
+ y_min = new Vertex(x_y2, y_y2);
158
+ }
159
+ else {
160
+ y_max = new Vertex(x_y2, y_y2);
161
+ y_min = new Vertex(x_y1, y_y1);
162
+ }
163
+ return [x_max, x_min, y_max, y_min];
164
+ }
165
+ //--- BEGIN --- Implement interface `IBounded`
166
+ /**
167
+ * Get the bounds of this ellipse.
168
+ *
169
+ * The bounds are approximated by the underlying segment buffer; the more segment there are,
170
+ * the more accurate will be the returned bounds.
171
+ *
172
+ * @method getBounds
173
+ * @instance
174
+ * @memberof VEllipse
175
+ * @return {Bounds} The bounds of this ellipse.
176
+ **/
177
+ getBounds() {
178
+ // Thanks to Cuixiping
179
+ // https://stackoverflow.com/questions/87734/how-do-you-calculate-the-axis-aligned-bounding-box-of-an-ellipse
180
+ const r1 = this.radiusH();
181
+ const r2 = this.radiusV();
182
+ const ux = r1 * Math.cos(this.rotation);
183
+ const uy = r1 * Math.sin(this.rotation);
184
+ const vx = r2 * Math.cos(this.rotation + Math.PI / 2);
185
+ const vy = r2 * Math.sin(this.rotation + Math.PI / 2);
186
+ const bbox_halfwidth = Math.sqrt(ux * ux + vx * vx);
187
+ const bbox_halfheight = Math.sqrt(uy * uy + vy * vy);
188
+ return new Bounds({ x: this.center.x - bbox_halfwidth, y: this.center.y - bbox_halfheight }, { x: this.center.x + bbox_halfwidth, y: this.center.y + bbox_halfheight });
189
+ }
190
+ //--- BEGIN --- Implement interface `IBounded`
191
+ /**
192
+ * Move the ellipse by the given amount. This is equivalent by moving the `center` and `axis` points.
193
+ *
194
+ * @method move
195
+ * @param {XYCoords} amount - The amount to move.
196
+ * @instance
197
+ * @memberof VEllipse
198
+ * @return {VEllipse} this for chaining
199
+ **/
200
+ move(amount) {
201
+ this.center.add(amount);
202
+ this.axis.add(amount);
203
+ return this;
204
+ }
114
205
  /**
115
206
  * Scale this ellipse by the given factor from the center point. The factor will be applied to both radii.
116
207
  *
@@ -168,7 +259,7 @@ export class VEllipse {
168
259
  * @param {number=1.0} length - [optional, default=1] The length of the returned vector.
169
260
  */
170
261
  normalAt(angle, length) {
171
- const point = this.vertAt(angle);
262
+ const point = this.vertAt(angle - this.rotation); // HERE IS THE CORRECT BEHAVIOR!
172
263
  const foci = this.getFoci();
173
264
  // Calculate the angle between [point,focusA] and [point,focusB]
174
265
  const angleA = new Line(point, foci[0]).angle();
@@ -180,12 +271,13 @@ export class VEllipse {
180
271
  .addX(50)
181
272
  .clone()
182
273
  .rotate(Math.PI + centerAngle, point);
183
- if (this.center.distance(endPointA) < this.center.distance(endPointB)) {
184
- return new Vector(point, endPointB);
185
- }
186
- else {
187
- return new Vector(point, endPointA);
274
+ const resultVector = this.center.distance(endPointA) < this.center.distance(endPointB)
275
+ ? new Vector(point, endPointB)
276
+ : new Vector(point, endPointA);
277
+ if (typeof length === "number") {
278
+ resultVector.setLength(length);
188
279
  }
280
+ return resultVector;
189
281
  }
190
282
  /**
191
283
  * Get the tangent vector at the given angle.
@@ -204,9 +296,7 @@ export class VEllipse {
204
296
  */
205
297
  tangentAt(angle, length) {
206
298
  const normal = this.normalAt(angle, length);
207
- // Rotate the normal by 90 degrees, then it is the tangent.
208
- normal.b.rotate(Math.PI / 2, normal.a);
209
- return normal;
299
+ return normal.inv().perp();
210
300
  }
211
301
  /**
212
302
  * Get the perimeter of this ellipse.
@@ -257,6 +347,8 @@ export class VEllipse {
257
347
  /**
258
348
  * Get equally distributed points on the outline of this ellipse.
259
349
  *
350
+ * @method getEquidistantVertices
351
+ * @instance
260
352
  * @param {number} pointCount - The number of points.
261
353
  * @returns {Array<Vertex>}
262
354
  */
@@ -268,6 +360,75 @@ export class VEllipse {
268
360
  }
269
361
  return result;
270
362
  }
363
+ //--- BEGIN --- Implement interface `Intersectable`
364
+ /**
365
+ * Get the line intersections as vectors with this ellipse.
366
+ *
367
+ * @method lineIntersections
368
+ * @instance
369
+ * @param {VertTuple<Vector> ray - The line/ray to intersect this ellipse with.
370
+ * @param {boolean} inVectorBoundsOnly - (default=false) Set to true if only intersections within the vector bounds are of interest.
371
+ * @returns
372
+ */
373
+ lineIntersections(ray, inVectorBoundsOnly = false) {
374
+ // Question: what happens to extreme versions when ellipse is a line (width or height is zero)?
375
+ // This would result in a Division_by_Zero exception!
376
+ // Step A: create clones for operations (keep originals unchanged)
377
+ const ellipseCopy = this.clone(); // VEllipse
378
+ const rayCopy = ray.clone(); // Vector
379
+ // Step B: move both so ellipse's center is located at (0,0)
380
+ const moveAmount = ellipseCopy.center.clone().inv();
381
+ ellipseCopy.move(moveAmount);
382
+ rayCopy.add(moveAmount);
383
+ // Step C: rotate eclipse backwards it's rotation, so that rotation is zero (0.0).
384
+ // Rotate together with ray!
385
+ const rotationAmount = -ellipseCopy.rotation;
386
+ ellipseCopy.rotate(rotationAmount); // Rotation around (0,0) = center of translated ellipse
387
+ rayCopy.a.rotate(rotationAmount, ellipseCopy.center);
388
+ rayCopy.b.rotate(rotationAmount, ellipseCopy.center);
389
+ // Step D: find x/y factors to use for scaling to transform the ellipse to a circle.
390
+ // Scale together with vector ray.
391
+ const radiusH = ellipseCopy.radiusH();
392
+ const radiusV = ellipseCopy.radiusV();
393
+ const scalingFactors = radiusH > radiusV ? { x: radiusV / radiusH, y: 1.0 } : { x: 1.0, y: radiusH / radiusV };
394
+ // Step E: scale ellipse AND ray by calculated factors.
395
+ ellipseCopy.axis.scaleXY(scalingFactors);
396
+ rayCopy.a.scaleXY(scalingFactors);
397
+ rayCopy.b.scaleXY(scalingFactors);
398
+ // Intermediate result: now the ellipse is transformed to a circle and we can calculate intersections :)
399
+ // Step F: calculate circle+line intersecions
400
+ const tmpCircle = new Circle(new Vertex(), ellipseCopy.radiusH()); // radiusH() === radiusV()
401
+ const intersections = tmpCircle.lineIntersections(rayCopy, inVectorBoundsOnly);
402
+ // Step G: transform intersecions back to original configuration
403
+ intersections.forEach(function (intersectionPoint) {
404
+ // Reverse transformation from above.
405
+ intersectionPoint.scaleXY({ x: 1 / scalingFactors.x, y: 1 / scalingFactors.y }, ellipseCopy.center);
406
+ intersectionPoint.rotate(-rotationAmount, ellipseCopy.center);
407
+ intersectionPoint.sub(moveAmount);
408
+ });
409
+ return intersections;
410
+ }
411
+ /**
412
+ * Get all line intersections of this polygon and their tangents along the shape.
413
+ *
414
+ * This method returns all intersection tangents (as vectors) with this shape. The returned array of vectors is in no specific order.
415
+ *
416
+ * @param line
417
+ * @param lineIntersectionTangents
418
+ * @returns
419
+ */
420
+ lineIntersectionTangents(line, inVectorBoundsOnly = false) {
421
+ // Find the intersections of all lines plus their tangents inside the circle bounds
422
+ const interSectionPoints = this.lineIntersections(line, inVectorBoundsOnly);
423
+ return interSectionPoints.map((vert) => {
424
+ // Calculate angle
425
+ const lineFromCenter = new Line(this.center, vert);
426
+ const angle = lineFromCenter.angle();
427
+ // Calculate tangent at angle
428
+ return this.tangentAt(angle);
429
+ });
430
+ }
431
+ //--- END --- Implement interface `Intersectable`
271
432
  /**
272
433
  * Convert this ellipse into cubic Bézier curves.
273
434
  *
@@ -280,7 +441,7 @@ export class VEllipse {
280
441
  // Math by Luc Maisonobe
281
442
  // http://www.spaceroots.org/documents/ellipse/node22.html
282
443
  // Note that ellipses with radiusH=0 or radiusV=0 cannot be represented as Bézier curves.
283
- // Return a single line here (as a Bézier curve)
444
+ // Return a single line here (as a Bézier curve)?
284
445
  // if (Math.abs(this.radiusV()) < 0.00001) {
285
446
  // const radiusH = this.radiusH();
286
447
  // return [
@@ -310,10 +471,10 @@ export class VEllipse {
310
471
  const radiusV = this.radiusV();
311
472
  const curves = [];
312
473
  const angles = VEllipse.utils.equidistantVertAngles(radiusH, radiusV, segmentCount);
313
- let curAngle = angles[0];
474
+ let curAngle = angles[0] + this.rotation;
314
475
  let startPoint = this.vertAt(curAngle);
315
476
  for (var i = 0; i < angles.length; i++) {
316
- let nextAngle = angles[(i + 1) % angles.length];
477
+ let nextAngle = angles[(i + 1) % angles.length] + this.rotation;
317
478
  let endPoint = this.vertAt(nextAngle);
318
479
  if (Math.abs(radiusV) < 0.0001 || Math.abs(radiusH) < 0.0001) {
319
480
  // Distorted ellipses can only be approximated by linear Bézier segments
@@ -322,8 +483,8 @@ export class VEllipse {
322
483
  curves.push(curve);
323
484
  }
324
485
  else {
325
- let startTangent = this.tangentAt(curAngle);
326
- let endTangent = this.tangentAt(nextAngle);
486
+ let startTangent = this.tangentAt(curAngle + this.rotation);
487
+ let endTangent = this.tangentAt(nextAngle + this.rotation);
327
488
  // Find intersection (ignore that the result might be null in some extreme cases)
328
489
  let intersection = startTangent.intersection(endTangent);
329
490
  // What if intersection is undefined?
@@ -1 +1 @@
1
- {"version":3,"file":"VEllipse.js","sourceRoot":"","sources":["../ts/VEllipse.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"VEllipse.js","sourceRoot":"","sources":["../ts/VEllipse.ts"],"names":[],"mappings":"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"}
@@ -6,11 +6,22 @@
6
6
  * @date 2021-02-26
7
7
  * @modified 2022-02-02 Added the `destroy` method.
8
8
  * @modified 2022-11-01 Tweaked the `endpointToCenterParameters` function to handle negative values, too, without errors.
9
- * @version 1.1.1
9
+ * @modified 2025-04-01 Adapting a the `toCubicBezier` calculation to match an underlying change in the vertAt and tangentAt calculation of ellipses (was required to hamonize both methods with circles).
10
+ * @modified 2025-04-02 Adding `VEllipseSector.containsAngle` method.
11
+ * @modified 2025-04-02 Adding `VEllipseSector.lineIntersections` and `VEllipseSector.lineIntersectionTangents` and implementing `Intersectable`.
12
+ * @modified 2025-04-07 Adding value wrapping (0 to TWO_PI) to the `VEllipseSector.containsAngle` method.
13
+ * @modified 2025-04-09 Adding the `VEllipseSector.move` method.
14
+ * @modified 2025-04-19 Added the `VEllipseSector.getStartPoint` and `getEndPoint` methods.
15
+ * @modified 2025-04-23 Added the `VEllipseSector.getBounds` method.
16
+ * @version 1.2.0
10
17
  */
18
+ import { Bounds } from "./Bounds";
11
19
  import { CubicBezierCurve } from "./CubicBezierCurve";
12
- import { SVGPathParams, UID } from "./interfaces";
20
+ import { SVGPathParams, UID, XYCoords } from "./interfaces";
21
+ import { Vector } from "./Vector";
13
22
  import { VEllipse } from "./VEllipse";
23
+ import { Vertex } from "./Vertex";
24
+ import { VertTuple } from "./VertTuple";
14
25
  /**
15
26
  * @classdesc A class for elliptic sectors.
16
27
  *
@@ -74,6 +85,79 @@ export declare class VEllipseSector {
74
85
  * @param {numner} endAngle - The end angle of the sector.
75
86
  */
76
87
  constructor(ellipse: VEllipse, startAngle: number, endAngle: number);
88
+ /**
89
+ * Move the ellipse sector by the given amount.
90
+ *
91
+ * @method move
92
+ * @param {XYCoords} amount - The amount to move.
93
+ * @instance
94
+ * @memberof VEllipseSector
95
+ * @return {VEllipseSector} this for chaining
96
+ **/
97
+ move(amount: XYCoords): VEllipseSector;
98
+ /**
99
+ * Checks wether the given angle (must be inside 0 and PI*2) is contained inside this sector.
100
+ *
101
+ * @param {number} angle - The numeric angle to check.
102
+ * @method containsAngle
103
+ * @instance
104
+ * @memberof VEllipseSectpr
105
+ * @return {boolean} True if (and only if) this sector contains the given angle.
106
+ */
107
+ containsAngle(angle: number): boolean;
108
+ /**
109
+ * Get the sectors starting point (on the underlying ellipse, located at the start angle).
110
+ *
111
+ * @method getStartPoint
112
+ * @instance
113
+ * @memberof VEllipseSector
114
+ * @return {Vertex} The sector's stating point.
115
+ */
116
+ getStartPoint(): Vertex;
117
+ /**
118
+ * Get the sectors ending point (on the underlying ellipse, located at the end angle).
119
+ *
120
+ * @method getEndPoint
121
+ * @instance
122
+ * @memberof VEllipseSector
123
+ * @return {Vertex} The sector's ending point.
124
+ */
125
+ getEndPoint(): Vertex;
126
+ /**
127
+ * Get the bounds of this elliptic sector.
128
+ *
129
+ * The bounds are approximated by the underlying segment buffer; the more segment there are,
130
+ * the more accurate will be the returned bounds.
131
+ *
132
+ * @method getBounds
133
+ * @instance
134
+ * @memberof VEllipse
135
+ * @return {Bounds} The bounds of this elliptic sector.
136
+ **/
137
+ getBounds(): Bounds;
138
+ /**
139
+ * Get the line intersections as vectors with this ellipse.
140
+ *
141
+ * @method lineIntersections
142
+ * @instance
143
+ * @memberof VEllipseSectpr
144
+ * @param {VertTuple<Vector>} ray - The line/ray to intersect this ellipse with.
145
+ * @param {boolean} inVectorBoundsOnly - (default=false) Set to true if only intersections within the vector bounds are of interest.
146
+ * @returns
147
+ */
148
+ lineIntersections(ray: VertTuple<Vector>, inVectorBoundsOnly?: boolean): Array<Vertex>;
149
+ /**
150
+ * Get all line intersections of this polygon and their tangents along the shape.
151
+ *
152
+ * This method returns all intersection tangents (as vectors) with this shape. The returned array of vectors is in no specific order.
153
+ *
154
+ * @method lineIntersections
155
+ * @memberof VEllipseSectpr
156
+ * @param line
157
+ * @param lineIntersectionTangents
158
+ * @returns
159
+ */
160
+ lineIntersectionTangents(line: VertTuple<any>, inVectorBoundsOnly?: boolean): Array<Vector>;
77
161
  /**
78
162
  * Convert this elliptic sector into cubic Bézier curves.
79
163
  *
@@ -6,8 +6,16 @@
6
6
  * @date 2021-02-26
7
7
  * @modified 2022-02-02 Added the `destroy` method.
8
8
  * @modified 2022-11-01 Tweaked the `endpointToCenterParameters` function to handle negative values, too, without errors.
9
- * @version 1.1.1
9
+ * @modified 2025-04-01 Adapting a the `toCubicBezier` calculation to match an underlying change in the vertAt and tangentAt calculation of ellipses (was required to hamonize both methods with circles).
10
+ * @modified 2025-04-02 Adding `VEllipseSector.containsAngle` method.
11
+ * @modified 2025-04-02 Adding `VEllipseSector.lineIntersections` and `VEllipseSector.lineIntersectionTangents` and implementing `Intersectable`.
12
+ * @modified 2025-04-07 Adding value wrapping (0 to TWO_PI) to the `VEllipseSector.containsAngle` method.
13
+ * @modified 2025-04-09 Adding the `VEllipseSector.move` method.
14
+ * @modified 2025-04-19 Added the `VEllipseSector.getStartPoint` and `getEndPoint` methods.
15
+ * @modified 2025-04-23 Added the `VEllipseSector.getBounds` method.
16
+ * @version 1.2.0
10
17
  */
18
+ import { Bounds } from "./Bounds";
11
19
  import { CubicBezierCurve } from "./CubicBezierCurve";
12
20
  import { geomutils } from "./geomutils";
13
21
  import { Line } from "./Line";
@@ -48,6 +56,137 @@ export class VEllipseSector {
48
56
  this.startAngle = geomutils.wrapMinMax(startAngle, 0, Math.PI * 2);
49
57
  this.endAngle = geomutils.wrapMinMax(endAngle, 0, Math.PI * 2);
50
58
  }
59
+ /**
60
+ * Move the ellipse sector by the given amount.
61
+ *
62
+ * @method move
63
+ * @param {XYCoords} amount - The amount to move.
64
+ * @instance
65
+ * @memberof VEllipseSector
66
+ * @return {VEllipseSector} this for chaining
67
+ **/
68
+ move(amount) {
69
+ this.ellipse.move(amount);
70
+ return this;
71
+ }
72
+ /**
73
+ * Checks wether the given angle (must be inside 0 and PI*2) is contained inside this sector.
74
+ *
75
+ * @param {number} angle - The numeric angle to check.
76
+ * @method containsAngle
77
+ * @instance
78
+ * @memberof VEllipseSectpr
79
+ * @return {boolean} True if (and only if) this sector contains the given angle.
80
+ */
81
+ containsAngle(angle) {
82
+ angle = geomutils.mapAngleTo2PI(angle); // wrapMinMax(angle, 0, Math.PI * 2);
83
+ const sAngle = geomutils.mapAngleTo2PI(this.startAngle);
84
+ const eAngle = geomutils.mapAngleTo2PI(this.endAngle);
85
+ // TODO: cleanup
86
+ // if (this.startAngle <= this.endAngle) {
87
+ // return angle >= this.startAngle && angle < this.endAngle;
88
+ // } else {
89
+ // // startAngle > endAngle
90
+ // return angle >= this.startAngle || angle < this.endAngle;
91
+ // }
92
+ if (sAngle <= eAngle) {
93
+ return angle >= sAngle && angle < eAngle;
94
+ }
95
+ else {
96
+ // startAngle > endAngle
97
+ return angle >= sAngle || angle < eAngle;
98
+ }
99
+ }
100
+ /**
101
+ * Get the sectors starting point (on the underlying ellipse, located at the start angle).
102
+ *
103
+ * @method getStartPoint
104
+ * @instance
105
+ * @memberof VEllipseSector
106
+ * @return {Vertex} The sector's stating point.
107
+ */
108
+ getStartPoint() {
109
+ return this.ellipse.vertAt(this.startAngle);
110
+ }
111
+ /**
112
+ * Get the sectors ending point (on the underlying ellipse, located at the end angle).
113
+ *
114
+ * @method getEndPoint
115
+ * @instance
116
+ * @memberof VEllipseSector
117
+ * @return {Vertex} The sector's ending point.
118
+ */
119
+ getEndPoint() {
120
+ return this.ellipse.vertAt(this.endAngle);
121
+ }
122
+ //--- BEGIN --- Implement interface `IBounded`
123
+ /**
124
+ * Get the bounds of this elliptic sector.
125
+ *
126
+ * The bounds are approximated by the underlying segment buffer; the more segment there are,
127
+ * the more accurate will be the returned bounds.
128
+ *
129
+ * @method getBounds
130
+ * @instance
131
+ * @memberof VEllipse
132
+ * @return {Bounds} The bounds of this elliptic sector.
133
+ **/
134
+ getBounds() {
135
+ // Calculage angles from east, west, north and south box points and check if they are inside
136
+ const extremes = this.ellipse.getExtremePoints();
137
+ const candidates = extremes.filter(point => {
138
+ const angle = new Line(this.ellipse.center, point).angle() - this.ellipse.rotation;
139
+ return this.containsAngle(angle);
140
+ });
141
+ return Bounds.computeFromVertices([this.getStartPoint(), this.getEndPoint()].concat(candidates));
142
+ }
143
+ //--- BEGIN --- Implement interface `Intersectable`
144
+ /**
145
+ * Get the line intersections as vectors with this ellipse.
146
+ *
147
+ * @method lineIntersections
148
+ * @instance
149
+ * @memberof VEllipseSectpr
150
+ * @param {VertTuple<Vector>} ray - The line/ray to intersect this ellipse with.
151
+ * @param {boolean} inVectorBoundsOnly - (default=false) Set to true if only intersections within the vector bounds are of interest.
152
+ * @returns
153
+ */
154
+ lineIntersections(ray, inVectorBoundsOnly = false) {
155
+ // First get all line intersections from underlying ellipse.
156
+ const ellipseIntersections = this.ellipse.lineIntersections(ray, inVectorBoundsOnly);
157
+ // Drop all intersection points that are not contained in the circle sectors bounds.
158
+ const tmpLine = new Line(this.ellipse.center, new Vertex());
159
+ return ellipseIntersections.filter((intersectionPoint) => {
160
+ tmpLine.b.set(intersectionPoint);
161
+ const lineAngle = tmpLine.angle();
162
+ return this.containsAngle(lineAngle - this.ellipse.rotation);
163
+ });
164
+ }
165
+ /**
166
+ * Get all line intersections of this polygon and their tangents along the shape.
167
+ *
168
+ * This method returns all intersection tangents (as vectors) with this shape. The returned array of vectors is in no specific order.
169
+ *
170
+ * @method lineIntersections
171
+ * @memberof VEllipseSectpr
172
+ * @param line
173
+ * @param lineIntersectionTangents
174
+ * @returns
175
+ */
176
+ lineIntersectionTangents(line, inVectorBoundsOnly = false) {
177
+ // Find the intersections of all lines plus their tangents inside the circle bounds
178
+ const interSectionPoints = this.lineIntersections(line, inVectorBoundsOnly);
179
+ return interSectionPoints.map((vert) => {
180
+ // Calculate angle
181
+ const lineFromCenter = new Line(this.ellipse.center, vert);
182
+ const angle = lineFromCenter.angle();
183
+ // console.log("angle", (angle / Math.PI) * 180.0);
184
+ // const angle = Math.random() * Math.PI * 2; // TODO
185
+ // Calculate tangent at angle
186
+ return this.ellipse.tangentAt(angle);
187
+ });
188
+ }
189
+ //--- END --- Implement interface `Intersectable`
51
190
  /**
52
191
  * Convert this elliptic sector into cubic Bézier curves.
53
192
  *
@@ -75,8 +214,8 @@ export class VEllipseSector {
75
214
  for (var i = 0; i + 1 < angles.length; i++) {
76
215
  let nextAngle = angles[(i + 1) % angles.length];
77
216
  let endPoint = this.ellipse.vertAt(nextAngle);
78
- let startTangent = this.ellipse.tangentAt(curAngle);
79
- let endTangent = this.ellipse.tangentAt(nextAngle);
217
+ let startTangent = this.ellipse.tangentAt(curAngle + this.ellipse.rotation);
218
+ let endTangent = this.ellipse.tangentAt(nextAngle + this.ellipse.rotation);
80
219
  // Distorted ellipses can only be approximated by linear Bézier segments
81
220
  if (Math.abs(radiusV) < 0.0001 || Math.abs(radiusH) < 0.0001) {
82
221
  let diff = startPoint.difference(endPoint);
@@ -180,20 +319,20 @@ VEllipseSector.ellipseSectorUtils = {
180
319
  equidistantVertAngles: (radiusH, radiusV, startAngle, endAngle, fullEllipsePointCount) => {
181
320
  var ellipseAngles = VEllipse.utils.equidistantVertAngles(radiusH, radiusV, fullEllipsePointCount);
182
321
  ellipseAngles = ellipseAngles.map((angle) => VEllipseSector.ellipseSectorUtils.normalizeAngle(angle));
183
- var angleIsInRange = (angle) => {
322
+ const angleIsInRange = (angle) => {
184
323
  if (startAngle < endAngle)
185
324
  return angle >= startAngle && angle <= endAngle;
186
325
  else
187
326
  return angle >= startAngle || (angle <= endAngle && angle >= 0);
188
327
  };
189
328
  // Drop all angles outside the sector
190
- var ellipseAngles = ellipseAngles.filter(angleIsInRange);
329
+ ellipseAngles = ellipseAngles.filter(angleIsInRange);
191
330
  // Now we need to sort the angles to the first one in the array is the closest to startAngle.
192
331
  // --> find the angle that is closest to the start angle
193
- var startIndex = VEllipseSector.ellipseSectorUtils.findClosestToStartAngle(startAngle, endAngle, ellipseAngles);
332
+ const startIndex = VEllipseSector.ellipseSectorUtils.findClosestToStartAngle(startAngle, endAngle, ellipseAngles);
194
333
  // Bring all angles into the correct order
195
334
  // Idea: use splice or slice here?
196
- var angles = [];
335
+ const angles = [];
197
336
  for (var i = 0; i < ellipseAngles.length; i++) {
198
337
  angles.push(ellipseAngles[(startIndex + i) % ellipseAngles.length]);
199
338
  }