Как создать аппроксимацию 2-й дуги с отрезками?

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

Так как мои функции выдавливания поддерживают только прямые полигоны, мне нужно аппроксимировать дуги, используя отрезки.

Дуги определяются через начальную точку, центральную точку и угол развертки (CCW).

Углы развертки мне нужно отображать в диапазоне от <10° до 179,9° с радиусами от 0,3 до 300 мм.

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

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

1 ответ

Решение

Если дуга имеет угол разворота a, радиус r, то наибольшее расстояние между хордой с одинаковыми конечными точками и дугой составляет r*(1-cos(a/2). Если вы разделите эту дугу, поместив n одинаково разнесенных точек вдоль это, тогда максимальное расстояние между дугой и сегментированной линией будет r*(1-cos(a/(2*(n+1)))).

Так, если вы хотите сохранить наибольшее расстояние ниже E, скажем, тогда вы можете поместить n новых точек вдоль дуги, причем n выбрано так, чтобы n+1 >= a/(2*acos(1 - E/r))

Другие вопросы по тегам