Перейти к содержанию
    

Вопрос по алгоритму определения границы кривой

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нисего не помогает. :(((((((((((((((((((((((

У меня горе просто!

Есть очень кривыии линии.

Со всяки провальчиками, пычками.

ОТфильтруешь одно, третье вылазит.

Треть, четвёртое.

У меня уже прога листов на 10 получилась.

На одном работает, треий подключил, всё съехало.

То, что не решается аналитически, можно решить графически: отрисуйте треки в битмап ( достаточно бит на точку, много еста не займет), тогда задача сведется к банальной заливке области. Если начальную точку выбрать гарантированно во внешней области, как раз гарантированно зальется все, что вне.

 

З.Ы. чтобы не было "протеканий" во внутрь, треки нужно рисовать толстыми линиями. Как раз получится отступ, который Вы рисовали, в половину толщины линии.

Изменено пользователем Ledmaster

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что за совет? А то советов, вроде, много было..

 

Решение:

1. Попарно находятся пересекающиеся отрезки ломаной, и в точках пересечения разбиваются каждый на два отрезка.

2 Находим все замкнутые участки ломаной (это будут границы внутренних областей)

3. Попарно проверяются внутренние области, ограниченные этими замкнутыми участками ломаной на предмет вхождения одной области в другую; если область входит в другую, то ломаная - граница области исключается (удаляется)

4 Оставшиеся ломаные – решение

 

То, что не решается аналитически, можно решить графически: отрисуйте треки в битмап ( достаточно бит на точку, много еста не займет), тогда задача сведется к банальной заливке области. Если начальную точку выбрать гарантированно во внешней области, как раз гарантированно зальется все, что вне.

 

З.Ы. чтобы не было "протеканий" во внутрь, треки нужно рисовать толстыми линиями. Как раз получится отступ, который Вы рисовали, в половину толщины линии.

 

 

Решил задачу аналогично вашему совету.

Сожалею, что поздно прочитал Ваш совет, а то неделю думал, голову ломал.

Работает просто всё шикарно.

Теперь буду выделять внутреннии области. :biggrin:

Если необходимо могу моим последователям выложить код программки на билдере.

Буду аналогично внутреенни зоны вычленять.

Всем большое спасибо за советы.

 

То, что не решается аналитически, можно решить графически: отрисуйте треки в битмап ( достаточно бит на точку, много еста не займет), тогда задача сведется к банальной заливке области. Если начальную точку выбрать гарантированно во внешней области, как раз гарантированно зальется все, что вне.

 

З.Ы. чтобы не было "протеканий" во внутрь, треки нужно рисовать толстыми линиями. Как раз получится отступ, который Вы рисовали, в половину толщины линии.

 

 

Решил задачу аналогично вашему совету.

Сожалею, что поздно прочитал Ваш совет, а то неделю думал, голову ломал.

Работает просто всё шикарно.

Теперь буду выделять внутреннии области. :biggrin:

Если необходимо могу моим последователям выложить код программки на билдере.

Буду аналогично внутреенни зоны вычленять.

Всем большое спасибо за советы.

 

Курите теорию R-функций. (Функции Рвачева).

 

Заинтересовало очень Ваше придложение с математической точки зрения.

Слышал о них, но дела с ними никогда не имел.

А посоветуйте книжечку пожалуйста.

В моих книжках по Вышке такого нет.

 

Курите теорию R-функций. (Функции Рвачева).

 

Заинтересовало очень Ваше придложение с математической точки зрения.

Слышал о них, но дела с ними никогда не имел.

А посоветуйте книжечку пожалуйста.

В моих книжках по Вышке такого нет.

 

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

 

Я Вам скриншёт сейчас пришлё.

Вот, как у меня это вышло, и как оно должно быть.

Красная линия - это трек. который надо обвести с определённой точностью.

Граница области, которую я строю - чёрная линия.

 

 

Это кусочек трека, обведённого моей прожкой.

 

Было бы интересно и математическим способом решить эту задачу.

post-40121-1238500639_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я Вам скриншёт сейчас пришлё.

Вот, как у меня это вышло, и как оно должно быть.

Н-да... Сформулировать задачу Вы так не удосужились... Формулировка: "типа, как на рисунке" - решению задачи не поможет. Повторюсь: грамотная формулировка задачи - половина решения!

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот, как у меня это вышло, и как оно должно быть.

Красная линия - это трек. который надо обвести с определённой точностью.

Граница области, которую я строю - чёрная линия.

 

Это кусочек трека, обведённого моей прожкой.

Забавно, как раз в левом верхнем углу этого скриншота находится мой офис! :beer:

post-40121-1238500639_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Надеюсь, что как определить углы между отрезками Вы догадаетесь самостоятельно...
Для тех, кто слаб в математике… Пусть на плоскости тремя точками заданы два отрезка АВ и ВС. Точка А не совпадает с точкой В; точка В не совпадает с точкой С. Точки заданы координатами x и y: точка А, например, имеет координаты xa и ya. Определить угол fi образованный отрезком ВС и продолжением отрезка АВ (см. рисунок).

post-16954-1238575706_thumb.jpg

Для определения угла fi в диапазоне от минус pi до плюс pi необходимо получить синус и косинус угла.

Косинус угла можно получить, если вспомнить скалярное произведение векторов

AB * BC * Cos fi = ABx * BCx + ABy * BCy

где AB и ВС – длина соответствующего вектора (отрезка); т.е. AB = Sqrt ( (xb-xa)^2 + (yb-ya)^2)

ABx и BCx– проекции вектора (отрезка) на ось Х; т.е. ABx = xb – xa

ABy и BСy – проекции вектора (отрезка) на ось Y

 

Синус угла получаем из произведения векторов

AB * BC * Sin fi = ABx * BCy - ABy * BCx

Обозначения – см. выше.

 

По найденным синусу и косинусу определяем угол. Обычно, в языках высокого уровня для этого используют функцию atan2(Sin fi,Cos fi).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Задачу решил подностью.

Всё с помощью тогоже битмапа.

Теперь есть и внутреении и наружнеи зоны.

И даже фильтрация излишних точек.

Получилось следующее:

 

Забавно, как раз в левом верхнем углу этого скриншота находится мой офис! :beer:

 

А мой тоже рядышком. :biggrin:

 

Для тех, кто слаб в математике… Пусть на плоскости тремя точками заданы два отрезка АВ и ВС. Точка А не совпадает с точкой В; точка В не совпадает с точкой С. Точки заданы координатами x и y: точка А, например, имеет координаты xa и ya. Определить угол fi образованный отрезком ВС и продолжением отрезка АВ (см. рисунок).

 

Для определения угла fi в диапазоне от минус pi до плюс pi необходимо получить синус и косинус угла.

Косинус угла можно получить, если вспомнить скалярное произведение векторов

AB * BC * Cos fi = ABx * BCx + ABy * BCy

где AB и ВС – длина соответствующего вектора (отрезка); т.е. AB = Sqrt ( (xb-xa)^2 + (yb-ya)^2)

ABx и BCx– проекции вектора (отрезка) на ось Х; т.е. ABx = xb – xa

ABy и BСy – проекции вектора (отрезка) на ось Y

 

Синус угла получаем из произведения векторов

AB * BC * Sin fi = ABx * BCy - ABy * BCx

Обозначения – см. выше.

 

По найденным синусу и косинусу определяем угол. Обычно, в языках высокого уровня для этого используют функцию atan2(Sin fi,Cos fi).

 

 

Спасибо за консультацию. С этими азами знаком. Но всё равно спасибо.

 

Н-да... Сформулировать задачу Вы так не удосужились... Формулировка: "типа, как на рисунке" - решению задачи не поможет. Повторюсь: грамотная формулировка задачи - половина решения!

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

 

 

 

На счёт задачи формулировки задачи я с Вами полностью согласен.

У меня не очень просто большой опыт спрашивания.

Спасибо за советы.

Буду пробовать.

Идея конечно ясна.

Ещё раз спасибо! :rolleyes:

screen.bmp

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Опять "тень на плетень" навели, - область внутри петли у вас не выбрана оказалась. Незачет. :biggrin:

"Битмап", как вы изволили выразится, это матрично-сеточное решение.

Хотя, жить вам...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Опять "тень на плетень" навели, - область внутри петли у вас не выбрана оказалась. Незачет. :biggrin:

"Битмап", как вы изволили выразится, это матрично-сеточное решение.

Хотя, жить вам...

 

Где что не выбрано???

На последнем моём прикрёплённом файлике внутреннии зоны рисуются.

И впринципе в моём алгоритме можно задать сначала, какой должна быть площадь внутренних зон, чтобы её выбирать.

Получилось просто всё очень удобно.

Ещё подключил алгоритмик, чтобы убрать лишнюю избыточность точек.

На некоторых кривых по 1000 точек достаточно всего 100 моих.

 

Ещё раз всем большое спасибо за советы.

 

Могу подробно описать, как делал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...