2014-10-15 2 views
2

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

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

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

Спасибо.

+0

Это называется тесселяция. Поищи это. Вы хотите тесселировать кривую. Самый простой способ - начать с параметрического представления кривой. Посмотрите это тоже. –

+0

Вы должны определить требования к этим полилиниям – MBo

+0

Это называется уплощением кривой. –

ответ

5

(В предположении, что оба вектора, которые представляют собой эллипс оси parllel осям координат)

Если у вас есть радиальный луч, выходящий из центра многоточия под углом 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 это не имеет значения.


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


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

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

+0

Отлично, я дам ему уйти, спасибо! Просто быстрый вопрос, для half_axis вы упоминаете, что это длина векторов с половинной осью, что вы подразумеваете под этим? Это взято с основной или вспомогательной оси? – djcmm476

+0

@ djcmm476 это величина ваших двух векторов. Вышеуказанное будет «нарисовать» ваш элипсоид в начале, выровненном в двух точках. Применение матрицы поворота и матрицы перевода к его результатам даст вам правильные значения, и вы увидите, что компоненты матрицы выпадают. – IdeaHat

2

Предполагая, что центр в (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].

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

+0

Определенно лучший ответ, чем мой. Я боялся, что смешивание поворотов и переходных преобразований в формулу будет слишком усложнять его, но в этом случае он действительно играет очень хорошо. – AnT

+0

@AndreyT: yep, если векторы оси известны, они включают матрицу вращения. –

 Смежные вопросы

  • Нет связанных вопросов^_^