Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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 несколько наиболее проблемных и нестандартных фигур и на них, с помощью чертежных инструментов, проверяю алгоритмы и отсеиваю их! Я не могу, пока что, правильно определять кратчайшие расстояния между контурами с дугами (если конечно не обрабатывать дугу попиксельно )...
Поэтому, ждите новостей о новой процедуре BuildBufferZone ... Конечно, она будет упрощена и приспособлена конкретно для моей задачи, но возможно, что-то и Вас заинтересует.
_________________ Нет ни чего сложнее, чем достигнуть простоты. |
|
Вернуться к началу |
|
 |
andreichernov
Зарегистрирован: 14.02.2005 Сообщения: 209 Откуда: Самара
|
Добавлено: Чт 13 Июл 2006 10:09 Заголовок сообщения: |
|
|
Для контуров без дуг задача решается очень просто -
для них математически легко доказывается, что минимальное расстояние связывает или две точки или точку и ребро.
Два ребра быть не может.
Для контуров с дугами рекомендую аппроксимировать дуги отрезками
с расстоянием между соседними точками меньше заданной погрешности (этот алгоритм можно, например, найти в исходниках экспорта в MIF/MID). Тем более ты так и так имеешь эту погрешность
в виде шага наращивания для построения буферной зоны.
Михаилу: у меня студенты на курсовом делали алгоритм построения буферных зон. пороюсь - вышлю.
|
|
Вернуться к началу |
|
 |
Tulon

Зарегистрирован: 11.07.2006 Сообщения: 77 Откуда: Сочи
|
Добавлено: Пн 24 Июл 2006 20:15 Заголовок сообщения: |
|
|
Андрей, насчет аппроксимации дуг идея интересная... Я об этом как-то не догадался!
Михаил, задача создания функции построения буферной зоны пока заморожена... Я застрял на тригонометрии (поиск точки, центра окружности - по кривизне). А в модуле реализовал два режима работы: обычный и защищенный. В защищенном режиме программа вычищает отрезки нулевой длины (была у меня проблемка с ними) и преобразует дуги в прямые! Оказалось, что у заказчика на картах нет объектов с дугами, а если и попадется, то всегда можно запустить сохраненный режим...
Конечно, выход очень не красивый, но я надеюсь это временно! И чуть позже попробую апроксимировать дугу... Когда соберусь с силами опять засесть за аналитику и тригонометрию!
Кстати, если Вы подскажите, как по кривизне, двум точкам и радиусу определить координаты центра окружности, то я буду оч. благодарен и построение буферной зоны снова разморозится!
П.С. Как Вы понимаете, радиус я смог определить, а вот с координатами центра возникло затруднение!
_________________ Нет ни чего сложнее, чем достигнуть простоты. |
|
Вернуться к началу |
|
 |
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 |
Размер файла: |
6.99 KB |
Скачено: |
836 раз(а) |
|
|
Вернуться к началу |
|
 |
Михаил К.
Зарегистрирован: 05.03.2018 Сообщения: 4
|
Добавлено: Чт 22 Мар 2018 08:20 Заголовок сообщения: |
|
|
Азаматов Азамат Хадисович писал(а): | вот некоторый набор функций для геометрии.
за отсутствие глюков не ручаюсь.
ссылки на недостающие классы можно поудалять. |
Спасибо!!! а как его подключать, у него расширение *.CS
|
|
Вернуться к началу |
|
 |
Азаматов Азамат Хадисович
Зарегистрирован: 17.02.2005 Сообщения: 100 Откуда: г. Учалы, Респ. Башкортостан
|
Добавлено: Чт 22 Мар 2018 13:04 Заголовок сообщения: |
|
|
если в Visual Studio просто добавить в проект.
если у вас на Delphi то есть такой вот класс.
Описание: |
|
 Скачивание |
Название файла: |
decurve.zip |
Размер файла: |
3.09 KB |
Скачено: |
842 раз(а) |
|
|
Вернуться к началу |
|
 |
|