Поиск объектов на плоскости

Автор Тема: Поиск объектов на плоскости  (Прочитано 7942 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Есть большое количество примитивов (к примеру 2 000 000 шт.)
Нужно быстро найти любой примитив AutoCAD по вводным координатам X,Y.
Если точнее, выбрать объекты пересекающиеся с квадратом со стороной A где X,Y - середина квадрата.

Простым перебором таблицы примитивов думаю будет долго.

Думаю, решать эту задачу путем индексирования координат объектов
на плоскости и так сказать создать 2d-индекс.

Может кто подскажет как лучше решить задачу?

Вот эту статью я читал https://msdn.microsoft.com/ru-ru/library/bb964712(v=sql.105).aspx
Но это с поддержкой SQL Server.
А нужно сделать алгоритм без всякого SQL Server.




Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Поиск объектов на плоскости
« Ответ #2 : 01-07-2016, 17:30:33 »
Читай про R-деревья.
Спасибо, прочитал.
На сколько я понял.
Для построения индекса-иерархии нужно пройти по базе примитивов и построить "ДЕРЕВО" 
"ВЕТКА ДЕРЕВА" - это прямоугольный контейнер в котором находятся другие прямоугольные контейнеры.
"КОНТЕЙНЕР" - это ограничивающий прямоугольник примитива.
Пока не могу понять с чего начать.
Вот первое что приходит в голову:
1) Пройтись по базе примитивов и получить набор прямоугольников и найти самый большой (или несколько больших).
2) Дальше скорее нужно выбрать те прямоугольники, которые пересекаются с этим большим (или большими).
3) На этом этапе дерево будет иметь уже два уровня
4) Далее все тоже и в п. 1) 3) только для каждой "ВЕТКИ"

 

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Поиск объектов на плоскости
« Ответ #3 : 01-07-2016, 19:08:25 »
1) Пройтись по базе примитивов и получить набор прямоугольников
Это всё что нужно, для использования алгоритма. Всё остальное есть по ссылкам, которые я дал.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 475
  • Карма: 63

Оффлайн Алексей Терно

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Re: Поиск объектов на плоскости
« Ответ #5 : 05-07-2016, 10:34:26 »
А почему не воспользоваться методом editor.SelectCrossingPolygon?

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 475
  • Карма: 63
Re: Поиск объектов на плоскости
« Ответ #6 : 05-07-2016, 12:49:29 »
он медленный

Оффлайн Алексей Терно

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Re: Поиск объектов на плоскости
« Ответ #7 : 05-07-2016, 12:53:58 »
по сравнению с чем?

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 475
  • Карма: 63
Re: Поиск объектов на плоскости
« Ответ #8 : 05-07-2016, 20:15:18 »
editor.SelectCrossingPolygon работает через GUI и если нужно делать много запросов к большому набору данных, то вообще не вариант

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Поиск объектов на плоскости
« Ответ #9 : 11-07-2016, 12:43:47 »