Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ломаную линию в мягкую кривую с аппроксимацией 
V
    Опции темы
SwordOfDeath
Дата 31.1.2011, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 16.10.2007

Репутация: нет
Всего: нет



Привет,

Задача состоит вот в чем. У меня есть ломаная линия полученная от перемещений курсора. На выходе хочу получить гладкую кривую.
Но таких кривых будет много с большим количеством точек, поэтому нужно упрощать количество точек.
Приведу иллюстрацию отдаленно напоминающую чего я хочу добиться:
user posted image
На картинке ломаная преобразована в кубическую кривую. А мне нужно в итоге получить квадратическую кривую(с 3 точками), её проще рисовать. Такого витка получить не получиться но основную идею я надеюсь вы уловили.

Просто сгладить ломаную с помощью алгоритма Cardinall B-Spline мне не достаточно так как он выдает кубические кривые для каждого из отрезков в ломаной. В итоге это все будет жутко жрать ресурсы.

Вобщем я в поисках эффективного алгоритма который сочитает в себе и сглаживание подобно Cardinall B-Spline, и упрощение количества отрезков.

По сути этот процесс обратный к растеризации кривой учитывая небольшое отклонение.

Если кто-то сталкивался с подобной задачей подскажите где копать.

ПС. На отличное решение данной задачи можно поглядеть в Adobe Flash(у меня CS4)

Это сообщение отредактировал(а) SwordOfDeath - 31.1.2011, 15:15
PM MAIL   Вверх
Earnest
Дата 31.1.2011, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 7
Всего: 183



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


--------------------
...
PM   Вверх
SwordOfDeath
Дата 1.2.2011, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 16.10.2007

Репутация: нет
Всего: нет



Спасибо, буду копать... Пока себе смутно представляю как сюда гауса применить О_О
PM MAIL   Вверх
Earnest
Дата 1.2.2011, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 7
Всего: 183



Да легко. Простейший случай - берем окно размером 3 точки, фильтр будет такой {0.25, 0.5, 0.25}. Сглаживаем точки линии с таким фильтром. При этом предполагается, что точки более-менее эквидистантны. Если сильно не так, нужно ресемлировать.


--------------------
...
PM   Вверх
SwordOfDeath
Дата 1.2.2011, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 16.10.2007

Репутация: нет
Всего: нет



Спасибо... Теперь до меня дошло = )

Для меня не важна скорость алгоритма сглаживания... даже наоборот лучше часть сложности отрисовки перебросить на сглаживание и аппроксимацию. И скорее всего тут не ресамплингом буду делать... а коэффициенты от расстояния...

Кажется все в голове прояснилось...
Как жаль что математику не учил =\
PM MAIL   Вверх
SwordOfDeath
  Дата 1.2.2011, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 16.10.2007

Репутация: нет
Всего: нет



Нашел алгоритмы которые я искал!

Алгоритмы аппроксимации:
http://www.softsurfer.com/Archive/algorith...orithm_0205.htm
Алгоритм построения кривой из ломаной
http://en.wikipedia.org/wiki/Levenberg%E2%...uardt_algorithm
реализация LM на C:
http://www.messen-und-deuten.de/lmfit/lmfit.html

Видео:
http://www.youtube.com/watch?v=v63NAzQE7Bw

Вот это именно тот результат на который я рассчитывал.

Это сообщение отредактировал(а) SwordOfDeath - 1.2.2011, 18:41
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0595 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.