Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java
Войти
Регистрация
Восстановить пароль
 
AlexKim
0 / 0 / 0
Регистрация: 16.04.2016
1

Кубический сплайн пространстве, не могу найти ошибку

24.04.2011, 19:16. Просмотров 1408. Ответов 0
Метки нет (Все метки)

Доброго всем времени суток. Задали в универе задание, нарисовать кубический сплайн по двум точкам в трехмерном пространстве. Изучив математику сплайнов, пришел к след. выводу, что
// Вид сплайна P(t) = At^3 + Bt^2 + Ct + D
// P'(t) = 3At^2 + 2Bt + C
// Условия: P(0) = P1, где P1 - начальная точка сегмента
// P(1) = P2, где P2 - конечная точка сегмента
// P'(0) = P1', где P1' касательный вектор в начальной точке
// P'(1) = P2', где P2' касательный вектор в конечной точке

Начальные и конечные точки задаются тремя координатами {x, y, z}. Вот написал код, который должен считать коэффициенты сплайна и рисовать его на экране. Но почему-то не рисуется.. Может ли кто-нибудь подсказать в чем дело? И вообще, то что я написал имеет смысл или полная ересь?

P.S.Я начинающий, в JAVA еще не сильно разбираюсь..

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
ArrayList<Point> array_list = InitPointsList.getInstance().getLsPoints();
 
        for(int i = 0; i < array_list.size() - 1; i = i + 2) {
            //Point p1 = convert3DTo2D(array_list.get(i));
        //  Point p2 = convert3DTo2D(array_list.get(i + 1));
            Point p1 = array_list.get(i);
            Point p2 = array_list.get(i + 1);
            
            //SetCoef(p1, p2);
            // Вычисляем коэффициенты сплайна
            // Вид сплайна P(t) = At^3 + Bt^2 + Ct + D
            // P'(t) = 3At^2 + 2Bt + C
            // Условия: P(0) = P1, где P1 - начальная точка сегмента
            //          P(1) = P2, где P2 - конечная точка сегмента
            //          P'(0) = P1', где P1' касательный вектор в начальной точке
            //          P'(1) = P2', где P2' касательный вектор в конечной точке
            Point A = new Point(); //Коэффициент А
            Point B = new Point(); // Коэффициент B
            Point C = new Point(); //Коэффициент C
            Point D = new Point(); //Коэффициент D
            
            Point tP1 = new Point(); // Касательный вектор в первой точке - производная в начале
            Point tP2 = new Point(); // Касательный вектор во второй точке - производная в конце
            
            double x1 = 1;  // Координаты касательных
            double y1 = 1;  // векторов для начальной и 
            double z1 = 1;  // конечной точек по трем 
            double x2 = 1;  // координатам
            double y2 = 1;
            double z2 = 1;              
            
            tP1.setX(x1); // Запись координат касательных 
            tP1.setY(y1); // векторов  P1'(10, 10, 10)
            tP1.setZ(z1);
            
            tP2.setX(x2);  // P2'(30, 30, 30)
            tP2.setY(y2);
            tP2.setZ(z2);
            
            // Вычисление коэффициентов сплайна
            D.setX(p1.getX()); // Коэффициент при свободном члене
            D.setY(p1.getY()); // равен значению функции в точке 0
            D.setZ(p1.getZ()); // т.е. первой точке
            
            C.setX(tP1.getX());  // Коэффициент при t равен значению производной
            C.setY(tP1.getY()); // в точке t = 1, т.е. касательному вектору
            C.setZ(tP1.getZ());
            
            // Коэффициент при старшей степени вычисляется по формуле
            // 2*(P1 - P2) + P1' + P2'
            // где P1, P2 - начальная и конечная точки сплайна
            // P1', P2' - значения производных, т.е. касательных векторов
            
            // Вычисляем A по каждой координате
            A.setX(2*(p1.getX() - p2.getX()) + tP1.getX() + tP2.getX());
            A.setY(2*(p1.getY() - p2.getY()) + tP1.getY() + tP2.getY());
            A.setZ(2*(p1.getZ() - p2.getZ()) + tP1.getZ() + tP2.getZ());
            
            // Коэффициент при t^2 вычисляется по формуле
            // 3*(P2 - P1) - 2*P1' - P2'
            
            // Вычисляем B по каждой координате
            B.setX(3*(p2.getX() - p1.getX()) - 2*tP1.getX() - tP2.getX());
            B.setY(3*(p2.getY() - p1.getY()) - 2*tP1.getY() - tP2.getY());
            B.setZ(3*(p2.getZ() - p1.getZ()) - 2*tP1.getZ() - tP2.getZ());
            
            
            // Создаем массив точек, которые будут высчитываться и прорисовываться
            // между начальной и конечной
            ArrayList<Point> bufPoint = new ArrayList<Point>();
            //bufPoint = BufPointsList.getInstance().getLsPoints();
            
            // Буферная точка
            Point BufferPoint = new Point();
            for(double t = 0; t < 1; t = t + 0.05)
            {
                BufferPoint.setX(A.getX()*Math.pow(t, 3) + B.getX()*Math.pow(t, 2) + C.getX()*t + D.getX());
                BufferPoint.setY(A.getY()*Math.pow(t, 3) + B.getY()*Math.pow(t, 2) + C.getY()*t + D.getY());
                BufferPoint.setZ(A.getZ()*Math.pow(t, 3) + B.getZ()*Math.pow(t, 2) + C.getZ()*t + D.getZ());
                //Добавляем рассчитанную точку в список буферных точек
                BufPointsList.getInstance().getLsPoints().add(BufferPoint);
                //bufPoint.add(BufferPoint);
            }
            bufPoint = BufPointsList.getInstance().getLsPoints();           
            // Рисуем просчитанные точки
            //ArrayList<Point> tempPoints = BufPointsList.getInstance().getLsPoints();
            for(int j = 0; j < bufPoint.size() - 1; j = j + 2)
            {
                Point tp1 = convert3DTo2D(bufPoint.get(j));
                Point tp2 = convert3DTo2D(bufPoint.get(j + 1));
                
                int tx1 = WIDTH/2 + tp1.getX().intValue(); //- POINT_WIDTH/2;
                int ty1 = HEIGHT/2 - tp1.getY().intValue(); //- POINT_HEIGHT/2;
                
                int tx2 = WIDTH/2 + tp2.getX().intValue();
                int ty2 = HEIGHT/2 + tp2.getY().intValue();
                
                g.drawLine(tx1, ty1, tx2, ty2);
            }
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.04.2011, 19:16
Ответы с готовыми решениями:

Не могу найти ошибку
Реализовал код считывания из файла координат точек функции. Но почему-то всегда...

Не могу найти ошибку в программе
Здравствуйте, я новичок в Java, осваиваю книгу Г.Шилдта &quot;Руководство для...

Не могу найти ошибку в коде
Здравствуйте уважаемые! Помогите пожалуйста мне. Что не так в этой части...

Как найти кубический корень?
подскажите, плз, как найти...

Как найти кубический сплайн?
Проблема, как найти в этом задание коэффициенты с помощью функций **spline?

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.04.2011, 19:16

График функций в виде буквы G. Сплайн Эрмита,Кубический сплайн Эрмита
Нужно построить график в виде буквы G.Гладкая кривая + 2 прямых.+ Написать к...

Кубический сплайн
Помогите понять теорию. Сколько должно быть строк в трехдиагональной матрице? К...

Кубический сплайн
Реализовал кубический сплайн. Кому интересно вот файл MathCAD:


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru