getPoint method
dynamic
getPoint(
- num t, [
- dynamic optionalTarget
])
override
Implementation
@override
getPoint(t, [optionalTarget]) {
var point = optionalTarget ?? Vector3.init();
var points = this.points;
var l = points.length;
var p = (l - (closed ? 0 : 1)) * t;
var intPoint = Math.floor(p);
var weight = p - intPoint;
if (closed) {
intPoint += intPoint > 0 ? 0 : (Math.floor(Math.abs(intPoint) / l) + 1) * l;
} else if (weight == 0 && intPoint == l - 1) {
intPoint = l - 2;
weight = 1;
}
var p0, p3; // 4 points (p1 & p2 defined below)
if (closed || intPoint > 0) {
p0 = points[(intPoint - 1) % l];
} else {
// extrapolate first point
tmp.subVectors(points[0], points[1]).add(points[0]);
p0 = tmp;
}
var p1 = points[intPoint % l];
var p2 = points[(intPoint + 1) % l];
if (closed || intPoint + 2 < l) {
p3 = points[(intPoint + 2) % l];
} else {
// extrapolate last point
tmp.subVectors(points[l - 1], points[l - 2]).add(points[l - 1]);
p3 = tmp;
}
if (curveType == 'centripetal' || curveType == 'chordal') {
// init Centripetal / Chordal Catmull-Rom
var pow = curveType == 'chordal' ? 0.5 : 0.25;
var dt0 = Math.pow(p0.distanceToSquared(p1), pow);
var dt1 = Math.pow(p1.distanceToSquared(p2), pow);
var dt2 = Math.pow(p2.distanceToSquared(p3), pow);
// safety check for repeated points
if (dt1 < 1e-4) dt1 = 1.0;
if (dt0 < 1e-4) dt0 = dt1;
if (dt2 < 1e-4) dt2 = dt1;
px.initNonuniformCatmullRom(p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2);
py.initNonuniformCatmullRom(p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2);
pz.initNonuniformCatmullRom(p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2);
} else if (curveType == 'catmullrom') {
px.initCatmullRom(p0.x, p1.x, p2.x, p3.x, tension);
py.initCatmullRom(p0.y, p1.y, p2.y, p3.y, tension);
pz.initCatmullRom(p0.z, p1.z, p2.z, p3.z, tension);
}
point.set(px.calc(weight), py.calc(weight), pz.calc(weight));
return point;
}