Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Parth1906
GitHub Repository: Parth1906/SPPU-2019-Pattern-SE-COMP-Computer-Graphics-Practicals
Path: blob/main/8. 2D Transformation.cpp
724 views
1
/*Write C++/Java program to draw 2-D object and perform following basic transformations,
2
a) Scaling
3
b) Translation
4
c) Rotation
5
Use operator overloading. */
6
7
#include<iostream>
8
#include<stdlib.h>
9
#include<graphics.h>
10
#include<math.h>
11
12
using namespace std;
13
14
class POLYGON
15
{
16
private:
17
int p[10][10],Trans_result[10][10],Trans_matrix[10][10];
18
float Rotation_result[10][10],Rotation_matrix[10][10];
19
float Scaling_result[10][10],Scaling_matrix[10][10];
20
float Shearing_result[10][10],Shearing_matrix[10][10];
21
int Reflection_result[10][10],Reflection_matrix[10][10];
22
23
public:
24
int accept_poly(int [][10]);
25
void draw_poly(int [][10],int);
26
void draw_polyfloat(float [][10],int);
27
void matmult(int [][10],int [][10],int,int,int,int [][10]);
28
void matmultfloat(float [][10],int [][10],int,int,int,float [][10]);
29
void shearing(int [][10],int);
30
void scaling(int [][10],int);
31
void rotation(int [][10],int);
32
void translation(int [][10],int);
33
void reflection(int [][10],int);
34
};
35
36
int POLYGON :: accept_poly(int p[][10])
37
{
38
int i,n;
39
cout<<"\n\nEnter number of vertices : ";
40
cin>>n;
41
for(i=0;i<n;i++)
42
{
43
cout<<"\n\nEnter (x,y) Co-ordinate of point P"<<i<<" : ";
44
cin >> p[i][0] >> p[i][1];
45
p[i][2] = 1;
46
}
47
48
for(i=0;i<n;i++)
49
{
50
cout<<"\n";
51
for(int j=0;j<3;j++)
52
{
53
cout<<p[i][j]<<"\t\t";
54
}
55
}
56
57
return n;
58
}
59
void POLYGON :: draw_poly(int p[][10], int n)
60
{
61
int i,gd = DETECT,gm;
62
initgraph(&gd,&gm,NULL);
63
line(320,0,320,480);
64
line(0,240,640,240);
65
66
for(i=0;i<n;i++)
67
{
68
if(i<n-1)
69
{
70
line(p[i][0]+320, -p[i][1]+240, p[i+1][0]+320, -p[i+1][1]+240);
71
72
}
73
else
74
line(p[i][0]+320, -p[i][1]+240, p[0][0]+320, -p[0][1]+240);
75
}
76
77
78
79
}
80
81
void POLYGON :: draw_polyfloat(float p[][10], int n)
82
{
83
int i,gd = DETECT,gm;
84
initgraph(&gd,&gm,NULL);
85
line(320,0,320,480);
86
line(0,240,640,240);
87
88
for(i=0;i<n;i++)
89
{
90
if(i<n-1)
91
{
92
line(p[i][0]+320, -p[i][1]+240, p[i+1][0]+320, -p[i+1][1]+240);
93
94
}
95
else
96
line(p[i][0]+320, -p[i][1]+240, p[0][0]+320, -p[0][1]+240);
97
}
98
99
100
}
101
102
103
void POLYGON :: translation(int p[10][10],int n)
104
{
105
int tx,ty,i,j; int i1,j1,k1,r1,c1,c2;
106
r1=n;c1=c2=3;
107
cout << "\n\nEnter X-Translation tx : ";
108
cin >> tx;
109
cout << "\n\nEnter Y-Translation ty : ";
110
cin >> ty;
111
for(i=0;i<3;i++)
112
for(j=0;j<3;j++)
113
Trans_matrix[i][j] = 0;
114
Trans_matrix[0][0] = Trans_matrix[1][1] = Trans_matrix[2][2] = 1;
115
Trans_matrix[2][0] = tx;
116
Trans_matrix[2][1] = ty;
117
118
for(i1=0;i1<10;i1++)
119
for(j1=0;j1<10;j1++)
120
Trans_result[i1][j1] = 0;
121
for(i1=0;i1<r1;i1++)
122
for(j1=0;j1<c2;j1++)
123
for(k1=0;k1<c1;k1++)
124
Trans_result[i1][j1] = Trans_result[i1][j1]+(p[i1][k1] * Trans_matrix[k1][j1]);
125
cout << "\n\nPolygon after Translation : ";
126
draw_poly(Trans_result,n);
127
}
128
129
void POLYGON :: rotation(int p[][10],int n)
130
{
131
float type,Ang,Sinang,Cosang;
132
int i,j; int i1,j1,k1,r1,c1,c2;
133
r1=n;c1=c2=3;
134
cout << "\n\nEnter the angle of rotation in degrees : ";
135
cin >> Ang;
136
cout << "\n\n* * * * Rotation Types * * * *";
137
cout << "\n\n1.Clockwise Rotation \n\n2.Anti-Clockwise Rotation ";
138
cout << "\n\nEnter your choice(1-2): ";
139
cin >> type;
140
Ang = (Ang * 6.2832)/360;
141
Sinang = sin(Ang);
142
Cosang = cos(Ang);
143
cout<<"Mark1";
144
for(i=0;i<3;i++)
145
for(j=0;j<3;j++)
146
Rotation_matrix[i][j] = 0;
147
cout<<"Mark2";
148
Rotation_matrix[0][0] = Rotation_matrix[1][1] = Cosang;
149
Rotation_matrix[0][1] = Rotation_matrix[1][0] = Sinang;
150
Rotation_matrix[2][2] = 1;
151
if(type == 1)
152
Rotation_matrix[0][1] = -Sinang;
153
else
154
Rotation_matrix[1][0] = -Sinang;
155
156
for(i1=0;i1<10;i1++)
157
for(j1=0;j1<10;j1++)
158
Rotation_result[i1][j1] = 0;
159
for(i1=0;i1<r1;i1++)
160
for(j1=0;j1<c2;j1++)
161
for(k1=0;k1<c1;k1++)
162
Rotation_result[i1][j1] = Rotation_result[i1][j1]+(p[i1][k1] * Rotation_matrix[k1][j1]);
163
164
cout << "\n\nPolygon after Rotation : ";
165
for(i=0;i<n;i++)
166
{
167
cout<<"\n";
168
for(int j=0;j<3;j++)
169
{
170
cout<<Rotation_result[i][j]<<"\t\t";
171
}
172
}
173
draw_polyfloat(Rotation_result,n);
174
}
175
176
void POLYGON :: scaling(int p[][10],int n)
177
{
178
float Sx,Sy;
179
int i,j; int i1,j1,k1,r1,c1,c2;
180
r1=n;c1=c2=3;
181
cout<<"\n\nEnter X-Scaling Sx : ";
182
cin>>Sx;
183
cout<<"\n\nEnter Y-Scaling Sy : ";
184
cin>>Sy;
185
186
for(i=0;i<3;i++)
187
{
188
for(j=0;j<3;j++)
189
{
190
Scaling_matrix[i][j] = 0;
191
}
192
}
193
194
Scaling_matrix[0][0] = Sx;
195
Scaling_matrix[0][1] = 0;
196
Scaling_matrix[0][2] = 0;
197
Scaling_matrix[1][0] = 0;
198
Scaling_matrix[1][1] = Sy;
199
Scaling_matrix[1][2] = 0;
200
Scaling_matrix[2][0] = 0;
201
Scaling_matrix[2][1] = 0;
202
Scaling_matrix[2][2] = 1;
203
204
for(i1=0;i1<10;i1++)
205
for(j1=0;j1<10;j1++)
206
Scaling_result[i1][j1] = 0;
207
for(i1=0;i1<r1;i1++)
208
for(j1=0;j1<c2;j1++)
209
for(k1=0;k1<c1;k1++)
210
Scaling_result[i1][j1] = Scaling_result[i1][j1]+(p[i1][k1] * Scaling_matrix[k1][j1]);
211
212
cout<<"\n\nPolygon after Scaling : ";
213
draw_polyfloat(Scaling_result,n);
214
}
215
216
void POLYGON :: shearing(int p[][10],int n)
217
{
218
float Sx,Sy,type; int i,j;
219
int i1,j1,k1,r1,c1,c2;
220
r1=n;c1=c2=3;
221
for(i=0;i<3;i++)
222
for(j=0;j<3;j++)
223
{
224
if(i == j)
225
Shearing_matrix[i][j] = 1;
226
else
227
Shearing_matrix[i][j] = 0;
228
}
229
cout << "\n\n* * * * Shearing Types * * * *";
230
cout << "\n\n1.X-Direction Shear \n\n2.Y-Direction Shear ";
231
cout << "\n\nEnter your choice(1-2) : ";
232
cin >> type;
233
if(type == 1)
234
{
235
cout << "\n\nEnter X-Shear Sx : ";
236
cin >> Sx;
237
Shearing_matrix[1][0] = Sx;
238
}
239
else
240
{
241
cout << "\n\nEnter Y-Shear Sy : ";
242
cin >> Sy;
243
Shearing_matrix[0][1] = Sy;
244
}
245
246
247
for(i1=0;i1<10;i1++)
248
for(j1=0;j1<10;j1++)
249
Shearing_result[i1][j1] = 0;
250
for(i1=0;i1<r1;i1++)
251
for(j1=0;j1<c2;j1++)
252
for(k1=0;k1<c1;k1++)
253
Shearing_result[i1][j1] = Shearing_result[i1][j1]+(p[i1][k1] * Shearing_matrix[k1][j1]);
254
255
cout << "\n\nPolygon after Shearing : ";
256
draw_polyfloat(Shearing_result,n);
257
}
258
259
void POLYGON :: reflection(int p[][10],int n)
260
{
261
int type,i,j;
262
263
int i1,j1,k1,r1,c1,c2;
264
r1=n;c1=c2=3;
265
cout << "\n\n* * * * Reflection Types * * * *";
266
cout << "\n\n1.About X-Axis \n\n2.About Y-Axis \n\n3.About Origin\n\n4.About Line y = x \n\n5.About Line y = -x \n\nEnter your choice(1-5) : ";
267
cin >> type;
268
for(i=0;i<3;i++)
269
for(j=0;j<3;j++)
270
{
271
Reflection_matrix[i][j] = 0;
272
}
273
switch(type)
274
{
275
case 1:
276
Reflection_matrix[0][0] = 1;
277
Reflection_matrix[1][1] = -1;
278
Reflection_matrix[2][2] = 1;
279
break;
280
case 2:
281
Reflection_matrix[0][0] = -1;
282
Reflection_matrix[1][1] = 1;
283
Reflection_matrix[2][2] = 1;
284
break;
285
case 3:
286
Reflection_matrix[0][0] = -1;
287
Reflection_matrix[1][1] = -1;
288
Reflection_matrix[2][2] = 1;
289
break;
290
case 4:
291
Reflection_matrix[0][1] = 1;
292
Reflection_matrix[1][0] = 1;
293
Reflection_matrix[2][2] = 1;
294
break;
295
case 5:
296
Reflection_matrix[0][1] = -1;
297
Reflection_matrix[1][0] = -1;
298
Reflection_matrix[2][2] = 1;
299
break;
300
}
301
302
for(i1=0;i1<10;i1++)
303
for(j1=0;j1<10;j1++)
304
Reflection_result[i1][j1] = 0;
305
for(i1=0;i1<r1;i1++)
306
for(j1=0;j1<c2;j1++)
307
for(k1=0;k1<c1;k1++)
308
Reflection_result[i1][j1] = Reflection_result[i1][j1]+(p[i1][k1] * Reflection_matrix[k1][j1]);
309
310
cout << "\n\n\t\tPolygon after Reflection : ";
311
//cout << "\n\n\t\tPolygon after Rotation…";
312
for(i=0;i<n;i++)
313
{
314
cout<<"\n";
315
for(int j=0;j<3;j++)
316
{
317
cout<<Reflection_result[i][j]<<"\t\t";
318
}
319
}
320
draw_poly(Reflection_result,n);
321
//closegraph();
322
}
323
324
325
326
int main()
327
{
328
int ch,n,p[10][10];
329
POLYGON p1;
330
cout<<"\n\n* * * * 2-D TRANSFORMATION * * * *";
331
n= p1.accept_poly(p);
332
333
cout <<"\n\nOriginal Polygon : ";
334
p1.draw_poly(p,n);
335
do
336
{
337
338
int ch;
339
cout<<"\n\n* * * * 2-D TRANSFORMATION * * * *";
340
cout<<"\n\n1.Translation \n\n2.Scaling \n\n3.Rotation \
341
\n\n4.Reflection \n\n5.Shearing \n\n6.Exit";
342
cout<<"\n\nEnter your choice(1-6) : ";
343
cin>>ch;
344
345
switch(ch)
346
{
347
case 1:
348
349
p1.translation(p,n);
350
break;
351
352
case 2:
353
354
p1.scaling(p,n);
355
break;
356
357
case 3:
358
359
p1.rotation(p,n);
360
break;
361
362
case 4:
363
364
p1.reflection(p,n);
365
break;
366
367
case 5:
368
369
p1.shearing(p,n);
370
break;
371
372
case 6:
373
exit(0);
374
}
375
}while(1);
376
return 0;
377
}
378
379