Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Построение графика по точкам


Автор: xTr1m 6.2.2009, 16:12
Здравствуйте, вопрос такой: есть набор точек, через которые нужно провести линию. Можно ли для этого использовать кривые Безье или только интерполяцией сплайнов?

P.S. Я вот думаю, если Безье строится по 3 точкам, то может можно взять мои две граничные точки, а третью задать самому посередине между ними. Или так не получится?

Вся штука в том, что Безье у меня уже реализовано, а вот со сплайнами неохото возиться =))

Автор: Фантом 6.2.2009, 16:24
Сформулируйте точнее условие задачи. В ее нынешней постановке решение - это ломаная, состоящая из отрезков, соединяющих соседние точки.  smile 

Если требуется получить еще и гладкую кривую, то простейшее решение - обычный интерполяционный полином. Применение сплайнов и т.п. может стать осмысленным только в том случае, если есть и другие условия.

Автор: xTr1m 6.2.2009, 16:40
Да, получить нужно гладкую кривую (ну или похожую на гладкую =)) Но как мне получить полином по точкам. Функции нет, есть одни точки на плоскости. 

Автор: Фантом 6.2.2009, 17:16
Посмотрите вот http://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%BF%D0%BE%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%87%D0%BB%D0%B5%D0%BD_%D0%9B%D0%B0%D0%B3%D1%80%D0%B0%D0%BD%D0%B6%D0%B0 (нужен раздел "Определение"), это и есть решение.

Автор: xTr1m 6.2.2009, 18:39
Картинку что то не получилось добавить =((  Тогда на словах

Код

private double calcLagrange(double x, double []X, double []Y, int pts)
    {
        double y=0;
        double lj;

        for(int j=0;j<pts;j++)
        {
            lj=1;
            for(int i=0;i<pts;i++)
            {
                if(i!=j)
                {                    
                    lj*=(x-X[i])/(X[j]-X[i]);                    
                }
            }

            y+=Y[j]*lj;            
        }
        
       return y;
    }


Это реализованная функция, и все бы хорошо, но начиная с третьей точки у меня идет какая то погрешность. В чем может быть дело?


Автор: xTr1m 6.2.2009, 20:49
В виду некоторых обстоятельств вопрос снимаю =))

Автор: xTr1m 7.2.2009, 08:50
Все-таки не могу удержаться и не спросить. Строя график по заданным точкам полиномом Лагранжа, я заметил, что если у одной из точек координата, например, "у" сильно отличается от остальных, то график получается сильно вытянутым вверх и вниз. А есть ли метод позволяющий строить график через заданные точки, которые менее чувствителен к этому?

Добавлено @ 09:00
Вот кстати нашел в C# метод, который позволяет сделать, что я хотел. Используется при это некий "cardinal spline". А по-русски никто не назовет? =))

Автор: Фантом 7.2.2009, 15:17
Цитата(xTr1m @  7.2.2009,  08:50 Найти цитируемый пост)
Все-таки не могу удержаться и не спросить. Строя график по заданным точкам полиномом Лагранжа, я заметил, что если у одной из точек координата, например, "у" сильно отличается от остальных, то график получается сильно вытянутым вверх и вниз. А есть ли метод позволяющий строить график через заданные точки, которые менее чувствителен к этому?


Вот видите, оказывается, у задачи были и дополнительные условия...  smile Если нужен малый "разброс" (т.е. малость абсолютных значений второй производной), то решение - сплайны. Но Вы его уже нашли.

Цитата(xTr1m @  7.2.2009,  08:50 Найти цитируемый пост)
Вот кстати нашел в C# метод, который позволяет сделать, что я хотел. Используется при это некий "cardinal spline". А по-русски никто не назовет? =))


По-русски их обычно называют просто "сплайны" (cardinal - "основной, главный", так что буквальный перевод - что-то вроде "обычный сплайн").

Автор: xTr1m 7.2.2009, 15:29
Спасибо, что подтвердили мои догадки =))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)