Spaces:
Sleeping
Sleeping
File size: 3,372 Bytes
2b7aae2 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 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 144 145 146 147 | import { Vector2 } from '../../math/Vector2.js';
import { CurvePath } from './CurvePath.js';
import { EllipseCurve } from '../curves/EllipseCurve.js';
import { SplineCurve } from '../curves/SplineCurve.js';
import { CubicBezierCurve } from '../curves/CubicBezierCurve.js';
import { QuadraticBezierCurve } from '../curves/QuadraticBezierCurve.js';
import { LineCurve } from '../curves/LineCurve.js';
class Path extends CurvePath {
constructor(points) {
super();
this.type = 'Path';
this.currentPoint = new Vector2();
if (points) {
this.setFromPoints(points);
}
}
setFromPoints(points) {
this.moveTo(points[0].x, points[0].y);
for (let i = 1, l = points.length; i < l; i++) {
this.lineTo(points[i].x, points[i].y);
}
return this;
}
moveTo(x, y) {
this.currentPoint.set(x, y); // TODO consider referencing vectors instead of copying?
return this;
}
lineTo(x, y) {
const curve = new LineCurve(this.currentPoint.clone(), new Vector2(x, y));
this.curves.push(curve);
this.currentPoint.set(x, y);
return this;
}
quadraticCurveTo(aCPx, aCPy, aX, aY) {
const curve = new QuadraticBezierCurve(this.currentPoint.clone(), new Vector2(aCPx, aCPy), new Vector2(aX, aY));
this.curves.push(curve);
this.currentPoint.set(aX, aY);
return this;
}
bezierCurveTo(aCP1x, aCP1y, aCP2x, aCP2y, aX, aY) {
const curve = new CubicBezierCurve(this.currentPoint.clone(), new Vector2(aCP1x, aCP1y), new Vector2(aCP2x, aCP2y), new Vector2(aX, aY));
this.curves.push(curve);
this.currentPoint.set(aX, aY);
return this;
}
splineThru(pts /*Array of Vector*/) {
const npts = [this.currentPoint.clone()].concat(pts);
const curve = new SplineCurve(npts);
this.curves.push(curve);
this.currentPoint.copy(pts[pts.length - 1]);
return this;
}
arc(aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise) {
const x0 = this.currentPoint.x;
const y0 = this.currentPoint.y;
this.absarc(aX + x0, aY + y0, aRadius, aStartAngle, aEndAngle, aClockwise);
return this;
}
absarc(aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise) {
this.absellipse(aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise);
return this;
}
ellipse(aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation) {
const x0 = this.currentPoint.x;
const y0 = this.currentPoint.y;
this.absellipse(aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation);
return this;
}
absellipse(aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation) {
const curve = new EllipseCurve(aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation);
if (this.curves.length > 0) {
// if a previous curve is present, attempt to join
const firstPoint = curve.getPoint(0);
if (!firstPoint.equals(this.currentPoint)) {
this.lineTo(firstPoint.x, firstPoint.y);
}
}
this.curves.push(curve);
const lastPoint = curve.getPoint(1);
this.currentPoint.copy(lastPoint);
return this;
}
copy(source) {
super.copy(source);
this.currentPoint.copy(source.currentPoint);
return this;
}
toJSON() {
const data = super.toJSON();
data.currentPoint = this.currentPoint.toArray();
return data;
}
fromJSON(json) {
super.fromJSON(json);
this.currentPoint.fromArray(json.currentPoint);
return this;
}
}
export { Path };
|