Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
AlexKim
1

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

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

Author24 — интернет-сервис помощи студентам
Доброго всем времени суток. Задали в универе задание, нарисовать кубический сплайн по двум точкам в трехмерном пространстве. Изучив математику сплайнов, пришел к след. выводу, что
// Вид сплайна 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);
            }
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.04.2011, 19:16
Ответы с готовыми решениями:

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

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

Кубический сплайн
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data;...

Кубический сплайн
Вот теория https://ru.wikipedia.org/wiki/%CA%F3%E1%E8%F7%E5%F1%EA%E8%E9_%F1%EF%EB%E0%E9%ED Пишу...

0
24.04.2011, 19:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.04.2011, 19:16
Помогаю со студенческими работами здесь

Кубический сплайн
Всем доброго времени суток. Дали задание: написать програму в MS Visual C++ для построения...

Кубический сплайн
Для отбора на собеседование (вакансия математик-программист C++) мне дали такую задачу: С...

кубический сплайн
Дана непрерывная функция , и для нее в excel надо найти кубический сплайн без использовании VBA....

Кубический сплайн
Для введённого значения аргумента х и заданной табличной зависимости у = f(x), решить задачу...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru