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.
- package/README.md +6 -0
- package/dist/index.esm.js +1390 -265
- package/dist/index.esm.js.map +1 -1
- package/dist/index.esm.min.js +1 -1
- package/dist/index.esm.min.js.map +1 -1
- package/dist/plotboilerplate.browser.min.js +1 -1
- package/dist/plotboilerplate.browser.min.js.map +1 -1
- package/dist/plotboilerplate.js +1264 -99
- package/dist/plotboilerplate.min.js +1 -1
- package/package.json +1 -1
- package/src/cjs/BezierPath.d.ts +41 -5
- package/src/cjs/BezierPath.js +52 -2
- package/src/cjs/BezierPath.js.map +1 -1
- package/src/cjs/Bounds.d.ts +67 -3
- package/src/cjs/Bounds.js +101 -3
- package/src/cjs/Bounds.js.map +1 -1
- package/src/cjs/Circle.d.ts +46 -4
- package/src/cjs/Circle.js +82 -3
- package/src/cjs/Circle.js.map +1 -1
- package/src/cjs/CircleSector.d.ts +51 -2
- package/src/cjs/CircleSector.js +112 -3
- package/src/cjs/CircleSector.js.map +1 -1
- package/src/cjs/CubicBezierCurve.d.ts +113 -7
- package/src/cjs/CubicBezierCurve.js +281 -33
- package/src/cjs/CubicBezierCurve.js.map +1 -1
- package/src/cjs/Line.d.ts +38 -3
- package/src/cjs/Line.js +64 -1
- package/src/cjs/Line.js.map +1 -1
- package/src/cjs/PlotBoilerplate.js +2 -9
- package/src/cjs/PlotBoilerplate.js.map +1 -1
- package/src/cjs/Polygon.d.ts +48 -4
- package/src/cjs/Polygon.js +91 -16
- package/src/cjs/Polygon.js.map +1 -1
- package/src/cjs/Triangle.d.ts +52 -3
- package/src/cjs/Triangle.js +80 -1
- package/src/cjs/Triangle.js.map +1 -1
- package/src/cjs/VEllipse.d.ts +62 -3
- package/src/cjs/VEllipse.js +181 -17
- package/src/cjs/VEllipse.js.map +1 -1
- package/src/cjs/VEllipseSector.d.ts +86 -2
- package/src/cjs/VEllipseSector.js +148 -4
- package/src/cjs/VEllipseSector.js.map +1 -1
- package/src/cjs/Vector.d.ts +12 -2
- package/src/cjs/Vector.js +15 -2
- package/src/cjs/Vector.js.map +1 -1
- package/src/cjs/VertTuple.d.ts +28 -4
- package/src/cjs/VertTuple.js +36 -3
- package/src/cjs/VertTuple.js.map +1 -1
- package/src/cjs/Vertex.d.ts +17 -2
- package/src/cjs/Vertex.js +18 -1
- package/src/cjs/Vertex.js.map +1 -1
- package/src/cjs/interfaces/core.d.ts +39 -0
- package/src/cjs/interfaces/core.js +2 -0
- package/src/cjs/interfaces/core.js.map +1 -1
- package/src/cjs/utils/algorithms/convexPolygonIncircle.d.ts +2 -1
- package/src/cjs/utils/algorithms/convexPolygonIncircle.js +14 -6
- package/src/cjs/utils/algorithms/convexPolygonIncircle.js.map +1 -1
- package/src/cjs/utils/createRandomizedPolygon.d.ts +14 -0
- package/src/cjs/utils/createRandomizedPolygon.js +32 -0
- package/src/cjs/utils/createRandomizedPolygon.js.map +1 -0
- package/src/cjs/utils/helpers/BezierPathInteractionHelper.d.ts +9 -7
- package/src/cjs/utils/helpers/BezierPathInteractionHelper.js +37 -23
- package/src/cjs/utils/helpers/BezierPathInteractionHelper.js.map +1 -1
- package/src/cjs/utils/helpers/CircleSectorHelper.d.ts +10 -1
- package/src/cjs/utils/helpers/CircleSectorHelper.js +19 -20
- package/src/cjs/utils/helpers/CircleSectorHelper.js.map +1 -1
- package/src/cjs/utils/helpers/VEllipseHelper.d.ts +30 -0
- package/src/cjs/utils/helpers/VEllipseHelper.js +86 -0
- package/src/cjs/utils/helpers/VEllipseHelper.js.map +1 -0
- package/src/cjs/utils/helpers/VEllipseSectorHelper.d.ts +42 -3
- package/src/cjs/utils/helpers/VEllipseSectorHelper.js +107 -25
- package/src/cjs/utils/helpers/VEllipseSectorHelper.js.map +1 -1
- package/src/createDemoDrawables.js +3 -1
- package/src/esm/BezierPath.d.ts +41 -5
- package/src/esm/BezierPath.js +50 -2
- package/src/esm/BezierPath.js.map +1 -1
- package/src/esm/Bounds.d.ts +67 -3
- package/src/esm/Bounds.js +101 -3
- package/src/esm/Bounds.js.map +1 -1
- package/src/esm/Circle.d.ts +46 -4
- package/src/esm/Circle.js +79 -3
- package/src/esm/Circle.js.map +1 -1
- package/src/esm/CircleSector.d.ts +51 -2
- package/src/esm/CircleSector.js +108 -3
- package/src/esm/CircleSector.js.map +1 -1
- package/src/esm/CubicBezierCurve.d.ts +113 -7
- package/src/esm/CubicBezierCurve.js +277 -33
- package/src/esm/CubicBezierCurve.js.map +1 -1
- package/src/esm/Line.d.ts +38 -3
- package/src/esm/Line.js +62 -1
- package/src/esm/Line.js.map +1 -1
- package/src/esm/PlotBoilerplate.js +2 -9
- package/src/esm/PlotBoilerplate.js.map +1 -1
- package/src/esm/Polygon.d.ts +48 -4
- package/src/esm/Polygon.js +89 -16
- package/src/esm/Polygon.js.map +1 -1
- package/src/esm/Triangle.d.ts +52 -3
- package/src/esm/Triangle.js +77 -1
- package/src/esm/Triangle.js.map +1 -1
- package/src/esm/VEllipse.d.ts +62 -3
- package/src/esm/VEllipse.js +178 -17
- package/src/esm/VEllipse.js.map +1 -1
- package/src/esm/VEllipseSector.d.ts +86 -2
- package/src/esm/VEllipseSector.js +146 -7
- package/src/esm/VEllipseSector.js.map +1 -1
- package/src/esm/Vector.d.ts +12 -2
- package/src/esm/Vector.js +15 -2
- package/src/esm/Vector.js.map +1 -1
- package/src/esm/VertTuple.d.ts +28 -4
- package/src/esm/VertTuple.js +36 -3
- package/src/esm/VertTuple.js.map +1 -1
- package/src/esm/Vertex.d.ts +17 -2
- package/src/esm/Vertex.js +18 -1
- package/src/esm/Vertex.js.map +1 -1
- package/src/esm/interfaces/core.d.ts +39 -0
- package/src/esm/interfaces/core.js +2 -0
- package/src/esm/interfaces/core.js.map +1 -1
- package/src/esm/utils/algorithms/convexPolygonIncircle.d.ts +2 -1
- package/src/esm/utils/algorithms/convexPolygonIncircle.js +15 -7
- package/src/esm/utils/algorithms/convexPolygonIncircle.js.map +1 -1
- package/src/esm/utils/algorithms/createRandomizedPolygon.d.ts +14 -0
- package/src/esm/utils/algorithms/createRandomizedPolygon.js +28 -0
- package/src/esm/utils/algorithms/createRandomizedPolygon.js.map +1 -0
- package/src/esm/utils/createRandomizedPolygon.d.ts +14 -0
- package/src/esm/utils/createRandomizedPolygon.js +28 -0
- package/src/esm/utils/createRandomizedPolygon.js.map +1 -0
- package/src/esm/utils/helpers/BezierPathInteractionHelper.d.ts +9 -7
- package/src/esm/utils/helpers/BezierPathInteractionHelper.js +35 -22
- package/src/esm/utils/helpers/BezierPathInteractionHelper.js.map +1 -1
- package/src/esm/utils/helpers/CircleSectorHelper.d.ts +10 -1
- package/src/esm/utils/helpers/CircleSectorHelper.js +19 -20
- package/src/esm/utils/helpers/CircleSectorHelper.js.map +1 -1
- package/src/esm/utils/helpers/VEllipseHelper.d.ts +30 -0
- package/src/esm/utils/helpers/VEllipseHelper.js +81 -0
- package/src/esm/utils/helpers/VEllipseHelper.js.map +1 -0
- package/src/esm/utils/helpers/VEllipseSectorHelper.d.ts +42 -3
- package/src/esm/utils/helpers/VEllipseSectorHelper.js +106 -24
- package/src/esm/utils/helpers/VEllipseSectorHelper.js.map +1 -1
- package/src/ts/BezierPath.ts +58 -5
- package/src/ts/Bounds.ts +110 -6
- package/src/ts/Circle.ts +87 -5
- package/src/ts/CircleSector.ts +115 -5
- package/src/ts/CubicBezierCurve.ts +332 -42
- package/src/ts/Line.ts +66 -3
- package/src/ts/PlotBoilerplate.ts +3 -9
- package/src/ts/Polygon.ts +103 -22
- package/src/ts/Triangle.ts +85 -3
- package/src/ts/VEllipse.ts +214 -19
- package/src/ts/VEllipseSector.ts +154 -8
- package/src/ts/Vector.ts +16 -2
- package/src/ts/VertTuple.ts +39 -4
- package/src/ts/Vertex.ts +20 -2
- package/src/ts/interfaces/core.ts +42 -0
- package/src/ts/utils/algorithms/convexPolygonIncircle.ts +82 -78
- package/src/ts/utils/createRandomizedPolygon.ts +31 -0
- package/src/ts/utils/helpers/BezierPathInteractionHelper.ts +45 -29
- package/src/ts/utils/helpers/CircleSectorHelper.ts +115 -125
- package/src/ts/utils/helpers/VEllipseHelper.ts +113 -0
- package/src/ts/utils/helpers/VEllipseSectorHelper.ts +142 -25
|
@@ -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,129 @@
|
|
|
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
|
-
* @
|
|
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 } from "../../interfaces";
|
|
26
26
|
|
|
27
27
|
/**
|
|
28
28
|
* @classdesc A helper for handling circles with an additional radius-control-point.
|
|
29
29
|
*/
|
|
30
30
|
export class CircleSectorHelper {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
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
|
-
|
|
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
|
+
/**
|
|
113
|
+
* Draw grey handle lines.
|
|
114
|
+
*
|
|
115
|
+
* @param {DrawLib<any>} draw - The draw library instance to use.
|
|
116
|
+
* @param {DrawLib<any>} fill - The fill library instance to use.
|
|
117
|
+
*/
|
|
118
|
+
public drawHandleLines(draw: DrawLib<any>, fill: DrawLib<any>) {
|
|
119
|
+
draw.line(this.circleSector.circle.center, this.controlPointStart, "rgba(64,192,128,0.333)", 1.0, {
|
|
120
|
+
dashOffset: 0.0,
|
|
121
|
+
dashArray: [4, 2]
|
|
122
|
+
});
|
|
123
|
+
draw.line(this.circleSector.circle.center, this.controlPointEnd, "rgba(64,192,128,0.333)", 1.0, {
|
|
124
|
+
dashOffset: 0.0,
|
|
125
|
+
dashArray: [4, 2]
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Destroy this circle helper.
|
|
131
|
+
* The listeners will be removed from the circle sector's points.
|
|
132
|
+
*
|
|
133
|
+
* @method destroy
|
|
134
|
+
* @instance
|
|
135
|
+
* @memberof CircleSectorHelper
|
|
136
|
+
*/
|
|
137
|
+
public destroy(): void {
|
|
138
|
+
this.circleSector.circle.center.listeners.removeDragListener(this.centerListener);
|
|
139
|
+
this.controlPointStart.listeners.removeDragListener(this.radiusStartListener);
|
|
140
|
+
this.controlPointEnd.listeners.removeDragListener(this.radiusEndListener);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
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
|
+
* @version 1.0.0
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { Line } from "../../Line";
|
|
12
|
+
import { VEllipse } from "../../VEllipse";
|
|
13
|
+
import { Vertex } from "../../Vertex";
|
|
14
|
+
import { VertEvent, VertListener } from "../../VertexListeners";
|
|
15
|
+
import { DrawLib } from "../../interfaces";
|
|
16
|
+
|
|
17
|
+
export class VEllipseHelper {
|
|
18
|
+
private readonly ellipse: VEllipse;
|
|
19
|
+
private readonly rotationControlPoint: Vertex;
|
|
20
|
+
|
|
21
|
+
private _rotationControlLine: Line;
|
|
22
|
+
|
|
23
|
+
private _centerPointHandler: VertListener;
|
|
24
|
+
private _rotationPointHandler: VertListener;
|
|
25
|
+
|
|
26
|
+
constructor(ellipse: VEllipse, rotationControlPoint: Vertex) {
|
|
27
|
+
this.ellipse = ellipse;
|
|
28
|
+
this.rotationControlPoint = rotationControlPoint;
|
|
29
|
+
|
|
30
|
+
// const rotationControlLine: Line = new Line(ellipse.center, rotationControlPoint);
|
|
31
|
+
this._rotationControlLine = new Line(ellipse.center, rotationControlPoint);
|
|
32
|
+
|
|
33
|
+
// +---------------------------------------------------------------------
|
|
34
|
+
// | Listen for the center to be moved.
|
|
35
|
+
// +-------------------------------------------
|
|
36
|
+
// ellipse.center.listeners.addDragListener((event: VertEvent) => {
|
|
37
|
+
// rotationControlPoint.add(event.params.dragAmount);
|
|
38
|
+
// });
|
|
39
|
+
ellipse.center.listeners.addDragListener((this._centerPointHandler = this._handleDragCenterPoint()));
|
|
40
|
+
|
|
41
|
+
// +---------------------------------------------------------------------
|
|
42
|
+
// | Listen for rotation changes.
|
|
43
|
+
// +-------------------------------------------
|
|
44
|
+
// rotationControlPoint.listeners.addDragListener((_event: VertEvent) => {
|
|
45
|
+
// var newRotation = rotationControlLine.angle();
|
|
46
|
+
// var rDiff = newRotation - ellipse.rotation;
|
|
47
|
+
// ellipse.rotation = newRotation;
|
|
48
|
+
// ellipse.axis.rotate(rDiff, ellipse.center);
|
|
49
|
+
// });
|
|
50
|
+
rotationControlPoint.listeners.addDragListener((this._rotationPointHandler = this._handleRotationCenterPoint()));
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
private _handleDragCenterPoint(): VertListener {
|
|
54
|
+
const _self = this;
|
|
55
|
+
return (event: VertEvent) => {
|
|
56
|
+
_self.rotationControlPoint.add(event.params.dragAmount);
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
private _handleRotationCenterPoint(): VertListener {
|
|
61
|
+
const _self = this;
|
|
62
|
+
return (_event: VertEvent) => {
|
|
63
|
+
var newRotation = _self._rotationControlLine.angle();
|
|
64
|
+
var rDiff = newRotation - _self.ellipse.rotation;
|
|
65
|
+
_self.ellipse.rotation = newRotation;
|
|
66
|
+
_self.ellipse.axis.rotate(rDiff, _self.ellipse.center);
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Draw grey handle lines.
|
|
72
|
+
*
|
|
73
|
+
* @param {DrawLib<any>} draw - The draw library instance to use.
|
|
74
|
+
* @param {DrawLib<any>} fill - The fill library instance to use.
|
|
75
|
+
*/
|
|
76
|
+
drawHandleLines(draw: DrawLib<any>, fill: DrawLib<any>) {
|
|
77
|
+
// Draw rotation handle line
|
|
78
|
+
draw.line(this.ellipse.center, this.rotationControlPoint, "rgba(192,64,128,0.333)", 1.0, {
|
|
79
|
+
dashOffset: 0.0,
|
|
80
|
+
dashArray: [4, 2]
|
|
81
|
+
});
|
|
82
|
+
// Draw helper box
|
|
83
|
+
draw.setCurrentId(`${this.ellipse.uid}_e0`);
|
|
84
|
+
draw.setCurrentClassName(`${this.ellipse.className}-v-line`);
|
|
85
|
+
draw.line(
|
|
86
|
+
this.ellipse.center.clone().add(0, this.ellipse.signedRadiusV()).rotate(this.ellipse.rotation, this.ellipse.center),
|
|
87
|
+
this.ellipse.axis,
|
|
88
|
+
"rgba(64,128,192,0.333)",
|
|
89
|
+
1.0,
|
|
90
|
+
{
|
|
91
|
+
dashOffset: 0.0,
|
|
92
|
+
dashArray: [4, 2]
|
|
93
|
+
}
|
|
94
|
+
);
|
|
95
|
+
draw.setCurrentId(`${this.ellipse.uid}_e1`);
|
|
96
|
+
draw.setCurrentClassName(`${this.ellipse.className}-h-line`);
|
|
97
|
+
draw.line(
|
|
98
|
+
this.ellipse.center.clone().add(this.ellipse.signedRadiusH(), 0).rotate(this.ellipse.rotation, this.ellipse.center),
|
|
99
|
+
this.ellipse.axis,
|
|
100
|
+
"rgba(64,128,192,0.333)",
|
|
101
|
+
1.0,
|
|
102
|
+
{
|
|
103
|
+
dashOffset: 0.0,
|
|
104
|
+
dashArray: [4, 2]
|
|
105
|
+
}
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
detroy(): void {
|
|
110
|
+
this.ellipse.center.listeners.removeDragListener(this._centerPointHandler);
|
|
111
|
+
this.rotationControlPoint.listeners.removeDragListener(this._rotationPointHandler);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
@@ -1,60 +1,177 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* A helper for VEllipseSectors.
|
|
3
3
|
*
|
|
4
|
-
* @author
|
|
5
|
-
* @date
|
|
6
|
-
* @
|
|
4
|
+
* @author Ikaros Kappler
|
|
5
|
+
* @date 2021-03-24
|
|
6
|
+
* @modified 2025-04-02 Adding `VEllipseSectorHelper.drawHandleLines`.
|
|
7
|
+
* @modified 2025-04-07 Modifying the calculation of `startAngle` and `endAngle` from the rotation control point: wrapping result into [0,TWO_PI).
|
|
8
|
+
* @modified 2025-04-09 Adding the `VEllipseSectorHelper.destroy` method.
|
|
9
|
+
* @version 1.1.0
|
|
7
10
|
*/
|
|
8
11
|
|
|
9
12
|
import { Line } from "../../Line";
|
|
10
13
|
import { VEllipseSector } from "../../VEllipseSector";
|
|
11
14
|
import { Vertex } from "../../Vertex";
|
|
12
|
-
import { VertEvent } from "../../VertexListeners";
|
|
15
|
+
import { VertEvent, VertListener } from "../../VertexListeners";
|
|
16
|
+
import { geomutils } from "../../geomutils";
|
|
17
|
+
import { DrawLib } from "../../interfaces";
|
|
13
18
|
|
|
14
19
|
export class VEllipseSectorHelper {
|
|
20
|
+
private sector: VEllipseSector;
|
|
21
|
+
private startAngleControlPoint: Vertex;
|
|
22
|
+
private endAngleControlPoint: Vertex;
|
|
23
|
+
private rotationControlPoint: Vertex;
|
|
24
|
+
|
|
25
|
+
private _rotationControlLine: Line;
|
|
26
|
+
private _startAngleControlLine: Line;
|
|
27
|
+
private _endAngleControlLine: Line;
|
|
28
|
+
|
|
29
|
+
private _centerHandler: VertListener;
|
|
30
|
+
private _rotationHandler: VertListener;
|
|
31
|
+
private _startAngleHandler: VertListener;
|
|
32
|
+
private _endAngleHandler: VertListener;
|
|
33
|
+
|
|
15
34
|
constructor(
|
|
16
35
|
sector: VEllipseSector,
|
|
17
36
|
startAngleControlPoint: Vertex,
|
|
18
37
|
endAngleControlPoint: Vertex,
|
|
19
38
|
rotationControlPoint: Vertex
|
|
20
39
|
) {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
40
|
+
this.sector = sector;
|
|
41
|
+
this.startAngleControlPoint = startAngleControlPoint;
|
|
42
|
+
this.endAngleControlPoint = endAngleControlPoint;
|
|
43
|
+
this.rotationControlPoint = rotationControlPoint;
|
|
44
|
+
|
|
45
|
+
// const rotationControlLine: Line = new Line(sector.ellipse.center, rotationControlPoint);
|
|
46
|
+
this._rotationControlLine = new Line(sector.ellipse.center, rotationControlPoint);
|
|
47
|
+
// const startAngleControlLine: Line = new Line(sector.ellipse.center, startAngleControlPoint);
|
|
48
|
+
this._startAngleControlLine = new Line(sector.ellipse.center, startAngleControlPoint);
|
|
49
|
+
// const endAngleControlLine: Line = new Line(sector.ellipse.center, endAngleControlPoint);
|
|
50
|
+
this._endAngleControlLine = new Line(sector.ellipse.center, endAngleControlPoint);
|
|
24
51
|
|
|
25
52
|
// +---------------------------------------------------------------------
|
|
26
53
|
// | Listen for the center to be moved.
|
|
27
54
|
// +-------------------------------------------
|
|
28
|
-
sector.ellipse.center.listeners.addDragListener((
|
|
29
|
-
startAngleControlPoint.add(event.params.dragAmount);
|
|
30
|
-
endAngleControlPoint.add(event.params.dragAmount);
|
|
31
|
-
rotationControlPoint.add(event.params.dragAmount);
|
|
32
|
-
});
|
|
55
|
+
sector.ellipse.center.listeners.addDragListener((this._centerHandler = this._handleDragCenterPoint()));
|
|
33
56
|
|
|
34
57
|
// +---------------------------------------------------------------------
|
|
35
58
|
// | Listen for rotation changes.
|
|
36
59
|
// +-------------------------------------------
|
|
37
|
-
rotationControlPoint.listeners.addDragListener((
|
|
38
|
-
var newRotation = rotationControlLine.angle();
|
|
39
|
-
var rDiff = newRotation - sector.ellipse.rotation;
|
|
40
|
-
sector.ellipse.rotation = newRotation;
|
|
41
|
-
sector.ellipse.axis.rotate(rDiff, sector.ellipse.center);
|
|
42
|
-
startAngleControlPoint.rotate(rDiff, sector.ellipse.center);
|
|
43
|
-
endAngleControlPoint.rotate(rDiff, sector.ellipse.center);
|
|
44
|
-
});
|
|
60
|
+
rotationControlPoint.listeners.addDragListener((this._rotationHandler = this._handleDragRotationControlPoint()));
|
|
45
61
|
|
|
46
62
|
// +---------------------------------------------------------------------
|
|
47
63
|
// | Listen for start angle changes.
|
|
48
64
|
// +-------------------------------------------
|
|
49
|
-
startAngleControlPoint.listeners.addDragListener((
|
|
50
|
-
sector.startAngle = startAngleControlLine.angle() - sector.ellipse.rotation;
|
|
51
|
-
});
|
|
65
|
+
startAngleControlPoint.listeners.addDragListener((this._startAngleHandler = this._handleDragStartAngleControlPoint()));
|
|
52
66
|
|
|
53
67
|
// +---------------------------------------------------------------------
|
|
54
68
|
// | Listen for end angle changes.
|
|
55
69
|
// +-------------------------------------------
|
|
56
|
-
endAngleControlPoint.listeners.addDragListener((
|
|
57
|
-
|
|
70
|
+
endAngleControlPoint.listeners.addDragListener((this._endAngleHandler = this._handleDragEndAngleControlPoint()));
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Creates a new drag handler for the circle sector's start control point.
|
|
75
|
+
*
|
|
76
|
+
* @private
|
|
77
|
+
* @method _handleDragStartControlPoint
|
|
78
|
+
* @instance
|
|
79
|
+
* @memberof CircleSectorHelper
|
|
80
|
+
* @returns A new event handler.
|
|
81
|
+
*/
|
|
82
|
+
private _handleDragCenterPoint(): VertListener {
|
|
83
|
+
const _self = this;
|
|
84
|
+
return (event: VertEvent) => {
|
|
85
|
+
_self.startAngleControlPoint.add(event.params.dragAmount);
|
|
86
|
+
_self.endAngleControlPoint.add(event.params.dragAmount);
|
|
87
|
+
_self.rotationControlPoint.add(event.params.dragAmount);
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
private _handleDragRotationControlPoint(): VertListener {
|
|
92
|
+
const _self = this;
|
|
93
|
+
return (event: VertEvent) => {
|
|
94
|
+
const newRotation: number = _self._rotationControlLine.angle();
|
|
95
|
+
const rDiff: number = newRotation - _self.sector.ellipse.rotation;
|
|
96
|
+
_self.sector.ellipse.rotation = newRotation;
|
|
97
|
+
_self.sector.ellipse.axis.rotate(rDiff, _self.sector.ellipse.center);
|
|
98
|
+
_self.startAngleControlPoint.rotate(rDiff, _self.sector.ellipse.center);
|
|
99
|
+
_self.endAngleControlPoint.rotate(rDiff, _self.sector.ellipse.center);
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
private _handleDragStartAngleControlPoint(): VertListener {
|
|
104
|
+
const _self = this;
|
|
105
|
+
return (_event: VertEvent) => {
|
|
106
|
+
// sector.startAngle = startAngleControlLine.angle() - sector.ellipse.rotation;
|
|
107
|
+
_self.sector.startAngle = geomutils.mapAngleTo2PI(_self._startAngleControlLine.angle() - _self.sector.ellipse.rotation);
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
private _handleDragEndAngleControlPoint(): VertListener {
|
|
112
|
+
const _self = this;
|
|
113
|
+
|
|
114
|
+
return (event: VertEvent) => {
|
|
115
|
+
_self.sector.endAngle = geomutils.mapAngleTo2PI(_self._endAngleControlLine.angle() - _self.sector.ellipse.rotation);
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Draw grey handle lines.
|
|
121
|
+
*
|
|
122
|
+
* @param {DrawLib<any>} draw - The draw library instance to use.
|
|
123
|
+
* @param {DrawLib<any>} fill - The fill library instance to use.
|
|
124
|
+
*/
|
|
125
|
+
drawHandleLines(draw: DrawLib<any>, fill: DrawLib<any>) {
|
|
126
|
+
draw.line(this.sector.ellipse.center, this.startAngleControlPoint, "rgba(64,192,128,0.333)", 1.0, {
|
|
127
|
+
dashOffset: 0.0,
|
|
128
|
+
dashArray: [4, 2]
|
|
129
|
+
});
|
|
130
|
+
draw.line(this.sector.ellipse.center, this.endAngleControlPoint, "rgba(64,192,128,0.333)", 1.0, {
|
|
131
|
+
dashOffset: 0.0,
|
|
132
|
+
dashArray: [4, 2]
|
|
58
133
|
});
|
|
134
|
+
// Draw rotation handle line
|
|
135
|
+
draw.line(this.sector.ellipse.center, this.rotationControlPoint, "rgba(192,64,128,0.333)", 1.0, {
|
|
136
|
+
dashOffset: 0.0,
|
|
137
|
+
dashArray: [4, 2]
|
|
138
|
+
});
|
|
139
|
+
// Draw helper box
|
|
140
|
+
draw.line(
|
|
141
|
+
this.sector.ellipse.center
|
|
142
|
+
.clone()
|
|
143
|
+
.add(0, this.sector.ellipse.signedRadiusV())
|
|
144
|
+
.rotate(this.sector.ellipse.rotation, this.sector.ellipse.center),
|
|
145
|
+
this.sector.ellipse.axis,
|
|
146
|
+
"rgba(64,128,192,0.333)",
|
|
147
|
+
1.0,
|
|
148
|
+
{
|
|
149
|
+
dashOffset: 0.0,
|
|
150
|
+
dashArray: [4, 2]
|
|
151
|
+
}
|
|
152
|
+
);
|
|
153
|
+
draw.line(
|
|
154
|
+
this.sector.ellipse.center
|
|
155
|
+
.clone()
|
|
156
|
+
.add(this.sector.ellipse.signedRadiusH(), 0)
|
|
157
|
+
.rotate(this.sector.ellipse.rotation, this.sector.ellipse.center),
|
|
158
|
+
this.sector.ellipse.axis,
|
|
159
|
+
"rgba(64,128,192,0.333)",
|
|
160
|
+
1.0,
|
|
161
|
+
{
|
|
162
|
+
dashOffset: 0.0,
|
|
163
|
+
dashArray: [4, 2]
|
|
164
|
+
}
|
|
165
|
+
);
|
|
166
|
+
} // END drawHandleLines
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Destroy this VEllipseHandler which means: all listeners are being removed.
|
|
170
|
+
*/
|
|
171
|
+
destroy(): void {
|
|
172
|
+
this.sector.ellipse.center.listeners.removeDragListener(this._centerHandler);
|
|
173
|
+
this.rotationControlPoint.listeners.removeDragListener(this._rotationHandler);
|
|
174
|
+
this.startAngleControlPoint.listeners.removeDragListener(this._startAngleHandler);
|
|
175
|
+
this.endAngleControlPoint.listeners.removeDragListener(this._endAngleHandler);
|
|
59
176
|
}
|
|
60
177
|
}
|