Каждая линия должна разделить плоскость на «insid e "и" outline "; вы можете найти это, используя обычный метод внутреннего продукта.
Перемещение всех линий наружу на некоторое расстояние.
Рассмотрите все пары соседних линий (линии, а не отрезки), найдите пересечение. Это новая вершина.
Очистите новую вершину, удалив любые пересекающиеся части. - у нас есть несколько случая здесь
(а) Случай 1:
0--7 4--3
| | | |
| 6--5 |
| |
1--------2
если вы расходуете его на один, вы получили это:
0----a----3
| | |
| | |
| b |
| |
| |
1---------2
7 и 4 перекрываются .. если вы видите это, вы удаляете эту точку и все точки между ними.
(б) Случай 2
0--7 4--3
| | | |
| 6--5 |
| |
1--------2
если вы расходуете его на два, вы получили это:
0----47----3
| || |
| || |
| || |
| 56 |
| |
| |
| |
1----------2
, чтобы решить эту проблему, для каждого сегмента линии, вы должны проверить, если это перекрываются с последними сегментами.
(с) случай 3
4--3
0--X9 | |
| 78 | |
| 6--5 |
| |
1--------2
расходуют на 1. это более общий случай для случая 1.
(д) случай 4
же, как Вопрос 3, но расходуют от два.
На самом деле, если вы можете обрабатывать футляр 4. Все остальные случаи - это только частный случай с некоторой перекрывающейся линией или вершиной.
Чтобы сделать случай 4, вы держите стопку вершины .. вы нажимаете, когда вы находите линии, перекрывающиеся с последней строкой, выталкивайте ее, когда вы получаете последнюю строку. - точно так же, как то, что вы делаете в выпуклой оболочке.
Это вовсе не тривиальный вопрос: если дефляция/инфляция мала, ничего серьезного не происходит, но в какой-то момент, вершины исчезнет. Вероятно, это было сделано раньше, поэтому я бы сказал: используйте чужой алгоритм, не создавайте свои собственные. – Martijn
Действительно, если ваш многоугольник вогнутый, чтобы начать (как в примере выше), вы должны решить, что должно произойти в точке, где наивный алгоритм хочет сделать самопересекающийся «многоугольник» ... – AakashM
Да, основной проблемой являются вогнутые части многоугольника, здесь и лежит сложность. Я все еще думаю, что не должна быть такой проблемой, чтобы вычислить, когда нужно удалить определенную вершину. Главный вопрос заключается в том, какую асимптотическую сложность потребуется для этого. –