Контролирует точки, проходящие через точку Безье с заданным углом, лежат на касательной с этим углом.
Полученный изгиб будет мягче, чем дальше контрольная точка выбрана, так что существует множество различных решений с тем же углом и различной кривизной ..
Чтобы найти контрольные точки с одинаково мягкие кривизны для двух точек Безье просто находят пересечение двух касательных! Используйте переход как общую контрольную точку для обоих сегментов, то есть 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
создаст кривые Безье, которые, похоже, будут приближены точно так же.
это математическая проблема. может быть опубликован на [stackexchange] (http://math.stackexchange.com) –
какой у вас угол? можете ли вы указать угол между точками/линиями? 1 угол или 2? –
@ S.Serp в основном позволяет сказать угол 45 градусов для обеих контрольных точек, так что всего один угол. – Asperger