Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Когда на третьем курсе был придуман этот алгоритм, слово «интерполяция» вселяло в меня ужас, а гугление по запросу «сглаживание графиков» не давало посильных пониманию результатов. Но как-то я дошел до кривых Безье и уж очень они мне понравились. Рисует быстро, алгоритм интуитивно понятный… Что еще надо для счастья.
function drawByCurves(ctx, points) {
ctx.beginPath();
ctx.setLineDash([]);
ctx.moveTo(points[0].x, points[0].y);
var dl = 0;
for (var i = 0; i < points.length - 2; i++) {
var dr = (points[i+2].y - points[i].y) / 2;
var a3 = dl + dr + 2 * (points[i].y - points[i+1].y);
var a2 = points[i+1].y - a3 - dl - points[i].y;
for (var t = 0; t <= 1; t+=.05) {
var y = a3; y = y*t+a2; y = y*t+dl; y = y*t+points[i].y;
ctx.lineTo(points[i].x + t * 50, y);
}
dl = dr;
}
ctx.strokeStyle = 'blue';
ctx.stroke();
}

function drawByCurves(ctx, points) {
ctx.beginPath();
ctx.setLineDash([]);
ctx.moveTo(points[0].x, points[0].y);
var dl = 0, k = 0.33;
for (var i = 0; i < points.length - 2; i++) {
var dr = (points[i+2].y - points[i].y) / 2 * k;
ctx.bezierCurveTo(
points[i].x+k*30, points[i].y+dl,
points[i+1].x-k*30, points[i+1].y-dr,
points[i+1].x, points[i+1].y);
dl = dr;
}
ctx.strokeStyle = 'blue';
ctx.stroke();
}


Очень интересный алгоритм. Но мне надо было неравномерный наг. Я провел небольшое исследование, упростил вывод коэффициента k (тригонометрия вообще не нужна). Сразу написать коммент не мог, т.к. не было доступа. Написал сюда после опубликования этой же статьи во 2-ой версии, после принятия которой появилось разрешение писать комменты.
Интерполяция: рисуем плавные графики с помощью кривых Безье