Показать сообщение отдельно
  #74 (permalink)  
Старый 27.12.2014, 11:43
Любитель
Отправить личное сообщение для JsLoveR Посмотреть профиль Найти все сообщения от JsLoveR
 
Регистрация: 16.12.2009
Сообщений: 422

Самый оптимальный алгоритм построения прямых линий если 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;
		}
	  }

Последний раз редактировалось JsLoveR, 27.12.2014 в 11:46.
Ответить с цитированием