interpolatePoint optionally returns Z and M values
This commit is contained in:
@@ -11,6 +11,7 @@ import {lerp} from '../../math.js';
|
|||||||
* @param {number} stride Stride.
|
* @param {number} stride Stride.
|
||||||
* @param {number} fraction Fraction.
|
* @param {number} fraction Fraction.
|
||||||
* @param {Array<number>=} opt_dest Destination.
|
* @param {Array<number>=} opt_dest Destination.
|
||||||
|
* @param {number=} opt_dimension Destination dimension (default is `2`)
|
||||||
* @return {Array<number>} Destination.
|
* @return {Array<number>} Destination.
|
||||||
*/
|
*/
|
||||||
export function interpolatePoint(
|
export function interpolatePoint(
|
||||||
@@ -19,21 +20,16 @@ export function interpolatePoint(
|
|||||||
end,
|
end,
|
||||||
stride,
|
stride,
|
||||||
fraction,
|
fraction,
|
||||||
opt_dest
|
opt_dest,
|
||||||
|
opt_dimension
|
||||||
) {
|
) {
|
||||||
let pointX = NaN;
|
let o, t;
|
||||||
let pointY = NaN;
|
|
||||||
const n = (end - offset) / stride;
|
const n = (end - offset) / stride;
|
||||||
if (n === 1) {
|
if (n === 1) {
|
||||||
pointX = flatCoordinates[offset];
|
o = offset;
|
||||||
pointY = flatCoordinates[offset + 1];
|
} else if (n === 2) {
|
||||||
} else if (n == 2) {
|
o = offset;
|
||||||
pointX =
|
t = fraction;
|
||||||
(1 - fraction) * flatCoordinates[offset] +
|
|
||||||
fraction * flatCoordinates[offset + stride];
|
|
||||||
pointY =
|
|
||||||
(1 - fraction) * flatCoordinates[offset + 1] +
|
|
||||||
fraction * flatCoordinates[offset + stride + 1];
|
|
||||||
} else if (n !== 0) {
|
} else if (n !== 0) {
|
||||||
let x1 = flatCoordinates[offset];
|
let x1 = flatCoordinates[offset];
|
||||||
let y1 = flatCoordinates[offset + 1];
|
let y1 = flatCoordinates[offset + 1];
|
||||||
@@ -50,24 +46,25 @@ export function interpolatePoint(
|
|||||||
const target = fraction * length;
|
const target = fraction * length;
|
||||||
const index = binarySearch(cumulativeLengths, target);
|
const index = binarySearch(cumulativeLengths, target);
|
||||||
if (index < 0) {
|
if (index < 0) {
|
||||||
const t =
|
t =
|
||||||
(target - cumulativeLengths[-index - 2]) /
|
(target - cumulativeLengths[-index - 2]) /
|
||||||
(cumulativeLengths[-index - 1] - cumulativeLengths[-index - 2]);
|
(cumulativeLengths[-index - 1] - cumulativeLengths[-index - 2]);
|
||||||
const o = offset + (-index - 2) * stride;
|
o = offset + (-index - 2) * stride;
|
||||||
pointX = lerp(flatCoordinates[o], flatCoordinates[o + stride], t);
|
|
||||||
pointY = lerp(flatCoordinates[o + 1], flatCoordinates[o + stride + 1], t);
|
|
||||||
} else {
|
} else {
|
||||||
pointX = flatCoordinates[offset + index * stride];
|
o = offset + index * stride;
|
||||||
pointY = flatCoordinates[offset + index * stride + 1];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (opt_dest) {
|
const dimension = opt_dimension > 1 ? opt_dimension : 2;
|
||||||
opt_dest[0] = pointX;
|
const dest = opt_dest ? opt_dest : new Array(dimension);
|
||||||
opt_dest[1] = pointY;
|
for (let i = 0; i < dimension; ++i) {
|
||||||
return opt_dest;
|
dest[i] =
|
||||||
} else {
|
o === undefined
|
||||||
return [pointX, pointY];
|
? NaN
|
||||||
|
: t === undefined
|
||||||
|
? flatCoordinates[o + i]
|
||||||
|
: lerp(flatCoordinates[o + i], flatCoordinates[o + stride + i], t);
|
||||||
}
|
}
|
||||||
|
return dest;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user