starry / backend /libs /three /extras /curves /SplineCurve.js
k-l-lambda's picture
feat: add Python ML services (CPU mode) with model download
2b7aae2
import { Curve } from '../core/Curve.js';
import { CatmullRom } from '../core/Interpolations.js';
import { Vector2 } from '../../math/Vector2.js';
class SplineCurve extends Curve {
constructor(points = []) {
super();
this.type = 'SplineCurve';
this.points = points;
}
getPoint(t, optionalTarget = new Vector2()) {
const point = optionalTarget;
const points = this.points;
const p = (points.length - 1) * t;
const intPoint = Math.floor(p);
const weight = p - intPoint;
const p0 = points[intPoint === 0 ? intPoint : intPoint - 1];
const p1 = points[intPoint];
const p2 = points[intPoint > points.length - 2 ? points.length - 1 : intPoint + 1];
const p3 = points[intPoint > points.length - 3 ? points.length - 1 : intPoint + 2];
point.set(CatmullRom(weight, p0.x, p1.x, p2.x, p3.x), CatmullRom(weight, p0.y, p1.y, p2.y, p3.y));
return point;
}
copy(source) {
super.copy(source);
this.points = [];
for (let i = 0, l = source.points.length; i < l; i++) {
const point = source.points[i];
this.points.push(point.clone());
}
return this;
}
toJSON() {
const data = super.toJSON();
data.points = [];
for (let i = 0, l = this.points.length; i < l; i++) {
const point = this.points[i];
data.points.push(point.toArray());
}
return data;
}
fromJSON(json) {
super.fromJSON(json);
this.points = [];
for (let i = 0, l = json.points.length; i < l; i++) {
const point = json.points[i];
this.points.push(new Vector2().fromArray(point));
}
return this;
}
}
SplineCurve.prototype.isSplineCurve = true;
export { SplineCurve };