Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Построение кривой Безье с N опорными точками 
:(
    Опции темы
rang3r
Дата 14.3.2012, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем доброго времени суток.
Подскажите пж-та алгоритм вычисления точек для кривой Безье с N контрольными точками.
Нашел готовые формулы для 4 контрольных точек
метод расчета выглядит так :
Код

    private Point calculateBezierFunction(double t)
    {
        Point p1,p2,p3,p4;
        p1=controlPoints[0].getPosition();
        p2=controlPoints[1].getPosition();
        p3=controlPoints[2].getPosition();
        p4=controlPoints[3].getPosition();
        double x,y;

        x = p1.x*(Math.pow(-t,3)+3*Math.pow(t,2)-3*t+1)
                +3*p2.x*t*(Math.pow(t,2)-2*t+1)
                +3*p3.x*Math.pow(t,2)*(1-t)+p4.x*Math.pow(t,3);


        y = p1.y*(Math.pow(-t,3)+3*Math.pow(t,2)-3*t+1)
                +3*p2.y*t*(Math.pow(t,2)-2*t+1)
                +3*p3.y*Math.pow(t,2)*(1-t)+p4.y*Math.pow(t,3);

        return new Point((int)Math.round(x),(int)Math.round(y));
    }

Этот код правильный и верно расчитывает точки.
А при попытки сделать общее решение т.е. построение по N точкам ошибка, 
попробовал реализовать подсчет полинома Берштейна(для 4 точек данные почему то не совпадают), кто сталвивался подскажите пж- та в чем ошибка:
Код

private Point calculateBershteinPoint(double t)
    {
        int x = 0;
        int y = 0;
        int N = controlPoints.length;
        for (int i = 0; i < N ; i++)
        {
            Point controlPoint = controlPoints[i].getPosition();
            int NFact = factorials.get(N);
            int iFact = factorials.get(i);
            int NsubstIFact = factorials.get(N - i);
            double Bi = (NFact / (iFact * NsubstIFact)) * Math.pow(t, i) * Math.pow((1 - t), (N - i));
            x +=controlPoint.x * Bi;
            x +=controlPoint.y * Bi;
        }
        return new Point(x, y);
    }

Сдесь factorials - мапа которая хранит занчения первых 9 значений факториала, что бы не пересчитывать каждый раз  для каждой точки.
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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