plotboilerplate
Version:
A simple javascript plotting boilerplate for 2d stuff.
116 lines (103 loc) • 4.26 kB
text/typescript
/**
* A helper for VEllipses.
*
* @author Ikaros Kappler
* @date 2025-03-31
* @modified 2025-04-02 Adding `VEllipseHelper.drawHandleLines()`.
* @modified 2025-04-09 Adding `VEllipseHelper.destroy()`.
* @modified 2025-05-05 Fixed a typo in the `VEllipseHelper.destroy` method (was named `detroy`).
* @modified 2025-05-05 `VEllipseHelper` is now implementing `IShapeInteractionHelper`.
* @version 1.0.1
*/
import { Line } from "../../Line";
import { VEllipse } from "../../VEllipse";
import { Vertex } from "../../Vertex";
import { VertEvent, VertListener } from "../../VertexListeners";
import { DrawLib, IShapeInteractionHelper } from "../../interfaces";
export class VEllipseHelper implements IShapeInteractionHelper {
private readonly ellipse: VEllipse;
private readonly rotationControlPoint: Vertex;
private _rotationControlLine: Line;
private _centerPointHandler: VertListener;
private _rotationPointHandler: VertListener;
constructor(ellipse: VEllipse, rotationControlPoint: Vertex) {
this.ellipse = ellipse;
this.rotationControlPoint = rotationControlPoint;
// const rotationControlLine: Line = new Line(ellipse.center, rotationControlPoint);
this._rotationControlLine = new Line(ellipse.center, rotationControlPoint);
// +---------------------------------------------------------------------
// | Listen for the center to be moved.
// +-------------------------------------------
// ellipse.center.listeners.addDragListener((event: VertEvent) => {
// rotationControlPoint.add(event.params.dragAmount);
// });
ellipse.center.listeners.addDragListener((this._centerPointHandler = this._handleDragCenterPoint()));
// +---------------------------------------------------------------------
// | Listen for rotation changes.
// +-------------------------------------------
// rotationControlPoint.listeners.addDragListener((_event: VertEvent) => {
// var newRotation = rotationControlLine.angle();
// var rDiff = newRotation - ellipse.rotation;
// ellipse.rotation = newRotation;
// ellipse.axis.rotate(rDiff, ellipse.center);
// });
rotationControlPoint.listeners.addDragListener((this._rotationPointHandler = this._handleRotationCenterPoint()));
}
private _handleDragCenterPoint(): VertListener {
const _self = this;
return (event: VertEvent) => {
_self.rotationControlPoint.add(event.params.dragAmount);
};
}
private _handleRotationCenterPoint(): VertListener {
const _self = this;
return (_event: VertEvent) => {
var newRotation = _self._rotationControlLine.angle();
var rDiff = newRotation - _self.ellipse.rotation;
_self.ellipse.rotation = newRotation;
_self.ellipse.axis.rotate(rDiff, _self.ellipse.center);
};
}
/**
* Draw grey handle lines.
*
* @param {DrawLib<any>} draw - The draw library instance to use.
* @param {DrawLib<any>} fill - The fill library instance to use.
*/
drawHandleLines(draw: DrawLib<any>, fill: DrawLib<any>) {
// Draw rotation handle line
draw.line(this.ellipse.center, this.rotationControlPoint, "rgba(192,64,128,0.333)", 1.0, {
dashOffset: 0.0,
dashArray: [4, 2]
});
// Draw helper box
draw.setCurrentId(`${this.ellipse.uid}_e0`);
draw.setCurrentClassName(`${this.ellipse.className}-v-line`);
draw.line(
this.ellipse.center.clone().add(0, this.ellipse.signedRadiusV()).rotate(this.ellipse.rotation, this.ellipse.center),
this.ellipse.axis,
"rgba(64,128,192,0.333)",
1.0,
{
dashOffset: 0.0,
dashArray: [4, 2]
}
);
draw.setCurrentId(`${this.ellipse.uid}_e1`);
draw.setCurrentClassName(`${this.ellipse.className}-h-line`);
draw.line(
this.ellipse.center.clone().add(this.ellipse.signedRadiusH(), 0).rotate(this.ellipse.rotation, this.ellipse.center),
this.ellipse.axis,
"rgba(64,128,192,0.333)",
1.0,
{
dashOffset: 0.0,
dashArray: [4, 2]
}
);
}
destroy(): void {
this.ellipse.center.listeners.removeDragListener(this._centerPointHandler);
this.rotationControlPoint.listeners.removeDragListener(this._rotationPointHandler);
}
}