Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2004.02.13;
Скачать: [xml.tar.bz2];

Вниз

Поиск пересечения многоугольников   Найти похожие ветки 

 
kavlad   (2003-10-10 14:57) [0]

Вопрос к любителям (и профессионалам :) векторной графики.
Представим бо-ольшой массив многоугольников (пусть 100 тыс.). Назовем его гордым словом "хранилище".
Каждый многоугольник описывается вектором точек (x, y).
И вот на вход системы подается еще один многоугольник. И необходимо выбрать из хранилища все многоугольники, пересекающиеся с поданным. Задача решена методами линейной алгебры. Но уж больно долго происходят вычисления. Пришла в голову бредовая мысль - описать многоугольники каким-либо хитрым образом и применить не менее хитрое преобразование (например, Фурье :), чтобы получить простой образ - например число однозначно описывающее положение многоугольника в пространстве. Тогда взаимное положение многоугольников можно определить просто сравнением (или другой элементарной операцией) этих чисел.
ПОДСКАЖИТЕ В КАКУЮ СТОРНУ КОПАТЬ!!! А то забыл я математику и физику :(

P.S. Эта бредовая идея пришла в голову не только мне. Оказываетяс на преобразовании Фурье основано ядро UniGraphix...


 
Ketmar   (2003-10-10 16:43) [1]

бредовых мыслей много. более точно очерти задачу.


 
kavlad   (2003-10-10 16:49) [2]

>Ketmar (10.10.03 16:43) [1]
Сказать "дайте мне готовый алгоритм" самомнение не позволяет.
Там было сказано: "описать многоугольники каким-либо хитрым образом". Вот и думаю каким. Но не знаю настолько теорию, чтобы сразу в голове что-то образовалось.


 
WondeRu   (2003-10-10 17:02) [3]

Посмотри сайты по программированию игр . Там задача сформулирована как "проверка на столкновение"(елси чего-то не напутал). Спроси на фофруме "игры" здесь же!


 
Ketmar   (2003-10-10 17:22) [4]

>kavlad (10.10.03 16:49) [2]
ещё раз повторю: зависит от задачи. иногда есть "читсто программерские" методы, иногда нужна математика.


 
kavlad   (2003-10-10 17:40) [5]

>Ketmar (10.10.03 17:22)
В декартовой системе координат (многоугольник описывается массивом сових вершин) задача решается с большими вычислительными затратами. Поэтому хочется описать многоугольник в других координатах. И найти для такого описания многоугольника преобразование (это математика :), после которого положение объекта в пространстве однозначно описывалось бы простым набором параметров (в идеале одним параметром - числом). Тогда задача нахождения взаимного положения двух многоугольников свелась бы к тривиальной операции (сравнение, сложение, вычитание и т.п.). И за счет этого добиться более высокой скорости работы приложения.
Что конкретно не понятно?


 
kavlad   (2003-10-10 17:41) [6]

>WondeRu © (10.10.03 17:02)
На сайтах по программированию игр про такие вещи слыхом не слыхивали :( К сожалению.


 
Mystic   (2003-10-10 17:45) [7]

Если ли какие-то предположения относительно расположения многоугольников? Напрашивающаяся оптимизация --- разделить участки на зоны. При помещении многоугольника в зону (или несколько зон) рассматривать только те прямоугольники, которые расположены в этих зонах... Те, которые в эти зоны не попадают, исключаются из рассмотрения...


 
kavlad   (2003-10-10 18:00) [8]

>Mystic © (10.10.03 17:45)
Это реализовано. Но встает вопрос оптимизации размера зоны.
Многоугольники в хранилище и на входе системы могут быть абсолютно произвольных размеров. Если объект на входе занимает несколько зон (частично) - то количество операций многократно возрастает. Если сделать зону большой - количество операция для маленьких объектов также СИЛЬНО возрастает.
Но это другой вопрос :) А вот с математикой, с представлением объекта в более удобном для вычислений виде у меня траблы :(


 
kavlad   (2003-10-10 18:07) [9]

>ystic © (10.10.03 17:45) [7]
Для пояснения - речь идет о работе с электронной картой.
Есть множество объектов, плохо обрабатываемых таким зональным методом. Напрмер многоугольники окружающие дороги - они занимают много зон, но площадь имеют маленькую, поэтому придется перебрать много объектов из хранилища и проверить их взаимное расположение с дорогой, хотя пересекаются с дорогой порядка 2% (к примеру).
Т.е. зональное разбиение по вычислительной сложности сильно привязано к размеру зоны.


 
Ketmar   (2003-10-10 18:40) [10]

а разбивать "многозональные" на куски? тогда, имхо, octree "канает" аж со свистом.


 
Mystic   (2003-10-10 18:48) [11]

Основные идеи оптимизации мне видятся в слудующем:

1) Оптимизация порядка хранения прямоугольников таким образом, чтобы на самом раннем стадии отбросить большую часть объектов
2) Хранение дополнительной информации о прямоугольнике. Например прямоугольник, описывающий размеры исходного прямоугольника... т. е. сначала иет тест, могут ли пересекаться многоугольники в принципе, а потом уточнение деталей.
3) Разбиение сложных многоугольников на несколько более простых. Например, по границам зон. Это борьба с объектами занимающими малую площадь но большой объем (типа окружной).


 
Ketmar   (2003-10-10 19:06) [12]

угу. octrees + bounding boxes + subdivision.


 
kavlad   (2003-10-11 15:59) [13]

>Ketmar (10.10.03 18:40) [10]
Представляешь, сколько всего придется хранить в хранилище. В смысле дополнительной информации. Ее и так много хранится. Хранилище кешируестя в памяти сервера. После загрузки вот именно этих многоугольников (пресловутые 100 тыс.) сервер одним махом отъедает почти полгига оперативки. А таких хранилищ уже сейчас шестнадцать. И будут новые появляться. Видимо ошибка проектирования :)

>Mystic © (10.10.03 18:48) [11]
Первый пункт я сейчас пытаюсь реализовать.
Второй пункт реализован. Это было первое, что пришло в голову.
Третий пункт недопустим по идеологическим соображения. Хотя надо подумать :)
Спасибо за советы.


 
Nikolay M.   (2003-10-11 18:00) [14]

Не заметил, чтобы пробегала мысль, но скажу, что первое пришло в голову: хранить вместе с многоугольниками описанные вокруг каждого из них прямоугольник - определить непересекаемость прямоугольников проще, чем многоугольников.
Ну, а в плане оптимизации с точки зрения программирования - напрашивается многопоточность, но вряд ли этим я подал новую мысль :)


 
CyberStorm   (2003-10-11 23:35) [15]

Наиболее подходящее решение - "отбросить" многоугольники заведомо не могущие иметь пересечения с заданным. Для этого можно использовать R-tree для определения расположенных рядом многоугольников. Оптимальней никто ничего не придумал и не придумает.


 
Ketmar   (2003-10-12 10:14) [16]

>kavlad (11.10.03 15:59) [13]
а зачем хранить в пямяти ВСЁ? тот же самый octree даст возможность подгружать только те хоны, которые необходимы, и с неолбходимым уровнем детализации.

>Nikolay M. © (11.10.03 18:00) [14]
я сказал. bounding box. и Мистик тож, кажись.


 
Nikolay M.   (2003-10-12 11:31) [17]


> Ketmar (12.10.03 10:14) [16]

Да, действительно... Не могла такая очевидная вещь остаться невысказанной :)


 
kavlad   (2003-10-12 14:05) [18]

>Ketmar (10.10.03 19:06) [12]
Тогда уж quadtrees :)


 
Mystic   (2003-10-13 14:36) [19]

>Третий пункт недопустим по идеологическим соображения. Хотя надо подумать :)

Не вижу никакой недопустимости... Особенно, если реализация будет прозрачной для тех модулей, кому знать об этом необязательно. Т. е. некоторые процедуры могут оставаться в неведении относительно того, что многоугольник состоит из более мелких частей.



Страницы: 1 вся ветка

Форум: "Media";
Текущий архив: 2004.02.13;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.009 c
1-38936
BlackLord2003
2004-02-03 14:31
2004.02.13
TWebBrowser


3-38737
SasaR
2004-01-20 19:00
2004.02.13
rxMemoryDataSet


1-38785
Dimich1978
2004-02-03 14:32
2004.02.13
Удаленная инсталляция


3-38729
Vladimir Bolotin
2004-01-21 21:15
2004.02.13
Как скрыть от пользователя обращение к данным?


14-39023
Valerian
2004-01-26 08:47
2004.02.13
Не могу установить некоторые программы и игры





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский