Нарисуйте произвольную выпуклую форму, зная длину ее сторон
У меня есть список значений, которые являются длинами сторон произвольной выпуклой формы (многоугольник). Как я могу нарисовать эту форму? Какой алгоритм может помочь мне с этой задачей?
Например, у меня есть список: 2, 5, 2, 3. Рисунок должен выглядеть так:
2 ответа
Есть относительно простой (если немного тяжелый по математике) O(N log N) to O(N^2) (depending on implementation)
решение рекурсивной геометрии / тригонометрии.
- Концепция начинается с отрезка, длина которого равна сумме длин.
- Разбейте этот отрезок на треугольник (см. Соответствующую информацию внизу).
- Рекурсивно разбивайте каждый край треугольника на большее количество треугольников по мере необходимости.
Шаг 2, требует, чтобы два меньших края треугольника были длиннее, чем больший.
Шаг 3, можно сделать, превратив треугольник в 2 треугольника.
Для ввода и вывода я бы использовал: Input: список ребер Output: список внутренних углов.
Так output[a]
внутренний угол вершины либо до, после края в input[a]
,
Хорошая ссылка находится здесь.
- Метод #1 gif, показывает треугольники для этого множества вершин.
- Метод № 2 gif, P является примером того, где разрыв может произойти на шаге 2.
- Метод #4 gif, здесь P можно считать перенесенным, как в #3, обратите внимание, что в этом случае длины линий не будут масштабироваться и фактически будут неизвестны. Обратите внимание, что только позиции вершин
a1
а такжеa2
изменилось бы. В результате изменения внутренних углов вершин до и послеa1
а такжеa2
, В этом случае,a1,a2,a3,an,p
,
Что касается определения внутренних углов. Используйте тригонометрию и / или геометрию. Учитывая 3 стороны треугольника, можно определить, каковы углы. Учитывая 2 стороны и угол (или 1 угол и 2 стороны) можно определить недостающие стороны и углы.
Конечно, вам, возможно, придется быть осторожным относительно того, где вы сломаете край, чтобы можно было сформировать треугольник.
Я процитирую здесь ответ, который я разместил на MathOverflow:
Цепочка ребер может закрыться, если длина самого длинного ребра не превышает сумму длин всех остальных ребер.
В вашем примере самый длинный край равен 5, и он не длиннее 2+2+3=7. Если вы замените ребро длины 5 ребром длины 8, то четыре сегмента не смогут приблизиться к выпуклому многоугольнику. Когда у вас есть более 3 ребер, результирующий выпуклый многоугольник определяется не однозначно: его форма имеет гибкость.
См. Ссылки, приведенные выше для указателей на доказательства.