Как рассчитать кривую Безье только с начальной и конечной точками? - PullRequest
1 голос
/ 27 октября 2010

Я первоначально разместил гораздо более простой (и менее полезный) вопрос и отредактировал его, чтобы он был более конкретным.переверните его, где он начнет двигаться дальше к месту назначения и «вверх» (на этом рисунке), а затем дуги более прямо к конечной точке.Тем не менее, у меня есть доступ только к начальной и конечной точкам, и я надеюсь определить другие точки, указав «высоту» (или ширину, как вы хотите это называть), чтобы определить, насколько высокодуга на самом деле идет.http://en.wikipedia.org/wiki/File:Bezier_3_big.png (не может опубликовать изображение из-за низкого повторения)

Я хотел бы иметь возможность вызывать функцию с начальной и конечной точками и высотой, чтобы она возвращала все точкивдоль пути кривой.

Помощь или направление приветствуются.

Ответы [ 5 ]

2 голосов
/ 22 мая 2011

Я завернул блог для расчета угла кривой Безье и определения его различных точек в моем блоге http://johnexalt.wordpress.com/2011/05/21/bezier-curve-angle-calculation-silverlight/

код ниже показывает, как рассчитать точки кривой Безье при любом заданном значении t (где t находится в диапазоне от 0 до 100% и представлено в виде 0-1.

x = ((1 - t) * (1 - t) * p0.X) + (2 * t * (1 -t) * p1.X) + (t * t * p2.X); // этот оператор используется для определения координаты x кривой.

y = ((1 - t) * (1 - t) * p0.Y) + (2 * t * (1 - t) * p1.Y) + (t * t * p2.Y);
//this statement is used to determine the y coordinate of the curve. 

x = Math.Round(x, 3);
y = Math.Round(y, 3);
angle = Math.Round(Angle(xold, yold, x, y), 3);

Ранее Карлос опубликовал предыдущую статьюFemmer, который помогает в расчете угла между 2 точками. http://www.carlosfemmer.com/post/2006/02/Calculate-Angle-between-2-points-using-C.aspx.

1 голос
/ 27 октября 2010

Без потери общности предположим, что конечная точка находится на оси x, а начальная точка находится выше и слева от конечной точки.

Представьте, что начальная точка находится на вершине утеса, а конечная точка - на дне утеса. Представьте, что вы бросаете мяч горизонтально от начальной точки, так что гравитация будет тянуть его вниз, чтобы он точно ударил в конечную точку.

Эта кривая, кажется, имеет свойства, которые вы хотите. Он начинается неглубоко, а затем увеличивается по направлению к вертикали по мере ускорения мяча.

Изменяя угол, под которым вы сначала бросаете мяч, вы можете сделать кривую более мелкой в ​​начале. Изменяя силу тяжести, вы можете сделать ее более крутой в конце.

Эта кривая соответствует вашим потребностям? Нахождение этой кривой - довольно простая физическая проблема.

1 голос
/ 27 октября 2010

Кажется, в .NET есть механизм, который может вам помочь: Graphics.DrawCurve

Рисует кардинальный сплайн через указанный массив структур Point

Кроме того, быстрый поиск в Google нашел эти

0 голосов
/ 27 октября 2010

В основном вам нужна кривая Безье с тремя контрольными точками - начальной точкой, конечной точкой и другой точкой где-то посередине.

Если начальная точка 1 равна ( x1, y1 ), а конечная точка 2 равна ( x2, y2 ), то вектор из точки 1 в точку 2 равен ( dx = x2-x1, dy = y2-y1 ).

Точка вдоль линии на величину along между нулем и единицей равна ( x1 + along * dx, y1 + along * dy ).

Вектор ( -dy, dx ) расположен под прямым углом к ​​линии, поэтому, если вы хотите выйти из линии на величину above, тогда средняя точка будет ( x1 + along * dx - above * dy, y1 + along * dy + above * dx).

Изменяйте значения вдоль и вверх, пока не найдете нужный вам вид кривой.

0 голосов
/ 27 октября 2010

Помимо начальной и конечной точек, вам необходимо описать «угол» или кривизну дуги.Кривая Безье может быть хорошей, но они обычно реализуются с более длинными последовательностями точек (поскольку кривизна дуги определяется другими точками на линии).Посмотрите на http://en.wikipedia.org/wiki/B%C3%A9zier_curve, внизу вы можете найти информацию о «квадратичных кривых».Бьюсь об заклад, быстрый поиск в Google даст вам несколько примеров реализации.

...