Нужно с наименьшими затратами по времени, найти вхождение произвольного объекта в замкнутый. Под произвольным подразумевается всё, начиная от точки вектора, линии (включая путанной) и до площадных объектов с пользовательскими знаками и шаблоанми Под замкнутым - нормальный корректный площадной объект без извращений в метрике.
Вопрос: какая функция подходит лучше всего. П.С во всех функция типа ***InsideObject*** написано (только для замкнутЫХ)
// Создать объект оверлейных операций
// flag = 0 - проверка на самопересечение отключена (используется для ускорения обработки в задачах визуализации)
ovlCreate
// Установить шаблон для оверлейных операций (замкнутый объект)
ovlSetTemplet
// Цикл определения положения объектов
{
// Установить обрабатываемый объект и метод обработки (возвращает положение объекта относительно шаблона)
ovlSetObjectCross
}
// Освободить объект оверлейных операций
ovlFree
Код
// Если объект точечный, векторный, подпись или шаблон, то параметры
// precision,method,location игнорируются. Положение объекта определяется
// по первой точке первого подобъекта, а функция ovlSetObjectCross возвращает:
// 1 - объект внутри шаблона // 15/06/10
// 2 - объект вне шаблона
// Если контур шаблона ЗАМКНУТ и method == 1, то ovlSetObjectCross возвращает:
// 1 - все контура объекта внутри шаблона, либо совпадают
// 2 - все контура объекта вне шаблона
// 3 - один или несколько контуров объекта пересекаются с шаблоном,
// либо обнаружены внутренние и внешние контура (относительно шаблона)
// 4 - контур шаблона внутри контура объекта
P.S. Данный вариант оптимален для обработки большого числа объектов.
спасибо. Второй вопрос: Имеется линейный объект с произвольной метрикой, нужно найти все объекты которые он пересекает Поиск по области, будет "хватать" несуществующий сегмент от первой до крайней точки + не работает с топологически некорректными маршрутами => потому не подходит
Не тот глуп кто не знает, а тот, кто не знает где искать.
А. Выполнить перебор объектов по габаритам линейного объекта (mapSelectSeekAreaFrame, mapSeekSelectObject). Б. Для каждого найденного объекта выполнить поиск точек пересечения с эталоном (mapCreateObjectCrossPointsEx).
Так я так и сделал. Вопрос, чтото на эту тему будет добавлятся в ядро ?
П.С. Данный режим нужно для поиска пересечений маршрута полёта с площадными объектами (предварительный анализ конфликтов) Если маршрут (пример на России) будет начинатся в Домодедово а заканчиватся Хабаровском или Петропавлоском (камчатским имеется в виду) то в TMapDFrame попадёт вся Российская Федерация с сотнями тысяч зон на 10-тыс. километровом пути
Не тот глуп кто не знает, а тот, кто не знает где искать.
Маршрут - линейный объект. У каждого вектора маршрута есть рамка (как у векторного мостика). Никто не запрещает предварительно исключить зоны по НЕпересечению их рамок с рамкой очередного вектора маршрута. Если ТАКОГО в GTK пока нет, то не думаю, что функция пересечения двух ректанглов - неподъёмная задача.
Газонокосильщик пишет: У каждого вектора маршрута есть рамка (как у векторного мостика). Никто не запрещает предварительно исключить зоны по НЕпересечению их рамок с рамкой очередного вектора маршрута. Если ТАКОГО в GTK пока нет, то не думаю, что функция пересечения двух ректанглов - неподъёмная задача.
оффтоп повтор серии 1
Цитата
Если маршрут (пример на России) будет начинатся в Домодедово а заканчиватся Хабаровском или Петропавлоском (камчатским имеется в виду) то в TMapDFrame попадёт вся Российская Федерация с сотнями тысяч зон на 10-тыс. километровом пути
для наглядности (фиолетовая линия - кратчайший путь по которому летают самолёты)
И что? Элементарная задача для бланковки - найти номенклатуры заданного масштаба для трассы, кою Вы изобразили на картинке. А заодно - и субъекты РФ, через которые трасса проходит. Решается по алгоритму, описанному чуть выше на ура! ЗЫ - таки скорости сейчас намного выше, чем во времена i8086. Проверено на практике!
Газонокосильщик пишет: таки скорости сейчас намного выше, чем во времена i8086
Таки моя практика, показывает обратное. Например, чтение наименования 29500 объектов (названия населённых пунктов, семантика 9) с 2-х километровки осуществляется за 2-3 секунды. Хочу заметить, "двушка" оптимизирована специально для функций ядра - населённые пункты первые 29500 объектов на карте по уникальным номерам. То есть( я создан новую карту, скопировал с исходной все Н.П. а потом поверх всё остальное.
Теперь представим ситуацию "прокладки трассы" через Российскую Федерацию: Зоны и районы в воздушном пространстве, к сожалению, не являются областями ограниченными по рамке, которые можно считать по методу "матрёшки" - нашёл грубую номенклатуру, отбрасываешь мельче ещё мельче и доходишь до нужного уровня (глубины) вложенности. Зоны это вот такая картина:
Жёлтые области вообще левые и находятся от трассы на тысячах километров. Ладно если бы плотность анализируемых объектов была бы как в Якутии, но "зелёные" области бурной авиационной деятельности, порой содержат сотни а то и тысячи объектов которые тупо нужно отбрасывать. Одним словом, слишком общий алгоритм был предложен Олегом Валентиновичем. Было бы неплохо включить функцию поиска в ядро, по типу mapSeekArea только с названием "mapSeekSelectLine" (запросить все объекты которые пересекаются с линейным) и желательно без учёта "ошибок метрики". Практика показывает что, например, если для кадастра или сельского хозяйства метрика типа путанка является дефектной, то это не обозначает что сельское хозяйство и кадастр, будут устанавливать базовые правила формирования всей метрики целой ГИС. Это я о том, что может быть маршрут по типу "боевого дежурства" (фиолетовый), или облёт газопровода "Газпромом" (тёмно-зелёный)
Не тот глуп кто не знает, а тот, кто не знает где искать.