Эй, я заставил его работать, изменив код на следующий:
var canvas = document.getElementById("canvas");
var c = canvas.getContext("2d");
// Bezier eq. code
coord = function(x, y) {
if (!x) {
x = 0;
}
if (!y) {
y = 0;
}
return {
x: x,
y: y
};
};
B1 = function(t) {
return (t * t * t);
};
B2 = function(t) {
return (3 * t * t * (1 - t));
};
B3 = function(t) {
return (3 * t * (1 - t) * (1 - t));
};
B4 = function(t) {
return ((1 - t) * (1 - t) * (1 - t));
};
function getBezier(t, C1, C2, C3, C4) {
var pos = new coord();
pos.x = C1.x * B1(t) + C2.x * B2(t) + C3.x * B3(t) + C4.x * B4(t);
pos.y = C1.y * B1(t) + C2.y * B2(t) + C3.y * B3(t) + C4.y * B4(t);
return pos;
}
//Ctrl points.
P1 = coord(12, 12);
P2 = coord(90, 1);
P3 = coord(0, 190);
P4 = coord(150, 150);
t = 0;
var drawbez = function() {
var interval;
if (t === 0) {
interval = setInterval(drawbez, 1);
}
var curpos = getBezier(t, P1, P2, P3, P4); // Staðan í ferlinum
if (t > 1) {
if (interval) {
clearInterval(interval);
}
return;
}
//c.moveTo(curpos.x, curpos.y);
c.lineTo(curpos.x + t, curpos.y + t);
c.stroke();
t = t + 0.01;
};
drawbez();
Пожалуйста, посмотрите эту скрипку для рабочего примера.
По сути, t2
никогда не объявлялся, interval
находился вне области видимости, ссылка setTimeout()
на drawbez
, казалось, находилась вне области видимости (возможно, потому что вы указали имя строковой функции, а не прямую ссылку на объект ) и удаление .moveTo()
, как упомянуто в ответе Джона Грина, дало гораздо более плавную строку.