0 / 0 / 0
Регистрация: 18.04.2018
Сообщений: 10
1
Delphi 6-7

Вращение изображения через матрицу преобразования

02.12.2018, 00:23. Показов 1476. Ответов 4

Студворк — интернет-сервис помощи студентам
Здравствуйте, прошу помощи с Delphi. Нужно сделать рисунок, одной из функций которого будет вращение вокруг центра этого рисунка через матрицу преобразования. Я смог сделать перемещение через матрицу преобразования, но с вращением у меня проблемы. Прочитал теорию в интернете, но применить на деле не получается. А именно я дошел до того, что в процедуре TBuffDraw.MatrPreobrEd(Alpha: Extended) рисунок перемещается точку, относительно которой будет происходить вращение и вертится, но я не могу вернуть его на место, где он был, когда пользователь решит его вращать. В тексте указал только основные процедуры, полную программу прикрепил во вложении. Буду очень благодарен за помощь
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
procedure TBuffDraw.MatrPreobrEd(Alpha: Extended);
var
  i, j, k: Integer;
begin
  xF:=MatrPreobr[3, 1];
  yF:=MatrPreobr[3, 2];
  MatrPreobrDefault(true);
  MatrPreobr2[1, 1]:=cos(Alpha*Pi/180);
  MatrPreobr2[1, 2]:=sin(Alpha*Pi/180);
  MatrPreobr2[2, 1]:=-sin(Alpha*Pi/180);
  MatrPreobr2[2, 2]:=cos(Alpha*Pi/180);
  for i:=1 to 3 do
      for j:=1 to 3 do
        MatrPreobr4[i, j]:=MatrPreobr[i, j];
  MatrPreobr4[3, 1]:=-clientwidth div 2;
  MatrPreobr4[3, 2]:=-clientheight div 2;
  for i:=1 to 3 do //количество строк основной матрицы
    for j:=1 to 3 do//количество столбцов матрицы преобразования
      begin
        MatrPreobr3[i, j]:=0;
        for k:=1 to 3 do//количество столбцов основной матрицы
         MatrPreobr3[i, j]:=MatrPreobr3[i, j]+MatrPreobr4[i, k]*MatrPreobr2[k, j]
      end;
  for i:=1 to 3 do //количество строк основной матрицы
    for j:=1 to 3 do//количество столбцов матрицы преобразования
      begin
        MatrPreobr5[i, j]:=0;
        for k:=1 to 3 do//количество столбцов основной матрицы
         MatrPreobr5[i, j]:=MatrPreobr5[i, j]+MatrPreobr3[i, k]*MatrPreobr[k, j]
      end;
  for i:=1 to 3 do
      for j:=1 to 3 do
        MatrPreobr[i, j]:=MatrPreobr3[i, j];
  MatrPreobr[3, 1]:=xF;
  MatrPreobr[3, 2]:=yF;
 
  for i:=1 to 3 do
      for j:=1 to 3 do
        MatrPreobr[i, j]:=MatrPreobr5[i, j];
  DrawImage();
end;
 
procedure TBuffDraw.DrawImage();
var
  cenX, cenY: Integer;
begin
  //расчитывание центра клиентской области
  cenX:=ClientWidth div 2;
  cenY:=ClientHeight div 2;
  //очистка формы белым цветом
  buffer.Canvas.Brush.Color:=clWhite;
  buffer.Canvas.FillRect(buffer.Canvas.ClipRect);
  //выставление толщины координат X и Y
  buffer.Canvas.Pen.Width:=2;
  buffer.Canvas.Pen.Color:=clBlack;
  //ось X
  buffer.Canvas.MoveTo(0, cenY);
  buffer.Canvas.LineTo(ClientWidth, cenY);
  //две стрелочки и надпись X
  buffer.Canvas.MoveTo(ClientWidth, cenY);
  buffer.Canvas.LineTo(ClientWidth-15, cenY+5);
  buffer.Canvas.MoveTo(ClientWidth, cenY);
  buffer.Canvas.LineTo(ClientWidth-15, cenY-5);
  buffer.Canvas.TextOut(ClientWidth-15, cenY+10, 'X');
  //ось Y
  buffer.Canvas.MoveTo(cenX, 0);
  buffer.Canvas.LineTo(cenX, ClientHeight);
  //две стрелочки и надпись Y
  buffer.Canvas.MoveTo(cenX, 0);
  buffer.Canvas.LineTo(cenX+5, 15);
  buffer.Canvas.MoveTo(cenX, 0);
  buffer.Canvas.LineTo(cenX-5, 15);
  buffer.Canvas.TextOut(cenX+10, 5, 'Y');
  label7.caption:=floattostr(matrpreobr[3,1]);
  //увеличиваем толщину отрисовки и задаём синий цвет
  buffer.Canvas.Pen.Color:=clBlue;
  buffer.Canvas.Pen.Width:=4;
  //рисование фигур
  FigureEditing();
  if Button1.Enabled=false
  then
   buffer.Canvas.Polyline([Point(Round(MatrC[1, 1]), Round(MatrC[1, 2])),
                        Point(Round(MatrC[2, 1]), Round(MatrC[2, 2])),
                        Point(Round(MatrC[3, 1]), Round(MatrC[3, 2])),
                        Point(Round(MatrC[4, 1]), Round(MatrC[4, 2])),
                        Point(Round(MatrC[5, 1]), Round(MatrC[5, 2])),
                        Point(Round(MatrC[6, 1]), Round(MatrC[6, 2])),
                        Point(Round(MatrC[7, 1]), Round(MatrC[7, 2])),
                        Point(Round(MatrC[8, 1]), Round(MatrC[8, 2])),
                        Point(Round(MatrC[9, 1]), Round(MatrC[9, 2])),
                        Point(Round(MatrC[10, 1]), Round(MatrC[10, 2])),
                        Point(Round(MatrC[11, 1]), Round(MatrC[11, 2]))]);
  {else
    if Button2.Enabled=false
    then
     buffer.Canvas.Polyline([Point()]) }
  //отрисовка буфера на основную форму
  Canvas.Draw(0,0, buffer);
end;
 
procedure TBuffDraw.MatrPreobrDefault(flag: Boolean);
begin
  //присваивание матрице преобразований значений единичной матрицы
  //(матрицы по умолчанию)
  if flag=true
  then
   begin
    MatrPreobr[1, 1]:=1;
    MatrPreobr[1, 2]:=0;
    MatrPreobr[1, 3]:=0;
    MatrPreobr[2, 1]:=0;
    MatrPreobr[2, 2]:=1;
    MatrPreobr[2, 3]:=0;
    MatrPreobr[3, 1]:=0;
    MatrPreobr[3, 2]:=0;
    MatrPreobr[3, 3]:=1;
   end;
  //для матрицы преобразований 2
  MatrPreobr2[1, 1]:=1;
  MatrPreobr2[1, 2]:=0;
  MatrPreobr2[1, 3]:=0;
  MatrPreobr2[2, 1]:=0;
  MatrPreobr2[2, 2]:=1;
  MatrPreobr2[2, 3]:=0;
  MatrPreobr2[3, 1]:=0;
  MatrPreobr2[3, 2]:=0;
  MatrPreobr2[3, 3]:=1;
  //для матрицы преобразований 3
  MatrPreobr3[1, 1]:=1;
  MatrPreobr3[1, 2]:=0;
  MatrPreobr3[1, 3]:=0;
  MatrPreobr3[2, 1]:=0;
  MatrPreobr3[2, 2]:=1;
  MatrPreobr3[2, 3]:=0;
  MatrPreobr3[3, 1]:=0;
  MatrPreobr3[3, 2]:=0;
  MatrPreobr3[3, 3]:=1;
    //для матрицы преобразований 4
  MatrPreobr4[1, 1]:=1;
  MatrPreobr4[1, 2]:=0;
  MatrPreobr4[1, 3]:=0;
  MatrPreobr4[2, 1]:=0;
  MatrPreobr4[2, 2]:=1;
  MatrPreobr4[2, 3]:=0;
  MatrPreobr4[3, 1]:=0;
  MatrPreobr4[3, 2]:=0;
  MatrPreobr4[3, 3]:=1;
  //для матрицы преобразований 5
  MatrPreobr5[1, 1]:=1;
  MatrPreobr5[1, 2]:=0;
  MatrPreobr5[1, 3]:=0;
  MatrPreobr5[2, 1]:=0;
  MatrPreobr5[2, 2]:=1;
  MatrPreobr5[2, 3]:=0;
  MatrPreobr5[3, 1]:=0;
  MatrPreobr5[3, 2]:=0;
  MatrPreobr5[3, 3]:=1;
end;
 
procedure TBuffDraw.FigureEditing();
var
  i, j, k: Integer;
begin
  buffer.Canvas.TextOut(5, 10, floattostr(MatrPreobr[3, 1]));
   for i:=1 to 11 do //количество строк основной матрицы
    for j:=1 to 3 do//количество столбцов матрицы преобразования
      begin
        MatrC[i, j]:=0;
        for k:=1 to 3 do//количество столбцов основной матрицы
         MatrC[i, j]:=MatrC[i, j]+MatrF[i, k]*MatrPreobr[k, j]
      end
end;
 
procedure TBuffDraw.Figure1MatrCreate();
var
  cenX, cenY: Integer;
begin
  //расчитывание центра клиентской области
  cenX:=ClientWidth div 2;
  cenY:=ClientHeight div 2;
  //задание массива точек рисунка
  MatrF[1, 1]:=cenX;
  MatrF[1, 2]:=MatrF[6, 2]+100;
  MatrF[2, 1]:=MatrF[1, 1]-100;
  MatrF[2, 2]:=MatrF[6, 2];
  MatrF[3, 1]:=MatrF[1, 1]-100;
  MatrF[3, 2]:=MatrF[6, 2]-100;
  MatrF[4, 1]:=MatrF[1, 1]-50;
  MatrF[4, 2]:=MatrF[6, 2]-100;
  MatrF[5, 1]:=MatrF[1, 1]-50;
  MatrF[5, 2]:=MatrF[6, 2]-70;
  MatrF[6, 1]:=MatrF[1, 1];
  MatrF[6, 2]:=cenY;
  MatrF[7, 1]:=MatrF[1, 1]+50;
  MatrF[7, 2]:=MatrF[6, 2]-70;
  MatrF[8, 1]:=MatrF[1, 1]+50;
  MatrF[8, 2]:=MatrF[6, 2]-100;
  MatrF[9, 1]:=MatrF[1, 1]+100;
  MatrF[9, 2]:=MatrF[6, 2]-100;
  MatrF[10, 1]:=MatrF[1, 1]+100;
  MatrF[10, 2]:=MatrF[6, 2];
  MatrF[11, 1]:=MatrF[1, 1];
  MatrF[11, 2]:=MatrF[6, 2]+100;
end;
Вложения
Тип файла: 7z Лабораторная 5.7z (216.1 Кб, 4 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.12.2018, 00:23
Ответы с готовыми решениями:

Аффинные преобразования. Вращение
Не могу понять, как сделать поворот(вращение) фигуры во круг какой-нибудь из своих точек. Фигура...

Как делать аффинные преобразования в пространстве: вращение, растяжение, отражение, перенос фигуры.
Помогите решить задачу на Delphi. Задача. Пользователь курсором мыши задаёт координаты появления...

Вращение изображения
Есть ли какой то компонент в который можно было бы загрузить изображение и вращать его? к примеру...

Отрисовка изображения поверх канвы (изображения) и вращение изображения
Здравствуйте. Столкнулся с 2умя проблемами при работе с изображениями средствами C++ Builder....

4
Нарушитель
8586 / 4591 / 1058
Регистрация: 12.03.2015
Сообщений: 21,536
02.12.2018, 01:34 2
Код - просто пипец. Не знаю, найдётся ли доброволец, чтобы ковырять его.
Готовый компонент хош?

Вращение изображения через матрицу преобразования
Вложения
Тип файла: 7z GIF.7z (10.74 Мб, 5 просмотров)
Тип файла: zip rotateimage.zip (29.1 Кб, 3 просмотров)
1
0 / 0 / 0
Регистрация: 18.04.2018
Сообщений: 10
02.12.2018, 13:21  [ТС] 3
Спасибо, но это не совсем то, что нужно. Возможно у кого-то имеется уже готовое вращение именно через матрицу преобразований, просто чтобы послужило примером мне?
0
138 / 136 / 100
Регистрация: 10.03.2015
Сообщений: 553
02.12.2018, 20:42 4
Не знаю содержится ли в данной статье то что нужно, но вроде о матрице поворота речь идет:
0
Почетный модератор
64287 / 47586 / 32739
Регистрация: 18.05.2008
Сообщений: 115,182
02.12.2018, 20:51 5
Лучший ответ Сообщение было отмечено ArconWell как решение

Решение

Не нужно пиарить свои сайты, пока не схлопотали. У нас на форуме есть и поворот очки вокруг точки, например
Поворот изображения на 90 градусов
и афинные преобразования в 2D, что как оказалось ТС и нужно, например здесь
Преобразование изображений в Делфи
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.12.2018, 20:51
Помогаю со студенческими работами здесь

Обработка изображения через матрицу путем аффинных преобразований
Здравствуйте, хотел бы попросить помощи в понимании задания и его выполнением. Условие: Разбить...

Преобразования координат двумерных объектов (вращение, параллельный перенос)
Программа «Преобразования координат двумерных объектов (вращение, параллельный перенос)» Помогите...

Вращение изображения
Вращение изображений. Пробовал сматреть там где 2D игру делали, короче как я понял они в той тебе...

Вращение изображения?
У меня на форме Image1 я в него загружаю изображение и как мне с помощью нажатию на кнопку...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru