plotboilerplate 1.23.3 → 1.25.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 (230) hide show
  1. package/README.md +19 -1
  2. package/dist/index.esm.js +1684 -394
  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 +12450 -11120
  9. package/dist/plotboilerplate.min.js +1 -1
  10. package/package.json +9 -5
  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.d.ts +37 -6
  30. package/src/cjs/PlotBoilerplate.js +224 -125
  31. package/src/cjs/PlotBoilerplate.js.map +1 -1
  32. package/src/cjs/Polygon.d.ts +68 -5
  33. package/src/cjs/Polygon.js +143 -22
  34. package/src/cjs/Polygon.js.map +1 -1
  35. package/src/cjs/Triangle.d.ts +52 -3
  36. package/src/cjs/Triangle.js +80 -1
  37. package/src/cjs/Triangle.js.map +1 -1
  38. package/src/cjs/VEllipse.d.ts +62 -3
  39. package/src/cjs/VEllipse.js +181 -17
  40. package/src/cjs/VEllipse.js.map +1 -1
  41. package/src/cjs/VEllipseSector.d.ts +86 -2
  42. package/src/cjs/VEllipseSector.js +148 -4
  43. package/src/cjs/VEllipseSector.js.map +1 -1
  44. package/src/cjs/Vector.d.ts +12 -2
  45. package/src/cjs/Vector.js +15 -2
  46. package/src/cjs/Vector.js.map +1 -1
  47. package/src/cjs/VertTuple.d.ts +28 -4
  48. package/src/cjs/VertTuple.js +36 -3
  49. package/src/cjs/VertTuple.js.map +1 -1
  50. package/src/cjs/Vertex.d.ts +31 -4
  51. package/src/cjs/Vertex.js +35 -1
  52. package/src/cjs/Vertex.js.map +1 -1
  53. package/src/cjs/interfaces/core.d.ts +67 -0
  54. package/src/cjs/interfaces/core.js +4 -0
  55. package/src/cjs/interfaces/core.js.map +1 -1
  56. package/src/cjs/utils/algorithms/convexPolygonIncircle.d.ts +2 -1
  57. package/src/cjs/utils/algorithms/convexPolygonIncircle.js +14 -6
  58. package/src/cjs/utils/algorithms/convexPolygonIncircle.js.map +1 -1
  59. package/src/cjs/utils/createRandomizedPolygon.d.ts +14 -0
  60. package/src/cjs/utils/createRandomizedPolygon.js +32 -0
  61. package/src/cjs/utils/createRandomizedPolygon.js.map +1 -0
  62. package/src/cjs/utils/datastructures/Color.d.ts +147 -1
  63. package/src/cjs/utils/datastructures/Color.js +385 -41
  64. package/src/cjs/utils/datastructures/Color.js.map +1 -1
  65. package/src/cjs/utils/datastructures/ColorGradient.d.ts +79 -0
  66. package/src/cjs/utils/datastructures/ColorGradient.js +171 -0
  67. package/src/cjs/utils/datastructures/ColorGradient.js.map +1 -0
  68. package/src/cjs/utils/dom/components/ColorGradientPicker.d.ts +245 -0
  69. package/src/cjs/utils/dom/components/ColorGradientPicker.js +667 -0
  70. package/src/cjs/utils/dom/components/ColorGradientPicker.js.map +1 -0
  71. package/src/cjs/utils/dom/components/ColorGradientPickerJSX.d.ts +129 -0
  72. package/src/cjs/utils/dom/components/ColorGradientPickerJSX.js +520 -0
  73. package/src/cjs/utils/dom/components/ColorGradientPickerJSX.js.map +1 -0
  74. package/src/cjs/utils/dom/components/ColorGradientSelector.d.ts +117 -0
  75. package/src/cjs/utils/dom/components/ColorGradientSelector.js +325 -0
  76. package/src/cjs/utils/dom/components/ColorGradientSelector.js.map +1 -0
  77. package/src/cjs/utils/dom/components/Test.d.ts +7 -0
  78. package/src/cjs/utils/dom/components/Test.js +30 -0
  79. package/src/cjs/utils/dom/components/Test.js.map +1 -0
  80. package/src/cjs/utils/dom/guiSizeToggler.js +1 -1
  81. package/src/cjs/utils/dom/guiSizeToggler.js.map +1 -1
  82. package/src/cjs/utils/helpers/BezierPathInteractionHelper.d.ts +16 -8
  83. package/src/cjs/utils/helpers/BezierPathInteractionHelper.js +49 -28
  84. package/src/cjs/utils/helpers/BezierPathInteractionHelper.js.map +1 -1
  85. package/src/cjs/utils/helpers/CircleHelper.d.ts +10 -1
  86. package/src/cjs/utils/helpers/CircleHelper.js +13 -2
  87. package/src/cjs/utils/helpers/CircleHelper.js.map +1 -1
  88. package/src/cjs/utils/helpers/CircleSectorHelper.d.ts +11 -2
  89. package/src/cjs/utils/helpers/CircleSectorHelper.js +20 -20
  90. package/src/cjs/utils/helpers/CircleSectorHelper.js.map +1 -1
  91. package/src/cjs/utils/helpers/TriangleHelper.d.ts +57 -0
  92. package/src/cjs/utils/helpers/TriangleHelper.js +83 -0
  93. package/src/cjs/utils/helpers/TriangleHelper.js.map +1 -0
  94. package/src/cjs/utils/helpers/VEllipseHelper.d.ts +32 -0
  95. package/src/cjs/utils/helpers/VEllipseHelper.js +88 -0
  96. package/src/cjs/utils/helpers/VEllipseHelper.js.map +1 -0
  97. package/src/cjs/utils/helpers/VEllipseSectorHelper.d.ts +44 -4
  98. package/src/cjs/utils/helpers/VEllipseSectorHelper.js +108 -25
  99. package/src/cjs/utils/helpers/VEllipseSectorHelper.js.map +1 -1
  100. package/src/cjs/utils/parsers/LinearColorGradientParser.d.ts +78 -0
  101. package/src/cjs/utils/parsers/LinearColorGradientParser.js +224 -0
  102. package/src/cjs/utils/parsers/LinearColorGradientParser.js.map +1 -0
  103. package/src/createDemoDrawables.js +4 -1
  104. package/src/esm/BezierPath.d.ts +41 -5
  105. package/src/esm/BezierPath.js +50 -2
  106. package/src/esm/BezierPath.js.map +1 -1
  107. package/src/esm/Bounds.d.ts +67 -3
  108. package/src/esm/Bounds.js +101 -3
  109. package/src/esm/Bounds.js.map +1 -1
  110. package/src/esm/Circle.d.ts +46 -4
  111. package/src/esm/Circle.js +79 -3
  112. package/src/esm/Circle.js.map +1 -1
  113. package/src/esm/CircleSector.d.ts +51 -2
  114. package/src/esm/CircleSector.js +108 -3
  115. package/src/esm/CircleSector.js.map +1 -1
  116. package/src/esm/CubicBezierCurve.d.ts +113 -7
  117. package/src/esm/CubicBezierCurve.js +277 -33
  118. package/src/esm/CubicBezierCurve.js.map +1 -1
  119. package/src/esm/Line.d.ts +38 -3
  120. package/src/esm/Line.js +62 -1
  121. package/src/esm/Line.js.map +1 -1
  122. package/src/esm/PlotBoilerplate.d.ts +37 -6
  123. package/src/esm/PlotBoilerplate.js +224 -125
  124. package/src/esm/PlotBoilerplate.js.map +1 -1
  125. package/src/esm/Polygon.d.ts +68 -5
  126. package/src/esm/Polygon.js +138 -22
  127. package/src/esm/Polygon.js.map +1 -1
  128. package/src/esm/Triangle.d.ts +52 -3
  129. package/src/esm/Triangle.js +77 -1
  130. package/src/esm/Triangle.js.map +1 -1
  131. package/src/esm/VEllipse.d.ts +62 -3
  132. package/src/esm/VEllipse.js +178 -17
  133. package/src/esm/VEllipse.js.map +1 -1
  134. package/src/esm/VEllipseSector.d.ts +86 -2
  135. package/src/esm/VEllipseSector.js +146 -7
  136. package/src/esm/VEllipseSector.js.map +1 -1
  137. package/src/esm/Vector.d.ts +12 -2
  138. package/src/esm/Vector.js +15 -2
  139. package/src/esm/Vector.js.map +1 -1
  140. package/src/esm/VertTuple.d.ts +28 -4
  141. package/src/esm/VertTuple.js +36 -3
  142. package/src/esm/VertTuple.js.map +1 -1
  143. package/src/esm/Vertex.d.ts +31 -4
  144. package/src/esm/Vertex.js +35 -1
  145. package/src/esm/Vertex.js.map +1 -1
  146. package/src/esm/interfaces/core.d.ts +67 -0
  147. package/src/esm/interfaces/core.js +4 -0
  148. package/src/esm/interfaces/core.js.map +1 -1
  149. package/src/esm/utils/algorithms/convexPolygonIncircle.d.ts +2 -1
  150. package/src/esm/utils/algorithms/convexPolygonIncircle.js +15 -7
  151. package/src/esm/utils/algorithms/convexPolygonIncircle.js.map +1 -1
  152. package/src/esm/utils/algorithms/createRandomizedPolygon.d.ts +14 -0
  153. package/src/esm/utils/algorithms/createRandomizedPolygon.js +28 -0
  154. package/src/esm/utils/algorithms/createRandomizedPolygon.js.map +1 -0
  155. package/src/esm/utils/createRandomizedPolygon.d.ts +14 -0
  156. package/src/esm/utils/createRandomizedPolygon.js +28 -0
  157. package/src/esm/utils/createRandomizedPolygon.js.map +1 -0
  158. package/src/esm/utils/datastructures/Color.d.ts +147 -1
  159. package/src/esm/utils/datastructures/Color.js +386 -42
  160. package/src/esm/utils/datastructures/Color.js.map +1 -1
  161. package/src/esm/utils/datastructures/ColorGradient.d.ts +79 -0
  162. package/src/esm/utils/datastructures/ColorGradient.js +166 -0
  163. package/src/esm/utils/datastructures/ColorGradient.js.map +1 -0
  164. package/src/esm/utils/dom/components/ColorGradientPicker.d.ts +245 -0
  165. package/src/esm/utils/dom/components/ColorGradientPicker.js +732 -0
  166. package/src/esm/utils/dom/components/ColorGradientPicker.js.map +1 -0
  167. package/src/esm/utils/dom/components/ColorGradientPickerJSX.d.ts +129 -0
  168. package/src/esm/utils/dom/components/ColorGradientPickerJSX.js +582 -0
  169. package/src/esm/utils/dom/components/ColorGradientPickerJSX.js.map +1 -0
  170. package/src/esm/utils/dom/components/ColorGradientSelector.d.ts +117 -0
  171. package/src/esm/utils/dom/components/ColorGradientSelector.js +332 -0
  172. package/src/esm/utils/dom/components/ColorGradientSelector.js.map +1 -0
  173. package/src/esm/utils/dom/components/Test.d.ts +7 -0
  174. package/src/esm/utils/dom/components/Test.js +26 -0
  175. package/src/esm/utils/dom/components/Test.js.map +1 -0
  176. package/src/esm/utils/dom/guiSizeToggler.js +1 -1
  177. package/src/esm/utils/dom/guiSizeToggler.js.map +1 -1
  178. package/src/esm/utils/helpers/BezierPathInteractionHelper.d.ts +16 -8
  179. package/src/esm/utils/helpers/BezierPathInteractionHelper.js +47 -27
  180. package/src/esm/utils/helpers/BezierPathInteractionHelper.js.map +1 -1
  181. package/src/esm/utils/helpers/CircleHelper.d.ts +10 -1
  182. package/src/esm/utils/helpers/CircleHelper.js +13 -2
  183. package/src/esm/utils/helpers/CircleHelper.js.map +1 -1
  184. package/src/esm/utils/helpers/CircleSectorHelper.d.ts +11 -2
  185. package/src/esm/utils/helpers/CircleSectorHelper.js +20 -20
  186. package/src/esm/utils/helpers/CircleSectorHelper.js.map +1 -1
  187. package/src/esm/utils/helpers/TriangleHelper.d.ts +57 -0
  188. package/src/esm/utils/helpers/TriangleHelper.js +78 -0
  189. package/src/esm/utils/helpers/TriangleHelper.js.map +1 -0
  190. package/src/esm/utils/helpers/VEllipseHelper.d.ts +32 -0
  191. package/src/esm/utils/helpers/VEllipseHelper.js +83 -0
  192. package/src/esm/utils/helpers/VEllipseHelper.js.map +1 -0
  193. package/src/esm/utils/helpers/VEllipseSectorHelper.d.ts +44 -4
  194. package/src/esm/utils/helpers/VEllipseSectorHelper.js +107 -24
  195. package/src/esm/utils/helpers/VEllipseSectorHelper.js.map +1 -1
  196. package/src/esm/utils/parsers/LinearColorGradientParser.d.ts +78 -0
  197. package/src/esm/utils/parsers/LinearColorGradientParser.js +217 -0
  198. package/src/esm/utils/parsers/LinearColorGradientParser.js.map +1 -0
  199. package/src/external.d.ts +9 -0
  200. package/src/ts/BezierPath.ts +58 -5
  201. package/src/ts/Bounds.ts +110 -6
  202. package/src/ts/Circle.ts +87 -5
  203. package/src/ts/CircleSector.ts +115 -5
  204. package/src/ts/CubicBezierCurve.ts +332 -42
  205. package/src/ts/Line.ts +66 -3
  206. package/src/ts/PlotBoilerplate.ts +236 -114
  207. package/src/ts/Polygon.ts +164 -29
  208. package/src/ts/Triangle.ts +85 -3
  209. package/src/ts/VEllipse.ts +214 -19
  210. package/src/ts/VEllipseSector.ts +154 -8
  211. package/src/ts/Vector.ts +16 -2
  212. package/src/ts/VertTuple.ts +39 -4
  213. package/src/ts/Vertex.ts +40 -4
  214. package/src/ts/interfaces/core.ts +73 -0
  215. package/src/ts/utils/algorithms/convexPolygonIncircle.ts +82 -78
  216. package/src/ts/utils/createRandomizedPolygon.ts +31 -0
  217. package/src/ts/utils/datastructures/Color.ts +423 -44
  218. package/src/ts/utils/datastructures/ColorGradient.ts +196 -0
  219. package/src/ts/utils/dom/components/ColorGradientPicker.tsx +877 -0
  220. package/src/ts/utils/dom/components/ColorGradientSelector.tsx +445 -0
  221. package/src/ts/utils/dom/components/Test.tsx +44 -0
  222. package/src/ts/utils/dom/components/_ColorGradientPicker_raw.ts_ +392 -0
  223. package/src/ts/utils/dom/guiSizeToggler.ts +1 -1
  224. package/src/ts/utils/helpers/BezierPathInteractionHelper.ts +61 -35
  225. package/src/ts/utils/helpers/CircleHelper.ts +17 -3
  226. package/src/ts/utils/helpers/CircleSectorHelper.ts +118 -126
  227. package/src/ts/utils/helpers/TriangleHelper.ts +102 -0
  228. package/src/ts/utils/helpers/VEllipseHelper.ts +115 -0
  229. package/src/ts/utils/helpers/VEllipseSectorHelper.ts +144 -26
  230. package/src/ts/utils/parsers/LinearColorGradientParser.ts +297 -0
@@ -4,7 +4,6 @@
4
4
  * @version 1.0.0
5
5
  */
6
6
 
7
-
8
7
  /**
9
8
  * Easily handle circle sectors (mouse or touch) with this circle sector helper.
10
9
  *
@@ -15,138 +14,131 @@
15
14
  * @date 2021-01-22
16
15
  * @modified 2021-01-26 Moving control points with center points
17
16
  * @modified 2024-03-10 Adding the `destory` method for properly removing installed listeners.
18
- * @version 1.1.0
17
+ * @modified 2025-04-02 Adding `CircleSectorHelper.drawHandleLines()`,
18
+ * @version 1.2.0
19
19
  **/
20
20
 
21
21
  import { CircleSector } from "../../CircleSector";
22
22
  import { PlotBoilerplate } from "../../PlotBoilerplate";
23
23
  import { VertEvent, VertListener } from "../../VertexListeners";
24
24
  import { Vertex } from "../../Vertex";
25
-
25
+ import { DrawLib, IShapeInteractionHelper } from "../../interfaces";
26
26
 
27
27
  /**
28
28
  * @classdesc A helper for handling circles with an additional radius-control-point.
29
29
  */
30
- export class CircleSectorHelper {
31
-
32
- private circleSector: CircleSector;
33
- private controlPointStart: Vertex;
34
- private controlPointEnd: Vertex;
35
-
36
- private centerListener: VertListener;
37
- private radiusStartListener : VertListener;
38
- private radiusEndListener : VertListener;
39
-
40
- /**
41
- * The constructor.
42
- *
43
- * @constructor
44
- * @name CircleSectorHelper
45
- * @param {CircleSector} circleSector - The circle sector to handle.
46
- * @param {Vertex} controlPointStart - A point to define the radius and start angle (distance and angle from center).
47
- * @param {Vertex} controlPointEnd - A point to define the radius and end angle (distance and angle from center).
48
- * @param {PlotBoilerplate} pb - The PlotBoilerplate which contains the circle sector and both points.
49
- **/
50
- constructor( circleSector:CircleSector,
51
- controlPointStart:Vertex,
52
- controlPointEnd:Vertex,
53
- pb:PlotBoilerplate
54
- ) {
55
-
56
- this.circleSector = circleSector;
57
- this.controlPointStart = controlPointStart;
58
- this.controlPointEnd = controlPointEnd;
59
-
60
- this.circleSector.circle.center.listeners.addDragListener( this.centerListener = this._handleDragCenter() );
61
- this.controlPointStart.listeners.addDragListener( this.radiusStartListener = this._handleDragStartControlPoint() );
62
- this.controlPointEnd.listeners.addDragListener( this.radiusEndListener = this._handleDragEndControlPoint() );
63
- // circleSector.circle.center.listeners.addDragListener( (e:VertEvent) => {
64
- // controlPointStart.add( e.params.dragAmount );
65
- // controlPointEnd.add( e.params.dragAmount );
66
- // } );
67
-
68
- // controlPointStart.listeners.addDragListener( (e:VertEvent) => {
69
- // circleSector.circle.radius = circleSector.circle.center.distance(controlPointStart);
70
- // controlPointEnd.set( circleSector.circle.vertAt(circleSector.endAngle) );
71
- // circleSector.startAngle = circleSector.circle.center.angle( controlPointStart );
72
- // } );
73
-
74
- // controlPointEnd.listeners.addDragListener( (e:VertEvent) => {
75
- // circleSector.circle.radius = circleSector.circle.center.distance(controlPointEnd);
76
- // controlPointStart.set( circleSector.circle.vertAt(circleSector.startAngle) );
77
- // circleSector.endAngle = circleSector.circle.center.angle( controlPointEnd );
78
- // } );
79
-
80
- }
81
-
82
- /**
83
- * Creates a new drag handler for the circle sector's center point.
84
- *
85
- * @private
86
- * @method handleDragCenter
87
- * @instance
88
- * @memberof CircleSectorHelper
89
- * @returns A new event handler.
90
- */
91
- private _handleDragCenter() : VertListener {
92
- const _self = this;
93
- return (e:VertEvent) => {
94
- _self.controlPointStart.add( e.params.dragAmount );
95
- _self.controlPointEnd.add( e.params.dragAmount );
96
- } ;
97
- }
98
-
99
- /**
100
- * Creates a new drag handler for the circle sector's start control point.
101
- *
102
- * @private
103
- * @method _handleDragStartControlPoint
104
- * @instance
105
- * @memberof CircleSectorHelper
106
- * @returns A new event handler.
107
- */
108
- private _handleDragStartControlPoint() : VertListener{
109
- const _self = this;
110
- return (e:VertEvent) => {
111
- _self.circleSector.circle.radius = _self.circleSector.circle.center.distance(_self.controlPointStart);
112
- _self.controlPointEnd.set( _self.circleSector.circle.vertAt(_self.circleSector.endAngle) );
113
- _self.circleSector.startAngle = _self.circleSector.circle.center.angle( _self.controlPointStart );
114
- }
115
- };
116
-
117
- /**
118
- * Creates a new drag handler for the circle sector's end control point.
119
- *
120
- * @private
121
- * @method _handleDragEndControlPoint
122
- * @instance
123
- * @memberof CircleSectorHelper
124
- * @returns A new event handler.
125
- */
126
- private _handleDragEndControlPoint() : VertListener {
127
- const _self = this;
128
- return (e:VertEvent) => {
129
- _self.circleSector.circle.radius = _self.circleSector.circle.center.distance(_self.controlPointEnd);
130
- _self.controlPointStart.set( _self.circleSector.circle.vertAt(_self.circleSector.startAngle) );
131
- _self.circleSector.endAngle = _self.circleSector.circle.center.angle( _self.controlPointEnd );
132
- }
133
- };
134
-
135
- /**
136
- * Destroy this circle helper.
137
- * The listeners will be removed from the circle sector's points.
138
- *
139
- * @method destroy
140
- * @instance
141
- * @memberof CircleSectorHelper
142
- */
143
- public destroy() : void {
144
- this.circleSector.circle.center.listeners.removeDragListener( this.centerListener );
145
- this.controlPointStart.listeners.removeDragListener( this.radiusStartListener );
146
- this.controlPointEnd.listeners.removeDragListener( this.radiusEndListener );
147
- }
148
-
149
- };
150
-
151
-
152
-
30
+ export class CircleSectorHelper implements IShapeInteractionHelper {
31
+ private circleSector: CircleSector;
32
+ private controlPointStart: Vertex;
33
+ private controlPointEnd: Vertex;
34
+
35
+ private centerListener: VertListener;
36
+ private radiusStartListener: VertListener;
37
+ private radiusEndListener: VertListener;
38
+
39
+ /**
40
+ * The constructor.
41
+ *
42
+ * @constructor
43
+ * @name CircleSectorHelper
44
+ * @param {CircleSector} circleSector - The circle sector to handle.
45
+ * @param {Vertex} controlPointStart - A point to define the radius and start angle (distance and angle from center).
46
+ * @param {Vertex} controlPointEnd - A point to define the radius and end angle (distance and angle from center).
47
+ * @param {PlotBoilerplate} pb - The PlotBoilerplate which contains the circle sector and both points.
48
+ **/
49
+ constructor(circleSector: CircleSector, controlPointStart: Vertex, controlPointEnd: Vertex, pb: PlotBoilerplate) {
50
+ this.circleSector = circleSector;
51
+ this.controlPointStart = controlPointStart;
52
+ this.controlPointEnd = controlPointEnd;
53
+
54
+ this.circleSector.circle.center.listeners.addDragListener((this.centerListener = this._handleDragCenter()));
55
+ this.controlPointStart.listeners.addDragListener((this.radiusStartListener = this._handleDragStartControlPoint()));
56
+ this.controlPointEnd.listeners.addDragListener((this.radiusEndListener = this._handleDragEndControlPoint()));
57
+ }
58
+
59
+ /**
60
+ * Creates a new drag handler for the circle sector's center point.
61
+ *
62
+ * @private
63
+ * @method handleDragCenter
64
+ * @instance
65
+ * @memberof CircleSectorHelper
66
+ * @returns A new event handler.
67
+ */
68
+ private _handleDragCenter(): VertListener {
69
+ const _self = this;
70
+ return (e: VertEvent) => {
71
+ _self.controlPointStart.add(e.params.dragAmount);
72
+ _self.controlPointEnd.add(e.params.dragAmount);
73
+ };
74
+ }
75
+
76
+ /**
77
+ * Creates a new drag handler for the circle sector's start control point.
78
+ *
79
+ * @private
80
+ * @method _handleDragStartControlPoint
81
+ * @instance
82
+ * @memberof CircleSectorHelper
83
+ * @returns A new event handler.
84
+ */
85
+ private _handleDragStartControlPoint(): VertListener {
86
+ const _self = this;
87
+ return (e: VertEvent) => {
88
+ _self.circleSector.circle.radius = _self.circleSector.circle.center.distance(_self.controlPointStart);
89
+ _self.controlPointEnd.set(_self.circleSector.circle.vertAt(_self.circleSector.endAngle));
90
+ _self.circleSector.startAngle = _self.circleSector.circle.center.angle(_self.controlPointStart);
91
+ };
92
+ }
93
+
94
+ /**
95
+ * Creates a new drag handler for the circle sector's end control point.
96
+ *
97
+ * @private
98
+ * @method _handleDragEndControlPoint
99
+ * @instance
100
+ * @memberof CircleSectorHelper
101
+ * @returns A new event handler.
102
+ */
103
+ private _handleDragEndControlPoint(): VertListener {
104
+ const _self = this;
105
+ return (e: VertEvent) => {
106
+ _self.circleSector.circle.radius = _self.circleSector.circle.center.distance(_self.controlPointEnd);
107
+ _self.controlPointStart.set(_self.circleSector.circle.vertAt(_self.circleSector.startAngle));
108
+ _self.circleSector.endAngle = _self.circleSector.circle.center.angle(_self.controlPointEnd);
109
+ };
110
+ }
111
+
112
+ //--- BEGIN --- Implement IShapeInteractionHelper ---
113
+ /**
114
+ * Draw grey handle lines.
115
+ *
116
+ * @param {DrawLib<any>} draw - The draw library instance to use.
117
+ * @param {DrawLib<any>} fill - The fill library instance to use.
118
+ */
119
+ public drawHandleLines(draw: DrawLib<any>, fill: DrawLib<any>) {
120
+ draw.line(this.circleSector.circle.center, this.controlPointStart, "rgba(64,192,128,0.333)", 1.0, {
121
+ dashOffset: 0.0,
122
+ dashArray: [4, 2]
123
+ });
124
+ draw.line(this.circleSector.circle.center, this.controlPointEnd, "rgba(64,192,128,0.333)", 1.0, {
125
+ dashOffset: 0.0,
126
+ dashArray: [4, 2]
127
+ });
128
+ }
129
+
130
+ /**
131
+ * Destroy this circle helper.
132
+ * The listeners will be removed from the circle sector's points.
133
+ *
134
+ * @method destroy
135
+ * @instance
136
+ * @memberof CircleSectorHelper
137
+ */
138
+ public destroy(): void {
139
+ this.circleSector.circle.center.listeners.removeDragListener(this.centerListener);
140
+ this.controlPointStart.listeners.removeDragListener(this.radiusStartListener);
141
+ this.controlPointEnd.listeners.removeDragListener(this.radiusEndListener);
142
+ }
143
+ //--- END --- Implement IShapeInteractionHelper ---
144
+ }
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Easily handle triangles with this triangle interaction helper: always keep your
3
+ * triangles equilateral.
4
+ *
5
+ * @author Ikaros Kappler
6
+ * @date 2025-05-05
7
+ * @version 1.0.0
8
+ **/
9
+
10
+ import { VertEvent, VertListener } from "../../VertexListeners";
11
+ import { Vertex } from "../../Vertex";
12
+ import { IShapeInteractionHelper } from "../../interfaces/core";
13
+ import { DrawLib } from "../../interfaces/DrawLib";
14
+ import { Triangle } from "../../Triangle";
15
+ import { Vector } from "../../Vector";
16
+
17
+ /**
18
+ * @classdesc A helper for handling circles with an additional radius-control-point.
19
+ */
20
+ export class TriangleHelper implements IShapeInteractionHelper {
21
+ triangle: Triangle;
22
+ radiusPoint: Vertex;
23
+
24
+ private handlerA: VertListener;
25
+ private handlerB: VertListener;
26
+ private handlerC: VertListener;
27
+
28
+ /**
29
+ * The constructor.
30
+ *
31
+ * @constructor
32
+ * @name TriangleHelper
33
+ * @param {Triangle} triangle - The triangle to handle.
34
+ * @param {Vertex} radiusPoint - A point to define the radius (distance from center).
35
+ * @param {PlotBoilerplate} pb - The PlotBoilerplate which contains the circle and point.
36
+ **/
37
+ constructor(triangle: Triangle, setInitiallyEquilateral?: boolean) {
38
+ this.triangle = triangle;
39
+
40
+ triangle.a.listeners.addDragListener(
41
+ (this.handlerA = this._handleTrianglePoint(this.triangle.a, this.triangle.b, this.triangle.c))
42
+ );
43
+ triangle.b.listeners.addDragListener(
44
+ (this.handlerB = this._handleTrianglePoint(this.triangle.b, this.triangle.c, this.triangle.a))
45
+ );
46
+ triangle.c.listeners.addDragListener(
47
+ (this.handlerC = this._handleTrianglePoint(this.triangle.c, this.triangle.a, this.triangle.b))
48
+ );
49
+
50
+ // Trigger to set equilateral
51
+ if (setInitiallyEquilateral) {
52
+ this.handlerC(null as any as VertEvent); // We know by construction that _here_ the param is optional!
53
+ }
54
+ }
55
+
56
+ //--- BEGIN --- Implement ISHapeInteractionHelper ---
57
+ /**
58
+ * Let this shape helper draw it's handle lines. It's up to the helper what they look like.
59
+ * @param {DrawLib<any>} draw - The draw library to use.
60
+ * @param {DrawLib<any>} fill - The fill library to use.
61
+ */
62
+ drawHandleLines(_draw: DrawLib<any>, _fill: DrawLib<any>): void {
63
+ // NOOP
64
+ }
65
+
66
+ /**
67
+ * Destroy this circle helper.
68
+ * The listeners will be removed from the circle points.
69
+ *
70
+ * @method destroy
71
+ * @instance
72
+ * @memberof TriangleHelper
73
+ */
74
+ destroy() {
75
+ this.triangle.a.listeners.removeDragListener(this.handlerA);
76
+ this.triangle.b.listeners.removeDragListener(this.handlerB);
77
+ this.triangle.c.listeners.removeDragListener(this.handlerC);
78
+ }
79
+ //--- END --- Implement ISHapeInteractionHelper ---
80
+
81
+ /**
82
+ * Creates a new drag handler for the circle's radius control point.
83
+ *
84
+ * @private
85
+ * @method _handleDragCenter
86
+ * @instance
87
+ * @memberof TriangleHelper
88
+ * @returns A new event handler.
89
+ */
90
+ private _handleTrianglePoint(vertex1: Vertex, vertex2: Vertex, vertex3: Vertex): VertListener {
91
+ const _self = this;
92
+ return (_evt: VertEvent) => {
93
+ // _self.circle.radius = _self.circle.center.distance(_self.radiusPoint);
94
+ // Calculate new side length: set equialateral
95
+ const vec = new Vector(vertex1, vertex2);
96
+ const mid = vec.vertAt(0.5);
97
+ const perp = vec.perp().add(mid).sub(vec.a);
98
+ perp.setLength((vec.length() * Math.sqrt(3)) / 2); // The height of a equilateral triangle
99
+ vertex3.set(perp.b);
100
+ };
101
+ }
102
+ }
@@ -0,0 +1,115 @@
1
+ /**
2
+ * A helper for VEllipses.
3
+ *
4
+ * @author Ikaros Kappler
5
+ * @date 2025-03-31
6
+ * @modified 2025-04-02 Adding `VEllipseHelper.drawHandleLines()`.
7
+ * @modified 2025-04-09 Adding `VEllipseHelper.destroy()`.
8
+ * @modified 2025-05-05 Fixed a typo in the `VEllipseHelper.destroy` method (was named `detroy`).
9
+ * @modified 2025-05-05 `VEllipseHelper` is now implementing `IShapeInteractionHelper`.
10
+ * @version 1.0.1
11
+ */
12
+
13
+ import { Line } from "../../Line";
14
+ import { VEllipse } from "../../VEllipse";
15
+ import { Vertex } from "../../Vertex";
16
+ import { VertEvent, VertListener } from "../../VertexListeners";
17
+ import { DrawLib, IShapeInteractionHelper } from "../../interfaces";
18
+
19
+ export class VEllipseHelper implements IShapeInteractionHelper {
20
+ private readonly ellipse: VEllipse;
21
+ private readonly rotationControlPoint: Vertex;
22
+
23
+ private _rotationControlLine: Line;
24
+
25
+ private _centerPointHandler: VertListener;
26
+ private _rotationPointHandler: VertListener;
27
+
28
+ constructor(ellipse: VEllipse, rotationControlPoint: Vertex) {
29
+ this.ellipse = ellipse;
30
+ this.rotationControlPoint = rotationControlPoint;
31
+
32
+ // const rotationControlLine: Line = new Line(ellipse.center, rotationControlPoint);
33
+ this._rotationControlLine = new Line(ellipse.center, rotationControlPoint);
34
+
35
+ // +---------------------------------------------------------------------
36
+ // | Listen for the center to be moved.
37
+ // +-------------------------------------------
38
+ // ellipse.center.listeners.addDragListener((event: VertEvent) => {
39
+ // rotationControlPoint.add(event.params.dragAmount);
40
+ // });
41
+ ellipse.center.listeners.addDragListener((this._centerPointHandler = this._handleDragCenterPoint()));
42
+
43
+ // +---------------------------------------------------------------------
44
+ // | Listen for rotation changes.
45
+ // +-------------------------------------------
46
+ // rotationControlPoint.listeners.addDragListener((_event: VertEvent) => {
47
+ // var newRotation = rotationControlLine.angle();
48
+ // var rDiff = newRotation - ellipse.rotation;
49
+ // ellipse.rotation = newRotation;
50
+ // ellipse.axis.rotate(rDiff, ellipse.center);
51
+ // });
52
+ rotationControlPoint.listeners.addDragListener((this._rotationPointHandler = this._handleRotationCenterPoint()));
53
+ }
54
+
55
+ private _handleDragCenterPoint(): VertListener {
56
+ const _self = this;
57
+ return (event: VertEvent) => {
58
+ _self.rotationControlPoint.add(event.params.dragAmount);
59
+ };
60
+ }
61
+
62
+ private _handleRotationCenterPoint(): VertListener {
63
+ const _self = this;
64
+ return (_event: VertEvent) => {
65
+ var newRotation = _self._rotationControlLine.angle();
66
+ var rDiff = newRotation - _self.ellipse.rotation;
67
+ _self.ellipse.rotation = newRotation;
68
+ _self.ellipse.axis.rotate(rDiff, _self.ellipse.center);
69
+ };
70
+ }
71
+
72
+ /**
73
+ * Draw grey handle lines.
74
+ *
75
+ * @param {DrawLib<any>} draw - The draw library instance to use.
76
+ * @param {DrawLib<any>} fill - The fill library instance to use.
77
+ */
78
+ drawHandleLines(draw: DrawLib<any>, fill: DrawLib<any>) {
79
+ // Draw rotation handle line
80
+ draw.line(this.ellipse.center, this.rotationControlPoint, "rgba(192,64,128,0.333)", 1.0, {
81
+ dashOffset: 0.0,
82
+ dashArray: [4, 2]
83
+ });
84
+ // Draw helper box
85
+ draw.setCurrentId(`${this.ellipse.uid}_e0`);
86
+ draw.setCurrentClassName(`${this.ellipse.className}-v-line`);
87
+ draw.line(
88
+ this.ellipse.center.clone().add(0, this.ellipse.signedRadiusV()).rotate(this.ellipse.rotation, this.ellipse.center),
89
+ this.ellipse.axis,
90
+ "rgba(64,128,192,0.333)",
91
+ 1.0,
92
+ {
93
+ dashOffset: 0.0,
94
+ dashArray: [4, 2]
95
+ }
96
+ );
97
+ draw.setCurrentId(`${this.ellipse.uid}_e1`);
98
+ draw.setCurrentClassName(`${this.ellipse.className}-h-line`);
99
+ draw.line(
100
+ this.ellipse.center.clone().add(this.ellipse.signedRadiusH(), 0).rotate(this.ellipse.rotation, this.ellipse.center),
101
+ this.ellipse.axis,
102
+ "rgba(64,128,192,0.333)",
103
+ 1.0,
104
+ {
105
+ dashOffset: 0.0,
106
+ dashArray: [4, 2]
107
+ }
108
+ );
109
+ }
110
+
111
+ destroy(): void {
112
+ this.ellipse.center.listeners.removeDragListener(this._centerPointHandler);
113
+ this.rotationControlPoint.listeners.removeDragListener(this._rotationPointHandler);
114
+ }
115
+ }