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

 
1 2 3 4
+
-
edit
 

AidarM

аксакал
★★☆
Mishka>Только комбинаций из них опять факториал. :) Из каждой пары пересекающихся ребер нужно выбрать одно, но это одно может отвалить много других ребер из данной вершины. А, вот, если уберем другое, то это множество может остаться — какое продолжение выберем?
А я откуда знаю? Идея Сергея-4030 состоит в том, чтобы перебирать все, но прекращать работу с неподходящими на достаточно раннем этапе (если повезет). Т.е. он при постройке анализирует, не грозит ли ему слепить самопересекающееся чудо. А я просто предложил часть важной для такого анализа инфы запасти заранее.
Солипсизм не пройдёт! :fal:  
+
-
edit
 

AidarM

аксакал
★★☆
Блин, интуиция орет, что так мы все возможные односвязные Nугольники переберем, но в фоновом режиме ничего в голову не приходит насчет как доказать. Попробую сконцентрироваться именно на этом позже. Или пускай кто-нить опровергнет. Уж очень заманчиво, подозрительно прямо. :D
Солипсизм не пройдёт! :fal:  
+
-
edit
 

haleev

втянувшийся

Balancer> Есть точки, составляющие выпуклый многоугольник. Они перемешаны случайным образом. Как отсортировать их так, чтобы их последовательность описывала выпуклый многоугольник?
Balancer> Например, из:
Balancer> 0,0
Balancer> 0,10
Balancer> 10,0
Balancer> 10,10
Balancer> получить:
Balancer> 0,0
Balancer> 10,0
Balancer> 10,10
Balancer> 0,10

1. Определяем в наборе 4 точки - самую нижнюю, левую, верхнюю, правую
2. проверяем эти 4 точки на совпадения - точка одновременно может быть например и самой нижней и самой правой.
3. из выбранных точек строим двух, трёх или четырёхугольник.
4. оставшиеся точки проверяем на выход за грани получившегося многоугольника - выходит за грань - вставляем точку в многоугольник между вершинами этой грани. Т.к. по условию задачи точки принадлежат выпуклому многоугольнику, то никаких неоднозначностей здесь не будет
5. повторяем пока не кончатся точки

alles

P.S. можно было бы ограничиться пунктами 3, 4, 5 начав с произвольных двух точек, но так немного побыстрее
 
Это сообщение редактировалось 27.04.2007 в 18:36
+
-
edit
 

AidarM

аксакал
★★☆
AidarM>Блин, интуиция орет, что так мы все возможные односвязные Nугольники переберем,
Врет, собака. :D Адназначна. ИМХО не в ту степь ударился.

2 haleev
Условия задачи изменились. Исходную - решили. :D
Солипсизм не пройдёт! :fal:  
US Сергей-4030 #27.04.2007 20:06
+
-
edit
 

Сергей-4030

исключающий третье
★★
В общем, вчера вечерком было нечего делать и мою идею я имплементировал. Результат такой - до 9 точек (на моей машине) делается меньше секунды. 12 точек - от 5 до 15 секунд. 14 точек - от 30 до 90 секунд. Что, кстати, радует - вроде как, зависимость все-таки уже не факториальная получается! Вот такие пироги. Если кому интересно - скидываю тексты. Документировать не буду, лень, и так три часа убил.

ЗЫ Машина иногда очень оригинально расставляет точки дабы максимизировать площадь.
Прикреплённые файлы:
 
 
US Сергей-4030 #27.04.2007 20:08
+
-
edit
 

Сергей-4030

исключающий третье
★★
Тут выложу исходники. Запускать класс samples.polygons.ui.Sketch
Прикреплённые файлы:
 
 
Это сообщение редактировалось 27.04.2007 в 20:20
+
-
edit
 

haleev

втянувшийся

Звиняюсь
Туплю, туплю... Голова садовая.
С пяти утра на ногах. Если полигон без взаимопересечений, то можно сначала построить из подмножества точек выпуклый многоугольник, а потом, перебирая оставшиеся точки отрезать от этого выпуклого многоугольника треугольники. Сложность получится... ээээ... N*N*N
треугольник отрезаем, если в него не попадает ни одна из оставшихся точек. Если отсортировать точки по какой-либо оси или скажем по расстоянию от центра многоугольника, то можно получить некоторый прирост в скорости.
 
US Сергей-4030 #27.04.2007 20:19  @haleev#27.04.2007 20:14
+
-
edit
 

Сергей-4030

исключающий третье
★★
haleev> Звиняюсь
haleev> Туплю, туплю... Голова садовая.
haleev> С пяти утра на ногах. Если полигон без взаимопересечений, то можно сначала построить из подмножества точек выпуклый многоугольник, а потом, перебирая оставшиеся точки отрезать от этого выпуклого многоугольника треугольники. Сложность получится... ээээ... N*N*N
Боюсь, вы ошибаетесь. Даже если вам не нужно максимальную площадь сложность будет факториальная. :(
 
US Сергей-4030 #27.04.2007 20:20
+
-
edit
 

Сергей-4030

исключающий третье
★★
остальные исходники
Прикреплённые файлы:
 
 
US Сергей-4030 #27.04.2007 20:21
+
-
edit
 

Сергей-4030

исключающий третье
★★
еще исходники
Прикреплённые файлы:
 
 
US Сергей-4030 #27.04.2007 20:30  @AidarM#26.04.2007 18:34
+
-
edit
 

Сергей-4030

исключающий третье
★★
Mishka>>Только комбинаций из них опять факториал. :) Из каждой пары пересекающихся ребер нужно выбрать одно, но это одно может отвалить много других ребер из данной вершины. А, вот, если уберем другое, то это множество может остаться — какое продолжение выберем?
AidarM> А я откуда знаю? Идея Сергея-4030 состоит в том, чтобы перебирать все, но прекращать работу с неподходящими на достаточно раннем этапе (если повезет). Т.е. он при постройке анализирует, не грозит ли ему слепить самопересекающееся чудо. А я просто предложил часть важной для такого анализа инфы запасти заранее.

Уже сама постройка будет факториальной сложности. Т.е. если даже если она (постройка) и позволит нам сделать, скажем, алгоритм сложности N (а она не позволит), то сам факториальный механизм постройки все испортит.
 
RU haleev #27.04.2007 20:37  @Сергей-4030#27.04.2007 20:19
+
-
edit
 

haleev

втянувшийся

haleev>> Звиняюсь
haleev>> Туплю, туплю... Голова садовая.
haleev>> С пяти утра на ногах. Если полигон без взаимопересечений, то можно сначала построить из подмножества точек выпуклый многоугольник, а потом, перебирая оставшиеся точки отрезать от этого выпуклого многоугольника треугольники. Сложность получится... ээээ... N*N*N
Сергей-4030> Боюсь, вы ошибаетесь. Даже если вам не нужно максимальную площадь сложность будет факториальная. :(

Хм... моё утверждение сводится к предположению, что для множества точек находящихся внутри многоугольника обязательно найдется такая, которая образует треугольник с его гранью так, что внутрь этого треугольника не попадает ни одна из других точек. Доказать этого моя макитра сейчас не может, но что это так "нутром чую" (С) :-)

P.S. Если внутрь треугольника попала точка, то надо проверять её.
Верхний цикл делать по рёбрам.
Вот тут "нутром чую", что сложность будет N * N * sqrt(N)
 
US Сергей-4030 #27.04.2007 20:48  @haleev#27.04.2007 20:37
+
-
edit
 

Сергей-4030

исключающий третье
★★
haleev> Хм... моё утверждение сводится к предположению, что для множества точек находящихся внутри многоугольника обязательно найдется такая, которая образует треугольник с его гранью так, что внутрь этого треугольника не попадает ни одна из других точек. Доказать этого моя макитра сейчас не может, но что это так "нутром чую" (С) :-)

Я просто не понял вас сначала. В таком изложении - реализуется. Но такой метод приведет нас к "звездам", которые совсем и близко не будут максимальной площади. Более того - к минимальной будут ближе. :(

ЗЫ Алгоритмы, основанные на максимальном выпуклом подмножестве уже высказывались.
 
US Сергей-4030 #27.04.2007 20:50
+
-
edit
 

Сергей-4030

исключающий третье
★★
Кстати, после экспериментов с программкой мне показалось, что критерием лучше делать не наибольшую площадь, а наименьшую угловатость. Требование площади приводит к тому, что машина проводит длинные узкие "стены" через весь многоугольник.
 
US Сергей-4030 #27.04.2007 20:53
+
-
edit
 

Сергей-4030

исключающий третье
★★
Кстати, насчет того, как наш мозг такие задачи решает. Не знаю у кого как, а мой при количестве точек>10 не справляется. Т.е. замкнутую площадь я построить могу, а вот чтоб максимальную площадь - не догоняю иногда. Впрочем, мой мозг невыдающийся в смысле геометрии и чисел, так что не показатель.
 
+
-
edit
 

AidarM

аксакал
★★☆
Сергей-4030>после экспериментов с программкой мне показалось, что критерием лучше делать не наибольшую площадь, а наименьшую угловатость.
Не понимаю. Про максимум площади - так Balancer задал. А насчет угловатости - вроде бы логично для плавных замкнутых кривых, т.к. это на дальнем фоне где-то стыкуется с максимальностью площади круга при заданной длине окружности. Но только у нас длина никак не лимитирована, и линии строго прямые.

>Требование площади приводит к тому, что машина проводит длинные узкие "стены" через весь многоугольник.
Что и херит аналогии с кругом. :D Непонятно, как сравнивать угловатость 2х фигур. Площадь хотя бы считать легко. Правда, по окончанию постройки, а не в процессе. А машина же ответ находит таким, с узкими стенами! Кстати, если узких стен всего 2, в смысле, одна точка такая особенная, то такой многоугольник способнен построить и тот навязший у меня в мозгах алгоритм про вращение башкой в одну сторону. Когда начало координат на эту точку придется.

>Кстати, насчет того, как наш мозг такие задачи решает.
Ага, я тогда поторопился с ответом. Какие-то варианты мы упускаем при поиске, и непонятно, по какому критерию отсев идет.
Солипсизм не пройдёт! :fal:  
Это сообщение редактировалось 27.04.2007 в 21:16
US Сергей-4030 #27.04.2007 21:26  @AidarM#27.04.2007 21:04
+
-
edit
 

Сергей-4030

исключающий третье
★★
AidarM> Ага, я тогда поторопился с ответом. Какие-то варианты мы упускаем при поиске, и непонятно, по какому критерию отсев идет.

Вот тут хороший пример - я не додумался до этих стен с вершинами в 0 и в 10. Сложно биологическим разумам оценить где площадь больше - в длинном узком треугольнике или в коротком, но "полном". И кучу разбиений оценить сложно.
Прикреплённые файлы:
 
 
US Сергей-4030 #27.04.2007 21:37
+
-
edit
 

Сергей-4030

исключающий третье
★★
Или вот такая фигура. Когда машина нарисует - уже все понятно. А до того - хрен поймешь. :(
Прикреплённые файлы:
p1-1.JPG (скачать) [13,1 кБ]
 
 
 
US Сергей-4030 #27.04.2007 22:07
+
-
edit
 

Сергей-4030

исключающий третье
★★
А вот такие козябры получаются если искать минимальную площадь вместо максимальной.
Прикреплённые файлы:
min.JPG (скачать) [21 кБ]
 
 
 
US Сергей-4030 #27.04.2007 22:35
+
-
edit
 

Сергей-4030

исключающий третье
★★
А вот такая примерно разница между максимальной и минимальной площадью на одном и том же наборе. Максимальный многоугольник - серый, минимальный - красный контур.
Прикреплённые файлы:
mm.JPG (скачать) [22 кБ]
 
 
 
US Сергей-4030 #27.04.2007 23:33
+
-
edit
 

Сергей-4030

исключающий третье
★★
А вот ишшо прикольный образец творчества силиконового разума.
Прикреплённые файлы:
mm1.JPG (скачать) [15 кБ]
 
mm2.JPG (скачать) [22 кБ]
 
 
 
US Сергей-4030 #28.04.2007 00:29  @AidarM#27.04.2007 21:04
+
-
edit
 

Сергей-4030

исключающий третье
★★
>>Требование площади приводит к тому, что машина проводит длинные узкие "стены" через весь многоугольник.
AidarM> Что и херит аналогии с кругом. :D Непонятно, как сравнивать угловатость 2х фигур. Площадь хотя бы считать легко.

А вот как раз круг - идея хорошая. Собственно, что такое круг? Это такая структура, которая имеет данную площадь при наименьшем - что? Правильно, при наименьшем периметре. Если поставить целевой функцией минимизацию периметра, "стены" уходят и все многоугольники получаются очень "человеческими" (см. вложение).
Прикреплённые файлы:
 
 
RU haleev #28.04.2007 12:38  @Сергей-4030#27.04.2007 20:48
+
-
edit
 

haleev

втянувшийся

haleev>> Хм... моё утверждение сводится к предположению, что для множества точек находящихся внутри многоугольника обязательно найдется такая, которая образует треугольник с его гранью так, что внутрь этого треугольника не попадает ни одна из других точек. Доказать этого моя макитра сейчас не может, но что это так "нутром чую" (С) :-)
Сергей-4030> Я просто не понял вас сначала. В таком изложении - реализуется. Но такой метод приведет нас к "звездам", которые совсем и близко не будут максимальной площади. Более того - к минимальной будут ближе. :(
Сергей-4030> ЗЫ Алгоритмы, основанные на максимальном выпуклом подмножестве уже высказывались.

Нет он не приведёт к звёздам т.к. рёбра получившиеся после вырезания треугольника тоже участвуют в процессе. Интересно что получится если выбирать для вырезания самый маленький треугольник.
Да, и возможны варианты когда звезда - максимальная по площади фигура.
 
Это сообщение редактировалось 28.04.2007 в 13:07
+
-
edit
 

AidarM

аксакал
★★☆
Cергей-4030>Это такая структура, которая имеет данную площадь при наименьшем - что? Правильно, при наименьшем периметре. Если поставить целевой функцией минимизацию периметра, "стены" уходят и все многоугольники получаются очень "человеческими" (см. вложение).
Да, если просто поиграть хочется, то конечно и с таким условием очень интересно играть. :) Вряд ли нас модеры обругают, если мы тему так поменяем. :D

Однако и задача от Balancer-а может стать насущной. Я пока играю с ней.
Текущие мысли примерно такие. В полном графе для N вершин имеем N(N-1)/2 ребер.
Значит, можно построить новый граф. Ребра старого - его точки. А ребра нового - пересечения старых. Таким образом, имея в исходном условии запрет на самопересечения, матрица смежности нового графа (размерчиком (N(N-1)*N(N-1)/4-N(N-1)/2)/2-> ~N4 ) является по сути словариком матерн... запрещенных фигур. N4 тоже не сахар, конечно.

ИМХО алгоритм проверки на пересечение (при условии целочисленности координат) тоже можно сделать полностью целочисленным.

Сразу ясно, что словарик избыточен, т.к. описывает полный граф. Но что делать, и как оптимизировать алгоритм в этой части, я пока не знаю.

Идея-то все та же, на максимально более раннем этапе отсеять самопересекающиеся замкнутые ломаные.

При постройке каждого из (N-1)!/2 многоугольников мы смотрим по словарику, нет ли в его наборе пересекающихся ребер. Если так дубово подойти, то все ускорение сведется к тому, что мы последовательно для каждого ребра просматриваем, нет ли хотя бы одного ненулевого элемента над главной диагональю по индексам, соответствующим остальным ребрам.

Но на самом-то деле, зная о факте пересечения какой-то конкретной пары ребер, из списка разрешенных фигур вылетает нафиг целый класс, содержащий эту пару. Сколько в этом классе фигур замкнутых ломаных, проходящих через все точки, ИМХО можно прикинуть. Но главное - надо придумать так организовать цикл, перебирающий эти (N-1)!/2 ломаных, чтобы из рассмотрения наиболее естественно исключались классы ломаных, а не отдельные штуки. ИМХО, в случае успеха это грозит сведение сложности задачи к полиномиальной.
Солипсизм не пройдёт! :fal:  
+
-
edit
 

-exec-

опытный

я чувствовал, что будут грабли со слабоформализованной задачей.
и вот - работы Сергей-4030 показывают выпуклые многоугольники с глубокими разрезами.
 
1 2 3 4

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru