Форум программистов, компьютерный форум, киберфорум
Наши страницы

Delphi: графика, звук, видео

Войти
Регистрация
Восстановить пароль
 
Arlequin228
0 / 0 / 0
Регистрация: 22.11.2016
Сообщений: 27
#1

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

18.11.2017, 11:33. Просмотров 186. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вращение объекта вокруг произвольной оси (Delphi):

Вращение вокруг центра масс фигуры - Delphi
Ребят, дана фигура в коде, надо изобразить вращение вокруг центра масс этой фигуры (середины отрезка), помогите unit Unit1; ...

Разработать програмное приложение, позволяющее наблюдать вращение трехмерного объекта - Delphi
Разработать програмное приложение, позволяющее наблюдать вращение трехмерного объекта. В качестве трехмерного объекта выбрать "проволочный"...

вращение объекта shape вокруг своей оси - Delphi
Здравствуйте. Искал что-то похожее на форуме, но не нашел. Нужно изобразить на экране квадрат, прямоугольник, круг и эллипс, которые...

Вращение Луны вокруг Земли - Delphi
Ребят, нужна помощь, вообще не шарю Delphi. Смоделируйте движение спутника вокруг Земли. Timer1 Interval 55

Вращение прямоугольника вокруг точки - Delphi
Здравствуйте, такой вопрос. Допустим, у меня есть TShape прямоугольник. Как можно сделать так, чтобы при нажатии стрелок "Вверх" и "Вниз"...

Вращение вписанного многоугольника вокруг центра окружности - Delphi
Создать анимацию, позволяющее при нажатии на кнопку «Движение», воспроизводить вращение вписанного многоугольника вокруг центра окружности....

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
Привет! Вот еще темы с ответами:

Изобразить вращение хорды вокруг центра окружности - Delphi
Изобразить вращение хорды вокруг центра окружности.

Вращение фигуры вокруг произвольной оси - C#
Приветствую! Подскажите формулу для вращения. К примеру есть квадрат или любой другой объект, который нужно повернуть вокруг своей оси...

Вращение объекта вокруг произвольной точки - ActionScript
Добрый день. У всех создаваемых(по крайней мере мной) объектов "центр" находится в левом верхнем углу, что крайне неудобно если нужно...

Вращение объекта вокруг своей оси - Unity, Unity3D
Здравствуйте я полный новичок в unity3d, недавно столкнулся с такой проблемой, буду рад если поможете понять в чем дело: На игровом 2d...


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

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

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