Debugger писал(а):Здорово, Хакер!
Спасибо.
Только объясни, пожалуйста, в чем сложность моего метода:
Взять такую вершину (и 2 соседних ребра), чтобы через нее можно было провести такую прямую, чтобы все остальные точки многоугольника лежали по одну сторону от нее.
Сложность заключается в выделенном слове. Это ты легко можешь взять, а компьютер может взять только конкретную, которую прикажут, так что, чтобы он взял нужную, нужно по очереди брать все и проверять, подходит ли выбранная. Т.е. если у тебя фигура из 1000 вершин, то ты будешь перебирать всю 1000 вершин и каждый раз из тысячи разов будешь 998 раз проверять факт пересечения прямой (какой? Какую прямую ты собрался брать?) с остальными 998 рёбрами?
По идее, эти 2 ребра и точку можно рассмотреть, как треугольник, и определить направление в нем.
Ребро, которое идет ИЗ выбранной вершины, обозначим "1", а которое идет В вершину - "2". Замерим угол по часовой стрелке от ребра 1 до ребра 2. Если он меньше 180 градусов, то вершины идут ПО часовой, если больше 180 градусов - идут против часовой. Сейчас кто-нибудь спросит "а если равно 180?". А если равно - не может быть, это не удовлетворяет первому условию.
Предлагаю тебе реализовать свой способ на VB6 и потом сравнить с реализацией моего последнего способа. Тогда ты поймёшь, в чём сложность.
Другое дело, мне кажется, ты свой способ нашёл «интуитивно». И ты понимаешь суть моего способа? Если ты сядешь и станешь размышлять над своим первым условием, то в некоторый момент осознаешь, что его выполнение не обязательно, если вместо него делать другие (гораздо более мелкие) проверки. Но фишка будет в том, что наличие этих мелких проверок сделает ненужным измерение угла. И тогда, по сути, ты получишь мой способ.
Если точно так же задуматься над способом с суммированием углов, то его тоже можно упростить, приведя к моему.
Debugger писал(а):И еще интересно, почему теорию Хакера с коллапсированием забраковали?
Я сам теперь её считаю очень сложной (как в плане реализации, так и в плане сложности самого алгоритма). Одна только триангуляция съест больше времени и выполнит больше действий, чем весь мой последний способ.
Интересно, выкладывай.
Там оставшийся код не имеет отношения несосредственно к самому способа: там добавление вершин, изменение размера массива и т.п.