Самый оптимальный алгоритм построения прямых линий если API не подходит:
1. Не использовать корней.
2. Не использовать операции деления и если возможно минимизировать умножения.
3. Использовать imageData как Aetae говорит, когда надо
Год назад писал рендер толстых полилиний, используя api-заливку и метод lineTo, чтобы получить замкнутую трапецию, мне удалось обогнать api-шный рендер.
Сообщение от Gozar
|
Меня больше теперь интересует вопрос: как найти координаты всех точек между двух точек кривой Безье
|
Дед Мороз безьешку 3-го порядка принес:
Поиграться можно тут
http://learn.javascript.ru/play/qkbwbb
/* Кубическая кривая Безье */
function bezierCurveTo(p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y) {
/*
обычно хватает взять расстояние 2-х конечных точек для интерполяции кривой если точки соединяются отрезком,
если же кривая рисуется точками придется брать сумму расстояний всех точек. Но есть и аналитические решения с оптимизированным подходом
*/
var dist = distance(p1x, p1y, p2x, p2y),
step = 1 / dist;
_x = p1x,
_y = p1y;
for ( var t = 0; t < 1; t += step ) {
var a = (1-t) * (1-t) * (1-t),
b = 3 * t * (1-t) * (1-t),
c = 3 * t * t * (1-t),
d = t * t * t,
x = a * p1x + b * p2x + c * p3x + d * p4x,
y = a * p1y + b * p2y + c * p3y + d * p4y;
//здесь стоит использовать самую оптимальную фун-ю,
//например, оптимизированный вариант Брезенхема
drawLineTo(_x, _y, x, y, step);
_x = x;
_y = y;
}
}