Круговые аппроксимации с использованием кривых Безье - PullRequest
4 голосов
/ 23 июня 2010

У меня есть 2 вопроса о кривых Безье и их использовании для аппроксимации частей окружностей.

  1. Учитывая единицу дуги окружности (1,0) -> (cos (a),sin (a)) где 0

  2. Если у нас есть аффинное преобразование A, которое превращает дугу окружности в эллиптическую дугупреобразованные контрольные точки Ap0, Ap1, Ap2, Ap3 определяют хорошее приближение Безье к дуге эллипса?

p0 и p3, конечно, являются начальной и конечной точками кривой:(1,0) и (cos (a), sin (a)).

Спасибо

Ответы [ 2 ]

3 голосов
/ 08 апреля 2011

Вот общее решение для любой эллиптической дуги в виде кубической кривой Безье.

Ошибка в наибольшей степени зависит от разницы начального и конечного углов.Я добился хорошего успеха, ограничив разницу углов до 60 °.То есть я делаю отдельный кубический сегмент для каждых 60 ° (или их доли) и соединяю их в цепи.

1 голос
/ 23 июня 2010

Ваши вопросы в основном задают «это хорошие приближения для полукруга / дуги эллипса».

Возможно, вы захотите попытаться вычислить B_y(a) - sin(a) (конечно, параметризация ваших уравнений для обоих концов, заканчивающихся на (-1,0) при одном и том же значении a) для вашей кривой B(a), на графической утилите, например Wolfram Alpha , чтобы построить график и посмотреть, насколько велика разница, и соответствует ли она вашим целям.

Если вы хотите получить более точный и невизуальный ответ, вы можете рассчитать

Integral (from 0 to K) [B_y(a) - sin(a)]^2 da / 2

Где K - значение a, где обе параметризованные кривые заканчиваются на (-1,0).

Этот интеграл связан / пропорционален (в некоторой степени) некоторой мере стандартного отклонения и послужит хорошим численным анализом. Если это в пределах вашей желаемой точности, вы хороши.

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

Я также нашел хороший Анализ приближений полукруга-Безье , где автор находит довольно сексуальное приближение:

Bezier Semicircle

Автор:

xValueInset = Diameter * 0.05
yValueOffset = radius * 4.0 / 3.0

P0 = (0,0)
P1 = (xValueInset, yValueOffset)
P2 = (Diameter - xValueInset, yValueOffset)
P3 = (Diameter, 0)

Где P1 и P2 - ваши контрольные точки. Обратите внимание, что это приблизительно соответствует полукругу:

B(a) = [ (d/2)*cos(a)+d/2 , (d/2)*sin(a) ]
...