С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi: Графика, звук, видео
Войти
Регистрация
Восстановить пароль
 
Arlequin228
0 / 0 / 0
Регистрация: 22.11.2016
Сообщений: 27
1

Вращение объекта вокруг произвольной оси

18.11.2017, 11:33. Просмотров 380. Ответов 2
Метки нет (Все метки)

Нужно ввести X,Y,Z точки, через которую проходит ось. Если заданная ось совпадает с осью координат, то вращение объекта происходит верно, но если заданная ось не совпадает с осью координат (например, проходит через точку {1;1;0}), то вращение происходит так же верно и при этом объект увеличивается в размере. Не понимаю, почему увеличивается.

Delphi
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
//Поворот воркуг прямой
 procedure TForm1.ButtonTurnClick(Sender: TObject);
 begin
 turn:=StrToFloat(EditAngle.Text);
 x:= StrToFloat(EditX.Text);
 y:= StrToFloat(EditY.Text);
 z:= StrToFloat(EditZ.Text);
 if ((z=0) and (y=0)) and (x=0) then
 raise Exception.Create('Enter the vector');
 
 //Нормирование вектора
 x:=x/sqrt(x*x+y*y+z*z);
 y:=y/sqrt(x*x+y*y+z*z);
 z:=z/sqrt(x*x+y*y+z*z);
 
 d:= sqrt(y*y+z*z);
 
 if ((y=0) and (z=0)) then
 begin
   cosa:=1;
   sina:=0;
 end
 else
 begin
    cosa:=z/d;
    sina:=y/d;
 end;
 
 //Поворот вокруг X
 createturnArrX(turnArr,cosa,sina );
 multiplicationOfmatrix(let,turnArr);
 
 //Поворот вокруг Y
 createturnArrY(turnArr,x,d);
 multiplicationOfmatrix(let,turnArr);
 
 //Поворот вокруг Z
 createturnArrZ(turnArr,turn);
 multiplicationOfmatrix(let,turnArr);
 
 //Обратный поворот вокруг Y
 createturnArrY(turnArr,-x,d);
 multiplicationOfmatrix(let,turnArr);
 
 //Обратный поворот вокруг X
 createturnArrX(turnArr,cosa,-sina );
 multiplicationOfmatrix(let,turnArr);
 
 
 showLetter(let, EDGES, xdefsetting,ydefsetting, ImageScreen);
 ImageScreen.Canvas.MoveTo(0+xdefsetting,0+ydefsetting);
 ImageScreen.Canvas.LineTo(round(x*1000+xdefsetting), round(y*1000+ydefsetting));
 end;
 
 
//Матрица вращения X
procedure createturnArrX(var arr:transformation; cosa,sina:real );
begin
  arr[1,1]:=1;  arr[1,2]:=0;      arr[1,3]:=0;      arr[1,4]:=0;
 
  arr[2,1]:=0;  arr[2,2]:=cosa;   arr[2,3]:=-sina;  arr[2,4]:=0;
 
  arr[3,1]:=0;  arr[3,2]:=sina;   arr[3,3]:=cosa;   arr[3,4]:=0;
 
  arr[4,1]:=0;  arr[4,2]:=0;      arr[4,3]:=0;      arr[4,4]:=1;
 
end;
 
//Матрица вращения Y
procedure createturnArrY(var arr:transformation; x,d:real );
begin
  arr[1,1]:=d;  arr[1,2]:=0;  arr[1,3]:=-x;  arr[1,4]:=0;
 
  arr[2,1]:=0;  arr[2,2]:=1;  arr[2,3]:=0;   arr[2,4]:=0;
 
  arr[3,1]:=x;  arr[3,2]:=0;  arr[3,3]:=d;   arr[3,4]:=0;
 
  arr[4,1]:=0;  arr[4,2]:=0;  arr[4,3]:=0;   arr[4,4]:=1;
 
end;
 
//Матрица вращения Z
procedure createturnArrZ(var arr:transformation; deg:real );
begin
  arr[1,1]:=cos(deg*Pi/180);   arr[1,2]:=-sin(deg*Pi/180); arr[1,3]:=0;  arr[1,4]:=0;
 
  arr[2,1]:=sin(deg*Pi/180);   arr[2,2]:=cos(deg*Pi/180);  arr[2,3]:=0;  arr[2,4]:=0;
 
  arr[3,1]:=0;                         arr[3,2]:=0;                       arr[3,3]:=1;  arr[3,4]:=0;
 
  arr[4,1]:=0;                         arr[4,2]:=0;                       arr[4,3]:=0;  arr[4,4]:=1;
 
end;
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.11.2017, 11:33
Ответы с готовыми решениями:

Как реализовать вращение треугольника вокруг оси на компоненте image?
Использую формулу X := X*Cos(a) - Y*Sin(a); Y := X*Sin(a) + Y*Cos(a); для...

Вращение вокруг центра
Подскажите пожалуйста! Вот есть фигуры, они вращаются вокруг осей x, y, z. а...

Вращение точок вокруг одной точки
Здравствуйте! Помогите пожалуйста составить следующую программу : 3 точки...

Вращение Bitmap вокруг точки. Расчеты и отрисовка
Всем привет! Давно ломаю голову над этим механизмом, а сам написать код не...

Вращение круга вокруг заданной точки на заданный угол
алгоритм вычисления???

2
Arlequin228
0 / 0 / 0
Регистрация: 22.11.2016
Сообщений: 27
20.11.2017, 20:13  [ТС] 2
Ошибку нашел, больше не актуально
0
карандаш ТМ
2 / 2 / 0
Регистрация: 13.11.2017
Сообщений: 65
21.11.2017, 08:01 3
где матрица let и где функция multiplicationOfmatrix();?

выложите, пожалуйста
очень нужно для работы
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.11.2017, 08:01

Перемещение и поворот вокруг оси картинки на форме
Я начинающий, вошел в стопор, прошу помощи! Стоит задача сделать следующее:...

Как сделать, чтобы прямоугольник вращался вокруг своей оси?
Как сделать, чтобы прямоугольник вращался вокруг своей оси? Помогите пожалуйста!

Вращение вокруг центра масс фигуры
Ребят, дана фигура в коде, надо изобразить вращение вокруг центра масс этой...


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

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

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