|
Вопрос по алгоритму определения границы кривой, Возник сложный вопрос и нигде не могу найти ответ! |
|
|
|
Mar 20 2009, 09:54
|
Частый гость
 
Группа: Участник
Сообщений: 184
Регистрация: 11-09-08
Пользователь №: 40 121

|
Добрый день! Помоги пожалуйста, или хотя бы посоветуйте! Мне стоит задача придумать алгоритм, с помощью которого можно определить только внешнюю границу любой кривой линии, любой любой, и только внешнюю. Внутрь заходить не должны. В наличии только координыты точек исходной кривой! Я сам придумал с нуля четыре алгаритма, все по своему хороши, но меняется какое-то уовие и они подвисают. Посоветуйте что-нибудь, хотя бы где почитать. Буду рад любому ответу! Заранее спасибо! Замечание модератора. Заголовок темы следует давать осмысленный, как того требует п.2.1в Правил форума. Отредактировал. rezident.
|
|
|
|
|
Mar 20 2009, 10:12
|
Местный
  
Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782

|
Цитата(Prinz @ Mar 20 2009, 12:54)  Мне стоит задача придумать алгоритм, с помощью которого можно определить только внешнюю границу любой кривой линии, любой любой, и только внешнюю. Внутрь заходить не должны. В наличии только координыты точек исходной кривой! Я сам придумал с нуля четыре алгаритма, все по своему хороши, но меняется какое-то уовие и они подвисают. Посоветуйте что-нибудь, хотя бы где почитать. Это стеб?
Причина редактирования: Излишнее цитирование.
|
|
|
|
|
Mar 20 2009, 10:29
|
Частый гость
 
Группа: Участник
Сообщений: 184
Регистрация: 11-09-08
Пользователь №: 40 121

|
Цитата(Rst7 @ Mar 20 2009, 15:11)  Кривая замкнута, как я понимаю? Сейчас нарисую.
|
|
|
|
|
Mar 20 2009, 13:01
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(Prinz @ Mar 20 2009, 12:54)  Мне стоит задача придумать алгоритм, с помощью которого можно определить только внешнюю границу любой кривой линии, любой любой, и только внешнюю. Правильная формулировка задачи - половина решения! Что значит "внешнюю границу"? Кривая, наверное, замкнутая? Если кривая делит плостость (а, плоскость ли?) на "внутренность" и "внешность", то сама она и будет границей. Сложность у Вас, наверное, в том, что кривая имеет "петли". Так ли? В этом случае необходимо обнаружить такие "петли", разбить кривую на несколько (каждая из которых замкнутая и не содержит "петель" -т.е. произвести декомпозицию) и некоторые замкнутые кривые, лежащие целиком "внутри" других кривых, - исключить... Впрочем, алгоритм будет сильно зависить от условия задачи: например, как задана кривая - аналитически, отрезками или нарисована каким-то цветом на рисунке (матрица цветов пикселей, например)... PS. Не заметил, что заданы точки кривой... Навскидку - наметки как разбить алгоритм на два алгоритма: 1) подойти от точки заведомо лежащей вне кривой до упора в кривую 2) обойти вдоль кривой (по часовой стрелке, например), отмечая точки кривой, соприкасающиеся с точкой обхода. К каждому пункту придумать алгоритм - уже легче...
|
|
|
|
|
Mar 21 2009, 08:27
|
Частый гость
 
Группа: Участник
Сообщений: 184
Регистрация: 11-09-08
Пользователь №: 40 121

|
Вот, как это должно выглядить! Вчера никак не мог на сайт загрузить, он просто не работал у меня! Ещё сложность в том, что кривая задана отрезками и точки между отрезками неравномерны! Тоесть, изменение направление - много точек, движение по прямой - то точек мало! ТОесть они редки! Для обведения по кругу просто кривой уже четыре олгаритма придумал! И метод по касательно может не помочь, так как например в этом напралении модет не быть точек, а линия есть! Всем спасибо за советы. Готов ещё выслушать предложения. А кто может посоветовать какую-нибудь книгу???
Эскизы прикрепленных изображений
|
|
|
|
|
Mar 21 2009, 08:53
|
Частый гость
 
Группа: Участник
Сообщений: 184
Регистрация: 11-09-08
Пользователь №: 40 121

|
А кто-нибудь знаком с файлом фомата .plt для OziExplorer? Вот в этом файле даны точки кривой от начала до конца. Из него я и считываю. Перерисовал заного! Здесь ещё наиболее сностный вариант! НАчало и конец могут совпадать! Если надо могу ещё более подробно описать. На границе не указал точки, но их должно быть мало. Тоесть наиного меньше чем на основной кривой. Но точность тоже должна быть.
Эскизы прикрепленных изображений
|
|
|
|
|
Mar 21 2009, 08:54
|

Профессионал
    
Группа: Свой
Сообщений: 1 724
Регистрация: 1-05-05
Из: Нью Крыжопыль
Пользователь №: 4 641

|
Вся исследуемая площадь устанавливается, исходя из максимальных и минимальных координат имеющихся точек и, исходя из нужной точности, представляется в виде двухкоординатной равномерной сетки. По трем соседним точкам восстанавливается треугольник. Координаты всех его вершин известны. Определяется его площадь. Если она не равна 0, то точки не лежат на прямой - и можно определить, какие точки сетки попадают в него, а какие - нет. В матрицу точек сетки записываем признак попадания-непопадания. Берем следующий треугольник, модифицируем матрицу. Остановка процесса по исчерпанию количества точек кривой. Значения признаков в матрице, "окруженные" признаками противоположного значения, инвертируются. Впрочем, наверное, это сложно для вас. Бросьте это безнадёжное дело.
|
|
|
|
|
Mar 21 2009, 09:04
|
Частый гость
 
Группа: Участник
Сообщений: 184
Регистрация: 11-09-08
Пользователь №: 40 121

|
Цитата(zzzzzzzz @ Mar 21 2009, 13:54)  Впрочем, наверное, это сложно для вас. Бросьте это безнадёжное дело.  Не надо оскарблять. Я тоже могу. Во-вторых это может не пракатить! Три соседнии точки которые вы говорите могут быть в начале и конце массива координат. В - третьих я говорю. Точки может не быть, а прямая линия там проходить будет и ваш алгоритм просто её не заметит. Уже так нагревался. Обратите внимание на рисуночек. Это не просто графика. Это работа с координатами GPS. Я уже сделал четыре программы на векторном анализе. НЕ знаю на сколько это сложно для вас? Но при определённых условия анализ не проходит. И ваш метод при большом треке, например Москва - Владивосток, просто не прокатит. Памяти не хватит!
|
|
|
|
|
Mar 21 2009, 09:23
|
Частый гость
 
Группа: Участник
Сообщений: 184
Регистрация: 11-09-08
Пользователь №: 40 121

|
Цитата(zzzzzzzz @ Mar 21 2009, 14:06)  Это не "оскарбление", а чистая констатация факта - вы не можете даже условия задачи сформулировать нормально. И, судя по аргументации, эту задачу не сможете решить ближайшие несколько лет  . Хотя, удачи вам, конечно. Я же Вашими способностями умственными не интересуюсь. Мне нужен совет,а не Ваши шуточки. А решения же четыре есть, за неделю! И ещё прочитай внимательнее , что я написал. Там указана вся специфичность задачи.
Причина редактирования: Излишнее цитирование.
Эскизы прикрепленных изображений
|
|
|
|
|
Mar 21 2009, 09:23
|
Местный
  
Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782

|
Цитата(Prinz @ Mar 21 2009, 12:16)  Я же Вашими способностями умственными не интересуюсь. Мне нужен совет! Речь не идет ни о чьих способностях, ни умственных. ни о каких других. От Вас хотят допытаться нормальной формулировки Вашей задачи.
|
|
|
|
|
Mar 21 2009, 09:28
|
Частый гость
 
Группа: Участник
Сообщений: 184
Регистрация: 11-09-08
Пользователь №: 40 121

|
Цитата(VladimirYU @ Mar 21 2009, 14:23)  Речь не идет ни о чьих способностях, ни умственных. ни о каких других. От Вас хотят допытаться нормальной формулировки Вашей задачи. Спросите меня пожалуйста, что конкретно Вам не понятно, я постараюсь это место подробнеее описать. Дан файл .plt. Из наго я считываю координаты по порядку движения по кривой. При движении по прямой, точки идут очен редко и это очень плохо. Из-за этого случаются сбои. При изменении направления точки идут часто и тут всё хорошо! Мне интереснее, как отфильтровать внутрении точки кривой. Что мне ещё указать во втором приведённом рисунке?
|
|
|
|
|
Mar 21 2009, 09:32
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Попробую протелепатить... Вот (возможно, неверная и неполная) постановка задачи и примерное решение.
Дано: 1. На плоскости отрезками прямой задана ломаная линия. 2. Начало каждого следующего отрезка совпадает с концом предыдущего 3. Ломаная линия не обязательно должна быть замкнутой, т.е. точка начала первого отрезка может не совпадать с конечной точкой последнего отрезка 4. Отрезки, составляющие ломаную линию, могут пересекать друг друга 5. Ломаная линия, возможно, делит плоскость на несколько областей; области ограниченные ломаной кривой - внутренние, не ограниченная - внешняя (она одна)
Найти: Все (одну или несколько, а, может быть, и не одной - в случаи, если ломаная не ограничила ни одну область) ломаных линий, являющимися границами между внешней областью и внутренними.
Решение: 1. Попарно находятся пересекающиеся отрезки ломаной, и в точках пересечения разбиваются каждый на два отрезка. 2 Находим все замкнутые участки ломаной (это будут границы внутренних областей) 3. Попарно проверяются внутренние области, ограниченные этими замкнутыми участками ломаной на предмет вхождения одной области в другую; если область входит в другую, то ломаная - граница области исключается (удаляется) 4 Оставшиеся ломаные – решение
|
|
|
|
|
Mar 21 2009, 09:55
|
Частый гость
 
Группа: Участник
Сообщений: 184
Регистрация: 11-09-08
Пользователь №: 40 121

|
Цитата(Палыч @ Mar 21 2009, 14:32)  Решение: 1. Попарно находятся пересекающиеся отрезки ломаной, и в точках пересечения разбиваются каждый на два отрезка. 2 Находим все замкнутые участки ломаной (это будут границы внутренних областей) 3. Попарно проверяются внутренние области, ограниченные этими замкнутыми участками ломаной на предмет вхождения одной области в другую; если область входит в другую, то ломаная - граница области исключается (удаляется) 4 Оставшиеся ломаные – решение Спасибо большое. Ваш алгоритм мне кажется из приведённых наиболее приевлимым. Я делал так. Я сам строил вектор под определённым углом, и определял его персечение с отрезками, но оказалось, что для этого софта нужен был супер компутер! 10 ядерный минимум. Следующую версию программы я буду опираться на Ваш совет. Большое спасибо. Кто ещё что посоветует? А кто посоветует книжечку??? Даже с графикой связанную, с примерно такой же задачей.
Причина редактирования: Излишнее цитирование.
|
|
|
|
|
Mar 21 2009, 10:11
|
Частый гость
 
Группа: Свой
Сообщений: 142
Регистрация: 18-02-08
Из: Челябинск
Пользователь №: 35 141

|
Цитата(Prinz @ Mar 21 2009, 14:23)  Там указана вся специфичность задачи. С треками все понятно, но Вы на всех рисунках обводите область трека с некоторым запасом, это что?
|
|
|
|
|
Mar 22 2009, 10:00
|
Частый гость
 
Группа: Участник
Сообщений: 184
Регистрация: 11-09-08
Пользователь №: 40 121

|
Цитата(Ledmaster @ Mar 21 2009, 15:11)  С треками все понятно, но Вы на всех рисунках обводите область трека с некоторым запасом, это что? Надо треку внутри находиться это области. Но тут не сложно, если границу внешнюю знаем, то к ней просто добавить - это не сложно. Цитата(Палыч @ Mar 21 2009, 15:00)  PS. Кстати, постановка задачи в моей редакции с приведенными рисунками как-то плохо коррелирует... А что именно плохо коррелирует??? Поясните. Что Вам не нравится. Мне кажется с последними моими рисунками очень даже коррелирует. А какие у Вас есть ещё предложения? Посоветуйте пожалуйста. А не знаете какие-нибудь книжки???
|
|
|
|
|
Mar 22 2009, 10:36
|
Местный
  
Группа: Свой
Сообщений: 443
Регистрация: 22-07-06
Из: Украина, г. Харьков
Пользователь №: 19 006

|
По моему, то, что у вас точки соединены линиями всех только запутывает. На мой взгляд задачу следовало бы сформулировать так: Имеется множество точек на плоскости, необходимо построить замкнутую ломаную таким образом, чтобы ни одна из точек не осталась за границей области, очерченной этой ломаной. Ломаная при этом будет соединять некоторые, но не все, имеющиеся точки. Потом уже, при необходимости от полученной кривой можно бдет сделать отступ, чтоб был запас, как на приведенных рисунках. Простейший способ решения здесь уже указывался, про треугольники, надо только брать треугольники не только из близлежащих точек, а вообще из всех возможных комбинаций из трех точек. Т. е. берем три точки, проверяем, находится ли какая-либо точка внутри полученного треугольника, и, если находится - исключаем ее из множества точек, по которым будет проведена граница. Перебираем таким образом все возможные треугольники. В результате у нас останутся только те точки, по которым нужно провести границу. Соединяем их ломаной (каждую точку с двумя ближайшими) и получаем то, что, как я понимаю, требовалось найти. Решение довольно громоздкое, и если результат работы алгоритма будет давать удовлетворяющие вас результаты, то можно будет думать, как его упростить. З.Ы. Придумал еще алгоритм  . Соединить имеющиеся точки все со всеми, а потом исключить все линии, которые пересекаются. Останется только внешний контур.
|
|
|
|
|
Mar 22 2009, 11:02
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(Prinz @ Mar 22 2009, 13:00)  А что именно плохо коррелирует??? Поясните. Что Вам не нравится. Мне кажется с последними моими рисунками очень даже коррелирует. Ну, например: 1) Я считал что граница - часть самой ломанной. Вы её рисуете на некотором (иногда, давольно значительном) расстоянии от ломаной. 2) В моей редакции задачи - если ломанная состоит из одного отрезка, то внутренних областей нет (и соответственно границы). В Вашем рисунке - есть. Что же такое Ваш термин "граница" - мне так до сих пор и непонятно. Цитата(Artem_Petrik @ Mar 22 2009, 13:36)  На мой взгляд задачу следовало бы сформулировать так... Мы, конечно, можем придумывать формулировки задачи, но достоверно её знает только автор вопроса, который до сих пор не удосужился её сформулировать. У меня закрались мысли, что автор решает какую-то задачу (возможно, довольно простую), сложным путём, и один из шагов её решения - задача, которую мы "решаем" но не имеем её формумировки. Чуть выше автор говорил о фильтрации точек. Нужно уменьшить число точек кривой - заменить другой ломаной с меньшим числом отрезков? И при этом, чтобы трек не "уходил" от исходного более чем на Х метров? Элементарная задачаю. По-моему: математика - первый (может быть - второй) семестр института. Наверное, это и есть основная задача. При чём тут границы - мне не понятно.
|
|
|
|
|
Mar 22 2009, 11:36
|

Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 6-08-07
Из: Приднестровье, Тирасполь
Пользователь №: 29 581

|
Цитата(Prinz @ Mar 21 2009, 12:28)  ...При движении по прямой, точки идут очен редко и это очень плохо. Из-за этого случаются сбои... Качественное определение "очень редко" имеет выражение в количественном представлении? Если да, то почему бы в нужных случаях не применить интерполяцию, дополнив прямую нужными точками?..
--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
|
|
|
|
|
Mar 22 2009, 13:52
|
Частый гость
 
Группа: Участник
Сообщений: 184
Регистрация: 11-09-08
Пользователь №: 40 121

|
Цитата(Artem_Petrik @ Mar 22 2009, 15:36)  По моему, то, что у вас точки соединены линиями всех только запутывает. На мой взгляд задачу следовало бы сформулировать так: Имеется множество точек на плоскости, необходимо построить замкнутую ломаную таким образом, чтобы ни одна из точек не осталась за границей области, очерченной этой ломаной. Ломаная при этом будет соединять некоторые, но не все, имеющиеся точки. Потом уже, при необходимости от полученной кривой можно бдет сделать отступ, чтоб был запас, как на приведенных рисунках. Нет, точки поступают последовательно. Например: - начало движения - это одна точка. - следующая точка, следующее положения. - от точки до следующей точки строится трек. - при движении по прямой точки ставятся редко о получаются такие пересечения, как на рисунке. - рисуночек схемотичный. Спасибо за совет. Цитата(Палыч @ Mar 22 2009, 16:02)  Нужно уменьшить число точек кривой - заменить другой ломаной с меньшим числом отрезков? И при этом, чтобы трек не "уходил" от исходного более чем на Х метров? Элементарная задачаю. По-моему: математика - первый (может быть - второй) семестр института. Наверное, это и есть основная задача. При чём тут границы - мне не понятно. Тут впринципе если Ваш метод получится реализовать, то на некотороном удалении построить легко. Мне надо как бы очертить зону где находится этот трек. Для этого я думаю, что надо сначало найти границу. Вы дали наиболее правильную трактовку задачи. Но я ещё раз попробую написать: Есть файл. В нём координаты точек, по мери их поступления. Первая точка соединяется со второй и т.д. И т.д. Могут возникать пересечения. Первый рисунок не удачен, но последующии наиболее точно показывает смысл задачи! Цитата(Goodefine @ Mar 22 2009, 16:36)  Качественное определение "очень редко" имеет выражение в количественном представлении? Если да, то почему бы в нужных случаях не применить интерполяцию, дополнив прямую нужными точками?.. В ряде случаев это делать не надо. А если дополнять, то дополнять придётся по всему треку! Конечно это облегчит задачу. Цитата(Палыч @ Mar 22 2009, 16:02)  Чуть выше автор говорил о фильтрации точек. Я про фильтрацию имел ввиду, отфильтровать внутренни точки, тоесть оставить лишь одну линии - внешнюю! Оставить только внешнии отрезки. Ещё раз попобую задачу объяснить: - точка - следующая - между ними трек - и т.д. - таким образом апроксимируется кривая , которая может изгибаться, как хочет, как например на моём первом рисунке. - Нам надо построить нашу кривую, которая будет определять границу зоны, где находится наша петляющая кривая! - Впринципе зона может быть точно по границе кривой линии (внешней)! Спасибо ещё раз всем за подсказки.
Причина редактирования: Излишее бездумное цитирование.
|
|
|
|
|
Mar 22 2009, 14:16
|
Гуру
     
Группа: Свой
Сообщений: 3 106
Регистрация: 18-04-05
Пользователь №: 4 261

|
Цитата(Prinz @ Mar 22 2009, 16:52)  Нет, точки поступают последовательно. - Нам надо построить нашу кривую, которая будет определять границу зоны, где находится наша петляющая кривая! - Впринципе зона может быть точно по границе кривой линии (внешней)! По-моему, всё просто: 1. Соединяете ваши точки в порядке их следования отрезками, получая таким образом непрерывную кривую. 2. Двигаясь от начала кривой, при каждом попадании в точку самопересечения кривой выбираете самый правый сегмент кривой и далее двигаетесь вдоль него. 3. Если начало кривой находится внутри границы зоны, в качестве начальной точки можно выбрать любую точку на границе зоны, например точку для которой координата X (или Y) минимальна (или максимальна). При любом выборе начальной точки направление обхода кривой должно быть "против часовой стрелки". 4. Обход завершается при попадании в точку из которой обход был начат.
Сообщение отредактировал blackfin - Mar 22 2009, 14:21
|
|
|
|
|
Mar 23 2009, 11:40
|
Частый гость
 
Группа: Участник
Сообщений: 184
Регистрация: 11-09-08
Пользователь №: 40 121

|
Сегодня попробовал написать алгоритм по совету. НА простых треках работает всё, но есть треки, где касичкой идёт всё,там всё намертво повисает. Нисего не помогает.  (((((((((((((((((((((( У меня горе просто! Есть очень кривыии линии. Со всяки провальчиками, пычками. ОТфильтруешь одно, третье вылазит. Треть, четвёртое. У меня уже прога листов на 10 получилась. На одном работает, треий подключил, всё съехало. А кто-нибудь с такой задачей сталкивался?
|
|
|
|
|
Mar 23 2009, 17:38
|
Частый гость
 
Группа: Свой
Сообщений: 142
Регистрация: 18-02-08
Из: Челябинск
Пользователь №: 35 141

|
Цитата(Prinz @ Mar 23 2009, 16:40)  Нисего не помогает.  (((((((((((((((((((((( У меня горе просто! Есть очень кривыии линии. Со всяки провальчиками, пычками. ОТфильтруешь одно, третье вылазит. Треть, четвёртое. У меня уже прога листов на 10 получилась. На одном работает, треий подключил, всё съехало. То, что не решается аналитически, можно решить графически: отрисуйте треки в битмап ( достаточно бит на точку, много еста не займет), тогда задача сведется к банальной заливке области. Если начальную точку выбрать гарантированно во внешней области, как раз гарантированно зальется все, что вне. З.Ы. чтобы не было "протеканий" во внутрь, треки нужно рисовать толстыми линиями. Как раз получится отступ, который Вы рисовали, в половину толщины линии.
Сообщение отредактировал Ledmaster - Mar 23 2009, 17:42
|
|
|
|
|
Mar 31 2009, 12:01
|
Частый гость
 
Группа: Участник
Сообщений: 184
Регистрация: 11-09-08
Пользователь №: 40 121

|
Цитата(blackfin @ Mar 23 2009, 16:46)  А что за совет? А то советов, вроде, много было.. Решение: 1. Попарно находятся пересекающиеся отрезки ломаной, и в точках пересечения разбиваются каждый на два отрезка. 2 Находим все замкнутые участки ломаной (это будут границы внутренних областей) 3. Попарно проверяются внутренние области, ограниченные этими замкнутыми участками ломаной на предмет вхождения одной области в другую; если область входит в другую, то ломаная - граница области исключается (удаляется) 4 Оставшиеся ломаные – решение Цитата(Ledmaster @ Mar 23 2009, 22:38)  То, что не решается аналитически, можно решить графически: отрисуйте треки в битмап ( достаточно бит на точку, много еста не займет), тогда задача сведется к банальной заливке области. Если начальную точку выбрать гарантированно во внешней области, как раз гарантированно зальется все, что вне.
З.Ы. чтобы не было "протеканий" во внутрь, треки нужно рисовать толстыми линиями. Как раз получится отступ, который Вы рисовали, в половину толщины линии. Решил задачу аналогично вашему совету. Сожалею, что поздно прочитал Ваш совет, а то неделю думал, голову ломал. Работает просто всё шикарно. Теперь буду выделять внутреннии области. Если необходимо могу моим последователям выложить код программки на билдере. Буду аналогично внутреенни зоны вычленять. Всем большое спасибо за советы. Цитата(Ledmaster @ Mar 23 2009, 22:38)  То, что не решается аналитически, можно решить графически: отрисуйте треки в битмап ( достаточно бит на точку, много еста не займет), тогда задача сведется к банальной заливке области. Если начальную точку выбрать гарантированно во внешней области, как раз гарантированно зальется все, что вне.
З.Ы. чтобы не было "протеканий" во внутрь, треки нужно рисовать толстыми линиями. Как раз получится отступ, который Вы рисовали, в половину толщины линии. Решил задачу аналогично вашему совету. Сожалею, что поздно прочитал Ваш совет, а то неделю думал, голову ломал. Работает просто всё шикарно. Теперь буду выделять внутреннии области. Если необходимо могу моим последователям выложить код программки на билдере. Буду аналогично внутреенни зоны вычленять. Всем большое спасибо за советы. Цитата(_Pasha @ Mar 23 2009, 17:22)  Курите теорию R-функций. (Функции Рвачева). Заинтересовало очень Ваше придложение с математической точки зрения. Слышал о них, но дела с ними никогда не имел. А посоветуйте книжечку пожалуйста. В моих книжках по Вышке такого нет. Цитата(_Pasha @ Mar 23 2009, 17:22)  Курите теорию R-функций. (Функции Рвачева). Заинтересовало очень Ваше придложение с математической точки зрения. Слышал о них, но дела с ними никогда не имел. А посоветуйте книжечку пожалуйста. В моих книжках по Вышке такого нет. Цитата(Палыч @ Mar 23 2009, 16:52)  В том то и дело, что Вашу задачу никто толком понять не может. Я так понимаю - фильтрация точек трека... Но не понимаю по какому принципу. Какой Вы применили алгоритм? Что не получается (в каком случае алгоритм не работает)? Я Вам скриншёт сейчас пришлё. Вот, как у меня это вышло, и как оно должно быть. Красная линия - это трек. который надо обвести с определённой точностью. Граница области, которую я строю - чёрная линия. Это кусочек трека, обведённого моей прожкой. Было бы интересно и математическим способом решить эту задачу.
Эскизы прикрепленных изображений
|
|
|
|
|
Mar 31 2009, 14:45
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(Prinz @ Mar 31 2009, 15:01)  Я Вам скриншёт сейчас пришлё. Вот, как у меня это вышло, и как оно должно быть. Н-да... Сформулировать задачу Вы так не удосужились... Формулировка: "типа, как на рисунке" - решению задачи не поможет. Повторюсь: грамотная формулировка задачи - половина решения! Цитата(Prinz @ Mar 31 2009, 15:01)  Было бы интересно и математическим способом решить эту задачу. Наверное, решение - есть. Но, вот, постановки задачи -нет. Если не принимать во внимание, что границу Вы проводите на некотором расстоянии от трека и "сглаживаете" углы границы, а провести границу по линиям трека, то задача, имхо, элементарная. Обойдите свой трек по отрезкам, в каждом узле или точке пересечения отрезков трека выбирая самый "левый" отрезок трека (т.е. обход трека "по часовой стрелке"), затем проделайте те же действия, но "против часовой стрелки". Выбор самого "левого" ("правого") отрезков осуществляйте по значению углов между последним отрезком границы и отрезками возможного продолжения обхода. Надеюсь, что как определить углы между отрезками Вы догадаетесь самостоятельно...
|
|
|
|
|
Apr 1 2009, 08:53
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(Палыч @ Mar 31 2009, 17:45)  Надеюсь, что как определить углы между отрезками Вы догадаетесь самостоятельно... Для тех, кто слаб в математике… Пусть на плоскости тремя точками заданы два отрезка АВ и ВС. Точка А не совпадает с точкой В; точка В не совпадает с точкой С. Точки заданы координатами 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).
|
|
|
|
|
Apr 8 2009, 11:02
|
Частый гость
 
Группа: Участник
Сообщений: 184
Регистрация: 11-09-08
Пользователь №: 40 121

|
Задачу решил подностью. Всё с помощью тогоже битмапа. Теперь есть и внутреении и наружнеи зоны. И даже фильтрация излишних точек. Получилось следующее: Цитата(Ledmaster @ Apr 1 2009, 00:38)  Забавно, как раз в левом верхнем углу этого скриншота находится мой офис!  А мой тоже рядышком.  Цитата(Палыч @ Apr 1 2009, 13:53)  Для тех, кто слаб в математике… Пусть на плоскости тремя точками заданы два отрезка АВ и ВС. Точка А не совпадает с точкой В; точка В не совпадает с точкой С. Точки заданы координатами 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). Спасибо за консультацию. С этими азами знаком. Но всё равно спасибо. Цитата(Палыч @ Mar 31 2009, 19:45)  Н-да... Сформулировать задачу Вы так не удосужились... Формулировка: "типа, как на рисунке" - решению задачи не поможет. Повторюсь: грамотная формулировка задачи - половина решения! Наверное, решение - есть. Но, вот, постановки задачи -нет. Если не принимать во внимание, что границу Вы проводите на некотором расстоянии от трека и "сглаживаете" углы границы, а провести границу по линиям трека, то задача, имхо, элементарная. Обойдите свой трек по отрезкам, в каждом узле или точке пересечения отрезков трека выбирая самый "левый" отрезок трека (т.е. обход трека "по часовой стрелке"), затем проделайте те же действия, но "против часовой стрелки". Выбор самого "левого" ("правого") отрезков осуществляйте по значению углов между последним отрезком границы и отрезками возможного продолжения обхода. Надеюсь, что как определить углы между отрезками Вы догадаетесь самостоятельно... На счёт задачи формулировки задачи я с Вами полностью согласен. У меня не очень просто большой опыт спрашивания. Спасибо за советы. Буду пробовать. Идея конечно ясна. Ещё раз спасибо!
Прикрепленные файлы
screen.bmp ( 165.18 килобайт )
Кол-во скачиваний: 18
|
|
|
|
|
Apr 21 2009, 07:32
|
Частый гость
 
Группа: Участник
Сообщений: 184
Регистрация: 11-09-08
Пользователь №: 40 121

|
Цитата(zzzzzzzz @ Apr 8 2009, 16:34)  Опять "тень на плетень" навели, - область внутри петли у вас не выбрана оказалась. Незачет. "Битмап", как вы изволили выразится, это матрично-сеточное решение. Хотя, жить вам... Где что не выбрано??? На последнем моём прикрёплённом файлике внутреннии зоны рисуются. И впринципе в моём алгоритме можно задать сначала, какой должна быть площадь внутренних зон, чтобы её выбирать. Получилось просто всё очень удобно. Ещё подключил алгоритмик, чтобы убрать лишнюю избыточность точек. На некоторых кривых по 1000 точек достаточно всего 100 моих. Ещё раз всем большое спасибо за советы. Могу подробно описать, как делал.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|