2017-01-11 6 views
1

enter image description here Предположим, что у нас есть кривая Безье с началом p0 (0, 0) и концом p4 (100, 0). Прямо сейчас это будет в основном линия без кривой. Теперь предположим, что я хочу рассчитать две отсутствующие контрольные точки (p1 p2) на основе заданного угла. Каков наилучший способ достичь этого?Рассчитать контрольные точки кривой Безье с заданным углом

Давайте предположим, что я хотел что-то вроде этого:

https://1.bp.blogspot.com/_W3ZUYKgeEpk/SDcAerq1xkI/AAAAAAAAAAc/W9OnovkzgPI/s400/RectanglularControlPoly.jpg

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

+1

это математическая проблема. может быть опубликован на [stackexchange] (http://math.stackexchange.com) –

+0

какой у вас угол? можете ли вы указать угол между точками/линиями? 1 угол или 2? –

+0

@ S.Serp в основном позволяет сказать угол 45 градусов для обеих контрольных точек, так что всего один угол. – Asperger

ответ

1

Контролирует точки, проходящие через точку Безье с заданным углом, лежат на касательной с этим углом.

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

enter image description here

Чтобы найти контрольные точки с одинаково мягкие кривизны для двух точек Безье просто находят пересечение двух касательных! Используйте переход как общую контрольную точку для обоих сегментов, то есть C1 = C2.

Для любого рода симметричных кривых вы должны держать отклонение от пересечения симметрично, то есть 50%, 10% и т.д ..

Обратите внимание, что для оптимизации общей формы один также необходимо смотреть на соседних точках ; в целом предоставляемая функция GDI делает хорошую работу; поэтому стоит рассмотреть возможность добавления дополнительных точек Безье для управления фигурой; но, конечно, использование идеального набора контрольных точек является наиболее экономичным решением.

Обновление: Я добавил пример того, насколько хорошо круг (оранжевый) приближается к математике в this interesting post.

Краткая версия: точное решение на самом деле невозможно, но лучше всего подходит для четверть круга, чтобы переместить контрольную точку на ~ 0,55% от точки пересечения. (d=r*4*(sqrt(2)-1)/3). Иногда вместо того, чтобы использовать раствор 4 сегмента раствор 8 сегмент используется для еще более близкого приближения ..

private void button_Click(object sender, EventArgs e) 
{ 
    int w = Math.Abs(P2.Left - P1.Left); 
    int h = Math.Abs(P2.Top - P1.Top); 
    C2.Left = (int) (P2.Left + w * 0.5523f); 
    C2.Top = P2.Top; 
    C1.Left = P1.Left; 
    C1.Top = (int) (P1.Top + h * 0.5523f); 
    C1.Parent.Invalidate(); 
} 

Код использует Labels для точек и контрольных точек ..

Btw: Добавление эллипсов/круги a GraphicsPath создаст кривые Безье, которые, похоже, будут приближены точно так же.

+0

Что делать, если мне нужен идеальный круг? Или можно сказать, четверть круга. Как это рассчитать? Я имею в виду, что я действительно пытаюсь вычислить вещи так, чтобы обе контрольные точки были симметричными. в результате получается четная кривая (если можно так выразиться). – Asperger

+0

Я только что прочитал, что вы сказали: пересечение двух касательных. Интересно. Не могли бы вы рассказать об этом? Конечно, я могу это сделать, но, поскольку вы упомянули об этом, было бы здорово. – Asperger

+0

На четверть круга контрольная точка должна двигаться назад, примерно на полпути от пересечения тангенсов, иначе результат будет выглядеть направленным. Конечно, нормальный способ - использовать DrawArc для сегментов эллипса. Я не могу предоставить математику для точного решения atm, хотя ... Для любого вида симметричного решения вам нужно удержать отклонение от пересечения симметричным, т.е. 50%, 10% и т. Д. Обратите внимание, что для оптимизации общей формы нужно также смотреть на соседние точки; в целом предоставленная функция выполняет хорошую работу; поэтому стоит рассмотреть возможность добавления дополнительных точек Безье для контроля. – TaW

Смежные вопросы