Список форумов www.integro.ru www.integro.ru
ЦСИ ИНТЕГРО
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Функция контура BuildBufferZone

 
Начать новую тему   Ответить на тему    Список форумов www.integro.ru -> Вопросы разработчиков
Предыдущая тема :: Следующая тема  
Автор Сообщение
Tulon



Зарегистрирован: 11.07.2006
Сообщения: 77
Откуда: Сочи

СообщениеДобавлено: Ср 12 Июл 2006 00:53    Заголовок сообщения: Функция контура BuildBufferZone Ответить с цитатой

Доброе время суток, Господа!
Передо мной стоит задача определить расстояние между двумя контурами (кратчайшее, конечно).
Решение: "Наращивать" один из контуров функцией BuildBufferZone с последующей проверкой на пересечение со вторым контуром.
Эта функция прекрасно "наращивает" все выпуклые контуры, состоящие только из прямых и все контуры состоящие только из дуг. Но когда приходится нарастить смешанный контур, то ИНОГДА выскакивает одна из двух ошибок:
1. Размер контура по одной из осей меньше чем 1e-8.
2. GetArcConvexity: GetConvexity failed.
Зависимость появления этих ошибок я не смог вычислить!
И еще... Когда я вызываю вот такую функцию
Relation:= KontrContour.TestRelation(MainContour);, где MainContour - это вообще любой контур, а KontrContour - это почти правильный выпуклый 8ми угольник, то выскакивает еще одна интересная ошибка:
1. Вырожденный отрезок. !!!
Не подскажете ли Вы мне, как избавиться от этих ошибок, или, может быть, кто-то знает более простой метод решения поставленной задачи?

_________________
Нет ни чего сложнее, чем достигнуть простоты.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Михаил Власов



Зарегистрирован: 14.02.2005
Сообщения: 580
Откуда: ИНТЕГРО

СообщениеДобавлено: Ср 12 Июл 2006 09:29    Заголовок сообщения: Ответить с цитатой

Действительно, такая ошибка возникает.
Мы работаем над ее устранением.
Что касается задачи нахождения минимального расстояния между контурами, можно использовать следующий алгоритм:
1. Перебрать все ребра первого контура.
2. Для каждого ребра первого контура перебрать все ребра второго контура.
3. Вычислить расстояние между парой ребер.
4. Найти минимальное значение среди этих расстояний.
Это минимальное значение и будет минимальным расстоянием между контурами.

_________________
С уважением, Михаил Власов.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Tulon



Зарегистрирован: 11.07.2006
Сообщения: 77
Откуда: Сочи

СообщениеДобавлено: Ср 12 Июл 2006 14:38    Заголовок сообщения: Ответить с цитатой

Спасибо за совет, но я подозреваю, что пердложенный алгоритм будет очень ресурсоемок при рассчете сложных контуров (Определение расстояния от З/У до моря, например)...
Поэтому, если не найду более простого решения, то перепишу самостоятельно функцию BuildBufferZone.
P.S. Уж больно мне эта функция понравилась!

_________________
Нет ни чего сложнее, чем достигнуть простоты.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Михаил Власов



Зарегистрирован: 14.02.2005
Сообщения: 580
Откуда: ИНТЕГРО

СообщениеДобавлено: Ср 12 Июл 2006 14:53    Заголовок сообщения: Ответить с цитатой

1. О предложенном мною алгоритме: рессурсоемкость в плане затрат памяти - минимальна. В плане скорости выполнения зависимость простая: количество ребер первого контура * количество ребер второго контура * время нахождения расстояния между ребрами.
2. Алгоритм построения буферной зоны - задача высокой сложности (если, конечно, реализовать ее в полном объеме с учетом дуг, вложенности частей контура, точечных, линейных, площадных и пр. и пр.). Построение буферной зоны - весьма накладная операция как по времени, так и по памяти (приходится строить временные графы контуров).
3. Если у Вас получится реализовать алгоритм построения буферной зоны - напишите.

_________________
С уважением, Михаил Власов.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Tulon



Зарегистрирован: 11.07.2006
Сообщения: 77
Откуда: Сочи

СообщениеДобавлено: Ср 12 Июл 2006 17:41    Заголовок сообщения: Ответить с цитатой

Спасибо, Михаил!
Ваш вариант, конечно, в первую очередь мне пришел в голову, когда встала такая задача. Но при наличии в контурах дуг вперемежку с прямыми этот алгоритм вызвал у меня такую огромную массу вопросов и осложнений, что я рассматриваю его (извините) как самый крайний. Я составил на листах А4 несколько наиболее проблемных и нестандартных фигур и на них, с помощью чертежных инструментов, проверяю алгоритмы и отсеиваю их! Я не могу, пока что, правильно определять кратчайшие расстояния между контурами с дугами (если конечно не обрабатывать дугу попиксельно Shocked)...
Поэтому, ждите новостей о новой процедуре Idea BuildBufferZone Idea... Конечно, она будет упрощена и приспособлена конкретно для моей задачи, но возможно, что-то и Вас заинтересует.

_________________
Нет ни чего сложнее, чем достигнуть простоты.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
andreichernov



Зарегистрирован: 14.02.2005
Сообщения: 209
Откуда: Самара

СообщениеДобавлено: Чт 13 Июл 2006 10:09    Заголовок сообщения: Ответить с цитатой

Для контуров без дуг задача решается очень просто -
для них математически легко доказывается, что минимальное расстояние связывает или две точки или точку и ребро.
Два ребра быть не может.
Для контуров с дугами рекомендую аппроксимировать дуги отрезками
с расстоянием между соседними точками меньше заданной погрешности (этот алгоритм можно, например, найти в исходниках экспорта в MIF/MID). Тем более ты так и так имеешь эту погрешность
в виде шага наращивания для построения буферной зоны.
Михаилу: у меня студенты на курсовом делали алгоритм построения буферных зон. пороюсь - вышлю.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Tulon



Зарегистрирован: 11.07.2006
Сообщения: 77
Откуда: Сочи

СообщениеДобавлено: Пн 24 Июл 2006 20:15    Заголовок сообщения: Ответить с цитатой

Андрей, насчет аппроксимации дуг идея интересная... Я об этом как-то не догадался!
Михаил, задача создания функции построения буферной зоны пока заморожена... Я застрял на тригонометрии (поиск точки, центра окружности - по кривизне). А в модуле реализовал два режима работы: обычный и защищенный. В защищенном режиме программа вычищает отрезки нулевой длины (была у меня проблемка с ними) и преобразует дуги в прямые! Оказалось, что у заказчика на картах нет объектов с дугами, а если и попадется, то всегда можно запустить сохраненный режим...
Конечно, выход очень не красивый, но я надеюсь это временно! И чуть позже попробую апроксимировать дугу... Когда соберусь с силами опять засесть за аналитику и тригонометрию!
Кстати, если Вы подскажите, как по кривизне, двум точкам и радиусу определить координаты центра окружности, то я буду оч. благодарен и построение буферной зоны снова разморозится! Wink
П.С. Как Вы понимаете, радиус я смог определить, а вот с координатами центра возникло затруднение!

_________________
Нет ни чего сложнее, чем достигнуть простоты.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
andreichernov



Зарегистрирован: 14.02.2005
Сообщения: 209
Откуда: Самара

СообщениеДобавлено: Вт 25 Июл 2006 08:57    Заголовок сообщения: Ответить с цитатой

Владимир Погиблев писал(а):

Я застрял на тригонометрии (поиск точки, центра окружности - по кривизне). Кстати, если Вы подскажите, как по кривизне, двум точкам и радиусу определить координаты центра окружности, то я буду оч. благодарен и построение буферной зоны снова разморозится!

Ну например так: центр лежит на пересечении 2 окружностей с центрами в 2 известных точках и заданным радиусом.
Выпиши эти 2 уравнения и реши систему.
P.S. можно также посмотреть в исходниках программных модулей
(директория GISSDK поставки) файл geomet.pas, там куча процедур дискретной геометрии, в том числе нужная тебе GetCenter.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Михаил К.



Зарегистрирован: 05.03.2018
Сообщения: 4

СообщениеДобавлено: Пн 19 Мар 2018 15:47    Заголовок сообщения: такаяже проблема Ответить с цитатой

getarcconvexity: convexity failed при работе с трассировкой
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Азаматов Азамат Хадисович



Зарегистрирован: 17.02.2005
Сообщения: 100
Откуда: г. Учалы, Респ. Башкортостан

СообщениеДобавлено: Вт 20 Мар 2018 01:38    Заголовок сообщения: Ответить с цитатой

вот некоторый набор функций для геометрии.
за отсутствие глюков не ручаюсь.
ссылки на недостающие классы можно поудалять.



GeomCalc.zip
 Описание:

Скачивание
 Название файла:  GeomCalc.zip
 Размер файла:  6.99 KB
 Скачено:  726 раз(а)

Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Михаил К.



Зарегистрирован: 05.03.2018
Сообщения: 4

СообщениеДобавлено: Чт 22 Мар 2018 08:20    Заголовок сообщения: Ответить с цитатой

Азаматов Азамат Хадисович писал(а):
вот некоторый набор функций для геометрии.
за отсутствие глюков не ручаюсь.
ссылки на недостающие классы можно поудалять.

Спасибо!!! а как его подключать, у него расширение *.CS
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Азаматов Азамат Хадисович



Зарегистрирован: 17.02.2005
Сообщения: 100
Откуда: г. Учалы, Респ. Башкортостан

СообщениеДобавлено: Чт 22 Мар 2018 13:04    Заголовок сообщения: Ответить с цитатой

если в Visual Studio просто добавить в проект.
если у вас на Delphi то есть такой вот класс.



decurve.zip
 Описание:

Скачивание
 Название файла:  decurve.zip
 Размер файла:  3.09 KB
 Скачено:  726 раз(а)

Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов www.integro.ru -> Вопросы разработчиков Часовой пояс: GMT + 5
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете добавлять приложения в этом форуме
Вы можете скачивать файлы в этом форуме


© phpBB Group
Русская поддержка phpBB