Как рассчитать кривую Безье только с начальной и конечной точками?

StackOverflow https://stackoverflow.com/questions/4034013

  •  26-09-2019
  •  | 
  •  

Вопрос

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

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

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

Помощь или направление будут оценены по достоинству.

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

Ниже приведен код, показывает, как рассчитать точки кривой Bezier при любом заданном значение 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);

Была предыдущая статья, предоставленная Carlos Femmer, которая помогает вычислению угла между 2 баллами. http://www.carlosfemmer.com/post/2006/02/calculcula-angle-betweenween-2-points-using-c.aspx..

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

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

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

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

Если начальная точка 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).

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top