[Moscow.pm] B-spline (было: графики)
Ruslan Zakirov
ruslan.zakirov на gmail.com
Пт Дек 12 11:58:20 PST 2008
без опорных точек никак, но можно упростить.
Берем кубический сплайн в непараметризованом виде:
y(x) = a(x-x0)^3+b(x-x0)^2+c(x-x0)+d
Составляем систему
y0 = y(x0) = d # известно
y1 = y(x1) (1)
два уравнения - 4 неизвестных. Вычисляем первую производную:
y'(x) = 3a(x-x0)^2+2b(x-x0)+c
y0' = y'(x0) = c # апроксимируем
y1' = y'(x1) (2)
Чтобы гарфик выглядел визульно плавным небходима C1 непрерывность
кривой. То есть прозводная на конце одного куска равно производной в
начале другого куска.
Для начала и конца направляем производную по линии к последующей точке, то есть:
tg(a) = (y1-y0)/(x1-x0) = y0'
Для промежуточных узлов берем за производную направление от
предыдущего узла к последющему, то eсть:
y'0|i = (y1|i - y0|i-1)/(x1|i - x0|i-1)
Вычислили производные и автоматом получаем с - равно производной.
Далее умножаем (1) на 2, а (2) на (x-x0) и получаем:
2*y1 = 2a(x1-x0)^3+2b(x1-x0)^2+2c(x1-x0)+2d
y1'(x-x0) = 3a(x1-x0)^3+2b(x1-x0)^2+c(x1-x0)
вычитаем:
y1'(x1-x0) - 2*y1 = a(x1-x0)^3 - c(x1-x0) - 2d
a = ( y1'(x1-x0) - 2*y1 + c(x1-x0) + 2d )/(x1-x0)
посчитать b не сложно.
2008/12/12 Orlovsky Alexander <nordicdyno на yandex.ru>:
> А вот есть на Perl либа, которая мне по массиву точек (координат x,y), расчитала бы опорные точки для кубических кривых Безье - по которым я бы нарисовал "кубический сплайн" (функцию для рисования кубических курв Безье я ужо нашел, нужны опорные точки :).
>
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>
--
Best regards, Ruslan.
Подробная информация о списке рассылки Moscow-pm