Как это сделать. Вы можете получить левую половину или правую половину с помощью этой функции. Эта функция взята из-за отметки отсюда: https://stackoverflow.com/a/23452618/1828637
У меня есть модификация, поэтому она может быть приспособлена к элементарной ячейке, поэтому мы можем использовать ее для cubic-bezier
в css-переходах.
function splitCubicBezier(options) {
var z = options.z,
cz = z-1,
z2 = z*z,
cz2 = cz*cz,
z3 = z2*z,
cz3 = cz2*cz,
x = options.x,
y = options.y;
var left = [
x[0],
y[0],
z*x[1] - cz*x[0],
z*y[1] - cz*y[0],
z2*x[2] - 2*z*cz*x[1] + cz2*x[0],
z2*y[2] - 2*z*cz*y[1] + cz2*y[0],
z3*x[3] - 3*z2*cz*x[2] + 3*z*cz2*x[1] - cz3*x[0],
z3*y[3] - 3*z2*cz*y[2] + 3*z*cz2*y[1] - cz3*y[0]];
var right = [
z3*x[3] - 3*z2*cz*x[2] + 3*z*cz2*x[1] - cz3*x[0],
z3*y[3] - 3*z2*cz*y[2] + 3*z*cz2*y[1] - cz3*y[0],
z2*x[3] - 2*z*cz*x[2] + cz2*x[1],
z2*y[3] - 2*z*cz*y[2] + cz2*y[1],
z*x[3] - cz*x[2],
z*y[3] - cz*y[2],
x[3],
y[3]];
if (options.fitUnitSquare) {
return {
left: left.map(function(el, i) {
if (i % 2 == 0) {
//return el * (1/left[6])
var Xmin = left[0];
var Xmax = left[6]; //should be 1
var Sx = 1/(Xmax - Xmin);
return (el - Xmin) * Sx;
} else {
//return el * (1/left[7])
var Ymin = left[1];
var Ymax = left[7]; //should be 1
var Sy = 1/(Ymax - Ymin);
return (el - Ymin) * Sy;
}
}),
right: right.map(function(el, i) {
if (i % 2 == 0) {
//xval
var Xmin = right[0]; //should be 0
var Xmax = right[6];
var Sx = 1/(Xmax - Xmin);
return (el - Xmin) * Sx;
} else {
//yval
var Ymin = right[1]; //should be 0
var Ymax = right[7];
var Sy = 1/(Ymax - Ymin);
return (el - Ymin) * Sy;
}
})
}
} else {
return { left: left, right: right};
}
}
Это функция и теперь использовать ее с вашими параметрами.
var myBezier = {
xs: [188, 170, 350, 388],
ys: [130, 10, 10, 170]
};
var splitRes = splitCubicBezier({
z: .5, //percent
x: myBezier.xs,
y: myBezier.ys,
fitUnitSquare: false
});
Это дает
({
left: [188, 130, 179, 70, 219.5, 40, 267, 45],
right: [267, 45, 314.5, 50, 369, 90, 388, 170]
})
скрипку доказывающий свою половину, я выложил его на оригинал:
http://jsfiddle.net/K38kM/8/
Возможно ли это? Да. С Кастельжау? Да. Но КАК? ... [действуя таким образом] (http://www.helloflash.net/Fichiers/HTML/CATEGORIES/physique/physique1.htm#p12). Только говорить, что Кастельжау необходимо, не является достаточным ответом. Правильный и более сложный ответ: ** как использовать Casteljau ** ... – helloflash