Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.04.2011, 19:19   #1
AlexKim
Новичок
Джуниор
 
Регистрация: 24.04.2011
Сообщений: 2
По умолчанию Кубический сплайн пространстве, не могу найти ошибку

Доброго всем времени суток. Задали в универе задание, нарисовать кубический сплайн по двум точкам в трехмерном пространстве. Изучив математику сплайнов, пришел к след. выводу, что
// Вид сплайна 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 еще не сильно разбираюсь..
Код:
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);
			}
AlexKim вне форума Ответить с цитированием
Старый 24.04.2011, 23:41   #2
AlexKim
Новичок
Джуниор
 
Регистрация: 24.04.2011
Сообщений: 2
По умолчанию

Если будет нужен доп. код, могу выложить.
AlexKim вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу найти ошибку maxistudent Общие вопросы C/C++ 6 29.04.2010 20:52
не могу найти ошибку! novi4ok_Delphi Помощь студентам 4 24.04.2010 21:46
С++. не могу найти ошибку world12_tk Помощь студентам 3 25.07.2009 10:47
Не могу найти ошибку . KVANTOM Общие вопросы Delphi 2 08.01.2009 17:15