function scalarMult(v, s) {
return v.map(function(x) {return x * s;});
function vectorAdd(a, b) {
for (var i = 0; i < a.length; i++) {
return vectorAdd(scalarMult(p1, (1 - t)), scalarMult(p2, t));
return vectorAdd(vectorAdd(scalarMult(p0, Math.pow((1 - t), 2)), scalarMult(p1, 2 * t * (1 - t))), scalarMult(p2, Math.pow(t, 2)));
return vectorAdd(vectorAdd(scalarMult(p0, Math.pow((1 - t), 1.5)), scalarMult(p1, 2 * t *(1 - t))), scalarMult(p2, Math.pow(t, 1.5)));
function bezier_mod2(t) {
return vectorAdd(vectorAdd(scalarMult(p0, Math.pow((1 - t), 2)), scalarMult(p1, 2 * t *(1 - t))), scalarMult(p2, Math.pow(t, 1.5)));
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.fillStyle = "#000000";
ctx.fillRect(p0[0]-2, p0[1]-2, 5, 5);
ctx.fillRect(p1[0]-2, p1[1]-2, 5, 5);
ctx.fillRect(p2[0]-2, p2[1]-2, 5, 5);
ctx.fillStyle = "#424242";
ctx.arc(m[0], m[1], 3, 0, 2*Math.PI);
for (var i = 0; i < m_path.length; i++) {
ctx.fillRect(m_path[i][0], m_path[i][1], 1, 1);
if (red_checkbox.checked) {
ctx.fillStyle = "#AA0000";
ctx.arc(p[0], p[1], 3, 0, 2*Math.PI);
if (trace_checkbox.checked) {
for (var i = 0; i < p_path.length; i++) {
ctx.fillRect(p_path[i][0], p_path[i][1], 1, 1);
if (green_checkbox.checked) {
ctx.fillStyle = "#00AA00";
ctx.arc(q[0], q[1], 3, 0, 2*Math.PI);
if (trace_checkbox.checked) {
for (var i = 0; i < q_path.length; i++) {
ctx.fillRect(q_path[i][0], q_path[i][1], 1, 1);
if (blue_checkbox.checked) {
ctx.fillStyle = "#0000AA";
ctx.arc(r[0], r[1], 3, 0, 2*Math.PI);
if (trace_checkbox.checked) {
for (var i = 0; i < r_path.length; i++) {
ctx.fillRect(r_path[i][0], r_path[i][1], 1, 1);
log.innerHTML = "t = " + Math.round(t*100)/100;
ctx.clearRect(0, 0, canvas.width, canvas.height);
var speed = document.getElementById('speed').value;
timer = setInterval(function(){t += 0.01;}, 100/speed);
timer2 = setInterval(function(){loop();}, 100/speed);
log = document.getElementById("log");
red_checkbox = document.getElementById("red");
green_checkbox = document.getElementById("green");
blue_checkbox = document.getElementById("blue");
trace_checkbox = document.getElementById("trace");
canvas = document.getElementById('canvas');
ctx = canvas.getContext('2d');