Преобразование эллипса в полилинию

В настоящее время у меня есть несколько эллипсов. Они определяются центральной точкой, а затем двумя векторами, один указывает на минимальную ось, а другой — на максимальную ось.

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

У кого-нибудь есть идеи, как это сделать?

Благодарю.

2

Решение

(При условии, что оба вектора, которые представляют оси эллипса, параллельны координатным осям)

Если у вас есть радиальный луч, исходящий из центра эллипса под углом angleто этот луч пересекает эллипс в точке

x = x_half_axis * cos(angle);
y = y_half_axis * sin(angle);

где x_half_axis а также y_half_axis возраст только длины (величины) ваших векторов полуоси.

Итак, просто выберите достаточно малый угол наклона delta, Прокрутить вокруг своей центральной точки через весь [0...2*Pi] диапазон с этим шагом, начиная с 0 угол, то delta угол, то 2 * delta угол и тд. Для каждого angle Значение координат точки эллипса будет дано по приведенным выше формулам. Таким образом, вы сгенерируете полигональное представление эллипса.

Если твой delta является относительно большим (несколько точек на эллипсе), тогда его следует тщательно выбирать, чтобы убедиться, что ваш «эллиптический многоугольник» хорошо закрывается: 2*Pi следует разделить на целый ряд delta шаги. Пусть и для маленьких delta Ценности это не имеет большого значения.


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


Фиксированный дельта-угол имеет некоторые недостатки. Он генерирует более плотную последовательность многоугольных точек около минимальной оси эллипса (где кривизна меньше) и более редкую последовательность точек около максимальной оси (где кривизна больше). Это фактически противоположно желаемому поведению: лучше иметь более высокую плотность точек в областях более высокой кривизны.

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

5

Другие решения

Предполагая центр в (Xc,Yc) и оси векторов (Xm,Ym), (XM,YM) (эти два должны быть ортогональными), формула

X = XM cos(t) + Xm sin(t) + Xc
Y = YM cos(t) + Ym sin(t) + Yc

с t в [0,2Pi],

Чтобы получить эффективное распределение конечных точек на контуре, я рекомендую использовать рекурсивный критерий максимального отклонения: нарисовать дугу, соответствующую диапазону [t0,t2], попробуйте значение средней точки t1=(t0+t2)/2, Если соответствующие точки таковы, что расстояние P1 к линии P0P2 ниже постоянного порога (например, один пиксель), вы можете приблизить дугу по сегменту P0P1, В противном случае повторите операцию для дуг [t0,t1] а также [t1,t2],

Предзаказ рекурсии позволяет вам выдавать вершины полилинии в последовательности.

2

По вопросам рекламы [email protected]