Как нарисовать кривую Безье, не зная ее контрольных точек, но четыре точки на кривой? - PullRequest
0 голосов
/ 28 декабря 2018

Я занимаюсь разработкой приложения для графического редактора.У него есть инструмент Безье.Я хочу реализовать его аналогично элементу управления Безье в приложении Paint.NET, где две ручки кривой (в дополнение к конечным точкам) размещены на самой кривой , с помощью которой пользователь может контролироватькривизны.Размещение этих маркеров на кривой дает графическому графу лучшее понимание и ощущение, как показано на следующем рисунке: enter image description here

Но моя проблема в том, что метод DrawBezier в .NET, получает две контрольные точки , которые не всегда размещаются на кривой.Знаете ли вы, как я могу использовать координаты этих двух кривых маркеров , чтобы нарисовать Безье?

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

Мы можем использовать стандартную аппроксимацию полиномиальной кривой, чтобы найти одну кубическую кривую Безье через любой набор из четырех точек, но у вас всегда останется проблема со свободными параметрами: две из этих точек будут началом иконец кривой, поэтому мы знаем, что их значения времени равны 0 и 1, но эти две точки полностью свободны с точки зрения значения времени, и поэтому вам придется прийти к разумному предположению о том, какими они должны быть доВы можете оценить свою кривую.

См. https://pomax.github.io/bezierinfo/#curvefitting для математики, если вы хотите реализовать это самостоятельно, или найти библиотеку, которая выполняет полиномиальную подборку (что означает любой полу-приличный пакет статистики),и затем для значений времени у вас есть несколько вариантов:

  • Предположим, что точки совпадают с t = 0, t = 1/3, t = 2/3 и t = 1.Это почти всегда плохая идея, потому что точки редко располагаются равномерно по отношению к кубическому распределению.
  • Угадайте значения t на основе линейного расстояния с полной длиной набора ломаных p0-p1-p2-p31, а значение в каждой точке просто равно расстоянию вдоль ломаной линии, поэтому t0 = 0, t1 = dist (p0, p1), t2 = dist (p0, p1) + dist (p1,2), t3 =1.
  • Добейтесь большего и выберите начальный набор значений t, затем проанализируйте полученный Безье и итеративно сгенерируйте новые кривые, оптимизируя некоторые качества, такие как однородность кривизны, ограничивающая область коробки / корпуса, выравнивание p1 / p2 по минимумурадиус и т. д.

Из них, очевидно, 2 даст «разумные» результаты с наименьшими усилиями, но если вы пишете графическое приложение, «разумное» зависит от того, что выпользователям нужно, а не то, что легко для вас.

0 голосов
/ 28 декабря 2018

Метод DrawCurve класса Graphics выполняет свою работу.То есть вместо использования кривых Безье вы должны использовать Canonical Spline.

Я нашел это в книге Charles Petzold (Программирование Windows с C #):

"Канонический сплайн. Класс Graphic включает второй тип сплайна, называемый каноническим сплайном, что означает стандартный или нормальный сплайн ..."

...