![]() |
|
![]() ![]() ![]() |
|
evilguard |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 19.11.2006 Репутация: нет Всего: нет |
У меня есть координаты точек ломаной. Использую библиотеку QT для GUI - там есть свой графический движок, и в частности такая функция:
http://doc.trolltech.com/4.1/qpainterpath.html#cubicTo В функцию в качестве аргументов задаются 3 точки c1, c2 и endPoint. Функция чертит кривую из текущей точки в endPoint, c1 и c2 используются для задания кривизны. Вопрос, как с помощью этого инструментария сгладить ломаную в плавную линию? Надо каким-то образом задать параметры c1 и c2, чтобы производные двух кривых в общей точке совпадали. |
|||
|
||||
SoWa |
|
|||
![]() Харекришна ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2422 Регистрация: 18.10.2004 Репутация: 6 Всего: 74 |
Код функции в студию!
А то алгоритмов можно кучу придумать, чтобы кривизну придавать. И производная в декартовых координатах - не предел мечты. Может там с полярными неплохо можно поколдовать? Или там кода как раз нету? -------------------- Всем добра ![]() |
|||
|
||||
evilguard |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 19.11.2006 Репутация: нет Всего: нет |
SoWa
В смысле, а код функции разве нужен? Это же вроде как стандартно для кривой безье - две опорные точки и две управляющие. Код порылся не нашел. Я имел в виду, используя данную функцию, то есть что-то типа:
мы можем подобрав координаты управляющих точек кривой безье сгладить ломаную в том числе и в точках перелома. вопрос в том как подобрать параметры c1 и c2. Это сообщение отредактировал(а) evilguard - 20.3.2007, 21:13 |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 7 Всего: 183 |
Опорные точки можно по-разному трактовать. Так что кто знает, как там они считают. Кстати то, что там по ссылке нарисовано, как-то странно выглядит... Мне кажется удобным использовать опорные точки так, чтобы они вместе с началом-концом задавали четырехугольник, в который кривая некоторым образом вписывается. Эти точки вычисляются как начало (конец) + касательный вектор, амплитуда которого определяет высоту горба. Если хочешь, могу привести все вычисления с нуля (на С++).
-------------------- ... |
|||
|
||||
MBo |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 234 Регистрация: 10.6.2002 Репутация: 5 Всего: 18 |
Рассчитай какие-либо кубические сплайны (да хоть Кэтмулл-Рома, раз гладкости по первой производной хватит), и переведи их в форму Безье (в базис полиномов Бернштейна)
|
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 7 Всего: 183 |
Да, действительно, чтобы кривая гладко и красиво прошла через все точки, не стоит строить отдельные кривые между каждой парой точек - получишь кучу ничем не вызванных извивов. Лучше сплайны. И в форму Безье их вовсе не обязательно переводить - чем сплайны-то хуже.
-------------------- ... |
|||
|
||||
evilguard |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 19.11.2006 Репутация: нет Всего: нет |
Проблема в инструментарии, используемого мной API - он мне дан в виде такой функции - cubicTo. Проверил ее - вроде она строит настоящую кривую Безье, то есть вписанную в четырехугольник, образованный точками currentpoint, c1, c2 и endpoint, и по окончании перемещает текущую точку в endpoint. Кривая касается отрезков. Так что в библиотеке все нормально.
В принципе я понял примерно как это сделать, надо находить координаты точек c1 и c2 так, чтобы для одной опорной точки соседние управляющие точки лежали на одной прямой. Это еще пол-беды, то есть мы только направление вектора определили, а как правильно подобрать амплитуду? Earnest Код конечно можно, спасибо, но мне нужно использовать инструментарий библиотеки QT - то есть ту функцию. Это сообщение отредактировал(а) evilguard - 20.3.2007, 23:31 |
|||
|
||||
evilguard |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 19.11.2006 Репутация: нет Всего: нет |
http://keep4u.ru/full/070320/91c47d9797242da533/jpg
Вот рисунок, с небольшой иллюстрацией. Точки А1, А2, А3 - точки ломаной, которую хочу сгладить. Данная ломаная сглаживается двумя кривыми - (А1, с1, с2, А2) и (А2, с3, с4, А3). Надо то есть найти подходящие координаты точек с1, с2, с3, с4. Я делал так(в painte) - с2 лежит на биссектрисе между векторами А2А1 и А3А2, с3 лежит на биссектрисе А1А2 и А2А3. Тогда точки с2 и с3 будут лежать на одной прямой. Это все можно алгоритмизировать. То есть направление - по биссектриссе. Но как найти амплитуду, то есть расстояние от А2 до с2 или с3. В этом проблема. |
|||
|
||||
MBo |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 234 Регистрация: 10.6.2002 Репутация: 5 Всего: 18 |
> в форму Безье их вовсе не обязательно переводить - чем сплайны-то хуже
Для использования готового графического примитива >Но как найти амплитуду, то есть расстояние от А2 до с2 или с3. В этом проблема. Ты прочитал о сплайнах Кэтмулл-Рома? (их я взял для примера, как весьма простые) Добавлено @ 08:07 Вот еще несложный метод: http://www.antigrain.com/research/bezier_i...R_INTERPOLATION |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 7 Всего: 183 |
Ага, хорошо, меня картинка там нарисованная сбила. Амлитуда определяется огранолептически - шоб красиво было. Я обычно использую треть отрезка, соединяющего начало и конец - это когда речь об одном отрезке. У соседних сегментов вектора производных должны быть противоположны и равны по амплитуде. Стало быть надо как-то усреднять. В ссылке MBo вроде примерно это и есть. -------------------- ... |
|||
|
||||
evilguard |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 19.11.2006 Репутация: нет Всего: нет |
Спасибо за ссылку! Отличный метод! Буду использовать его. Единственно его надо дополнить, в случае построения ломаной а не полигона первую и последнюю точку надо будет рассматривать отдельно.
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |