Войти
ПрограммированиеФорумГрафика

Сгладить ломаную линию (кривые Безье и т.п.)

Страницы: 1 2 3 4 5 Следующая »
#0
20:19, 2 окт 2009

Нужно сгладить линию, типа так:

Изображение

Как это сделать?
Как я понимаю нужно копать в сторону сплайнов... Например кривые Безье... Но не ясно, как сгладить линию из большого количества отрезков, у Безье там всего три-четыре контрольных точек, а если у меня линия из сотни точек состоит, то как сглаживать? Группами по три-четыре точки? Результат будет фигня...
Нашёл вот такое:
http://www.codeproject.com/KB/recipes/BezirCurves.aspx

Но там ограничение в 32 точки, что тоже не подходит... Надо условно бесконечное количество...
Куда копать?

#1
20:25, 2 окт 2009

Группами по 4 точки. Результат будет не фигня.
Разумеется, группы - это не (n,n+1,n+2,n+3), (n+4,n+5,n+6,n+7), ..
а (n,n+1,n+2,n+3), (n+1,n+2,n+3,n+4), (n+2,n+3,n+4,n+5).

#2
20:31, 2 окт 2009

Хорошо, получил при (n,n+1,n+2,n+3) точки на кривой с определённым интервалом... Получил точки при (n+1,n+2,n+3,n+4)... И как теперь эти два массива объеденить? Или не так надо делать?

#3
20:32, 2 окт 2009

Аппроксимировать фрагментом кривой N cтепени (N подбирается по вкусу и требованиям к вычислительной сложности).
Брать группы по N+1 точек, и рассчитывать коэффициенты уравнения кривой.
Алгоритм можно нагуглить, я когда-то помнил наизусть мог в экселе какие угодно коэф-ты найти.

Можно попробовать кривые Безье, в которых за контрольные точки берутся зеркально отражённые соседние сегменты.

#4
20:36, 2 окт 2009

Executor
NURBS же, сколько хочешь точек столько и делаешь. Вычислительные затраты на точку растут только от степени кривой, но не от количества точек.

#5
20:38, 2 окт 2009

Executor
Я не теоретик, а практик... Поэтому могу посоветовать найти через codesearch исходники библиотеки кривых для Q3Radiant, и в файле splines/splines.cpp внимательно рассмотреть код функции idSplineList::buildSpline() (и сопутствующих). Только в том виде, как там, алгоритм не годится (кваку писали индусы, как известно), нужно начинать расчет не с 3, а с 0, и продолжать не до кол-ва точек, а до кол-ва+3. Индексы, выходящие за пределы массива контрольных точек, обрезать по 0 (для незамкнутого сплайна) или переносить на другой конец массива (для замкнутого).

#6
20:39, 2 окт 2009

Executor
> Хорошо, получил при (n,n+1,n+2,n+3) точки на кривой с определённым интервалом... Получил точки при (n+1,n+2,n+3,n+4)... И как теперь > эти два массива объеденить?
Отрезок (n,n+1,n+2,n+3) описывает кривую межу точками n+1 и n+2 , (n+1,n+2,n+3,n+4) между точками n+2 и n+3 и т.д. В зависимости от порядка сплайна будет зависеть гладкость сшивки отрезков (чем выше порядок тем лучше будут сшиваться куски). На границах надо выбрать определенные условия, обычно полагают равенство нулю соответсвующих производных (а ну да, можно еще продолжить, как сказали выше, функцию зеркальным отражением).

#7
20:39, 2 окт 2009

Для Безье что-то вроде как я нарисовал на картинке. Только если зеркальные контрольные точки брать как есть, получится очень уж запутанная кривая, надо их как-то уменьшать чтоли, умножать на скаляр < 1.0f ?
Изображение

#8
20:42, 2 окт 2009

kvakvs
> Только если зеркальные контрольные точки брать как есть, получится очень уж запутанная кривая
Зеркалировать можно относительно адекватной прямой проходящую через крайнюю точку и, например, ортоганально последнуму отрезку (фактически это и будут ограничения на производные).

#9
20:48, 2 окт 2009

Чем NURBS то не подходит?

#10
21:28, 2 окт 2009

Cairo
agg

#11
21:32, 2 окт 2009

Всем спс...

KpeHDeJIb
Вроде то что нужно, спасибо... Буду разбираться в НУРБСах... :)

Вроде нашёл:
http://www.nar-associates.com/nurbs/c_code.html

XaeroX
> Я не теоретик, а практик...

Я тоже... :)

#12
21:47, 2 окт 2009

  Subroutine to generate a rational B-spline curve using an uniform open knot vector
  Subroutine to generate a rational B-spline curve using an uniform periodic knot vector
  Subroutine to generate rational B-spline basis functions--open knot vector
и т.п.

В чём собственно между ними разница?

#13
22:36, 2 окт 2009

Executor
Catmull-Rom попробуй.
В книге "Методы и алгоритмы комп. графики в примерах на Visual C++" Алексея Полякова доступно объясняется.

#14
22:59, 2 окт 2009

[A][R][T]
Пробывал, не то...

Страницы: 1 2 3 4 5 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.