Общая формула для генерации кубической кривой Безье по эллиптической дуге? - PullRequest
3 голосов
/ 28 июля 2010

Как я могу реализовать в C простой способ генерирования 2 недостающих контрольных точек для эллиптической дуги с учетом начальной и конечной точек?Мне не нужна причудливая оценка ошибок, просто то, что может взять точки A и D и сгенерировать контрольные точки B и C для эллиптической дуги, где я могу затем использовать алгоритм интерполяции кубического Безье для генерации кривой.

что-то вроде

void GetArcControlPoints(Point a, Point &b, Point &c, Point d)
{

.....
b = ...
c = ....
}

Спасибо

Ответы [ 3 ]

4 голосов
/ 28 июля 2010

Есть некоторые недостатки в математике за вашим вопросом:

  1. Кривые Безье являются полиномиальными функциями параметра t в единичном интервале [0; 1].Эллипсы определяются с использованием тригонометрических функций, которые являются трансцендентными, то есть не алгебраическими, а следовательно, не полиномиальными.Вы не можете создать эллиптическую дугу, используя кривые Безье (ни кубические, ни какой-либо степени n).Но давайте предположим, что вы просто хотите приблизить дугу эллипса.Поскольку вы не указали, насколько хорошим должно быть приближение, нет способа гарантировать, что кривая Безье будет «достаточно эллиптической» для вас.Вкратце: вам нужен параметр ошибки.

  2. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 1009Таким образом, две точки дают недостаточно информации для указания эллипса, дуга которого затем может быть аппроксимирована с использованием кривой Безье. Что еще хуже, поскольку вы хотите, чтобы дуга эллипса, а не весь эллипс, вы также должны указать, какая часть эллипса должна быть «покрыта» дугой, в процентах (100% = весь эллипс), радианы (2 * pi = весь эллипс), что угодно. Короче говоря: вам нужно еще больше (входных) параметров, просто чтобы указать одну дугу одного эллипса.

Пока математика не сделана правильно, вы не можете перейти к следующему шагу (кодирование).


РЕДАКТИРОВАТЬ:

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

  2. Вы можете рассматривать эллипс как кругэто было "растянуто" на одном из измерений.Теперь, поскольку преобразования «растяжение» являются линейными, а функции Безье линейными на контрольных точках, вы можете рассчитать контрольные точки для кривой Безье, приближающейся к дуге окружности 90 градусов, затем применить преобразование «растяжение» к контрольным точкам, и вуаля.Вы получаете контрольные точки для кривой Безье, аппроксимирующей дугу эллипса "90 градусов".Получение всего эллипса - это просто повторение процедуры четыре раза.

1 голос
/ 28 июля 2010

Вот деривация для контрольных точек сегмента единичного круга:

http://www.whizkidtech.redprince.net/bezier/circle/kappa/

Каждый возможный эллипс можно сгенерировать, применив соответствующее аффинное преобразование.

0 голосов
/ 16 марта 2016

Формула каппа является лишь приблизительным. Это хорошее приближение для рисования круга или эллипса с 4 кубическими Безье: оно точно соответствует 8 точкам (те, что на двух осях и на двух главных диагоналах, единственные точки, рассматриваемые в формуле Каппа), но есть различия везде.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...