# include <iostream.h> # include <graphics.h> # include <conio.h> # include <math.h> # define f 0.3 # define projection_angle 45 void show_screen( ); void apply_rotation_along_y_axis(const int,const int,const int,const int); void multiply_matrices(const float[4],const float[4][4],float[4]); void draw_circle(const int,const int,const int); void get_projected_point(int&,int&,int&); void Line(const int,const int,const int,const int); int main( ) { int driver=VGA; int mode=VGAHI; initgraph(&driver,&mode,\"..\\\\Bgi\"); show_screen( ); int x=0; int y=250; int z=200; setcolor(15); draw_circle(x,y,z); setcolor(15); settextstyle(0,0,1); outtextxy(50,415,\"*** Press any key to make a 3D solid object i.e. Tube.\"); getch( ); for(int angle=0;angle<=360;angle++) apply_rotation_along_y_axis(x,y,z,angle); getch( ); return 0; } //------------------- apply_rotation_along_y_axis( ) ------------------// void apply_rotation_along_y_axis(const int x,const int y, const int z,const int theta) { int _x=x; int _y=y; int _z=z; float angle=(theta*(M_PI/180)); float matrix_a[4]={_x,_y,_z,1}; float matrix_b[4][4]={ { cos(angle),0,-sin(angle),0 } , { 0,1,0,0 } , { sin(angle),0,cos(angle),0 } , { 0,0,0,1 } }; float matrix_c[4]={0}; multiply_matrices(matrix_a,matrix_b,matrix_c); _x=(int)(matrix_c[0]+0.5); _y=(int)(matrix_c[1]+0.5); _z=(int)(matrix_c[2]+0.5); draw_circle(_x,_y,_z); } /************************************************************************/ //---------------------- multiply_matrices( ) ------------------------// /************************************************************************/ void multiply_matrices(const float matrix_1[4], const float matrix_2[4][4],float matrix_3[4]) { for(int count_1=0;count_1<4;count_1++) { for(int count_2=0;count_2<4;count_2++) matrix_3[count_1]+= (matrix_1[count_2]*matrix_2[count_2][count_1]); } } /************************************************************************/ //-------------------------- draw_circle( ) -------------------------// /************************************************************************/ void draw_circle(const int x,const int y,const int z) { int _x=x; int _y=y; int _z=z; get_projected_point(_x,_y,_z); _x+=320; setcolor(15); circle(_x,_y,30); } /************************************************************************/ //--------------------- get_projected_point( ) -----------------------// /************************************************************************/ void get_projected_point(int& x,int& y,int& z) { float fcos0=(f*cos(projection_angle*(M_PI/180))); float fsin0=(f*sin(projection_angle*(M_PI/180))); float Par_v[4][4]={ {1,0,0,0}, {0,1,0,0}, {fcos0,fsin0,0,0}, {0,0,0,1} }; float xy[4]={x,y,z,1}; float new_xy[4]={0}; multiply_matrices(xy,Par_v,new_xy); x=(int)(new_xy[0]+0.5); y=(int)(new_xy[1]+0.5); z=(int)(new_xy[2]+0.5); } //-------------------------- show_screen( ) ---------------------------// void show_screen( ) { setfillstyle(1,1); bar(154,26,476,38); settextstyle(0,0,1); setcolor(15); outtextxy(5,5,\"******************************************************************************\"); outtextxy(5,17,\"*-**************************************************************************-*\"); outtextxy(5,29,\"*---------------- -----------------*\"); outtextxy(5,41,\"*-**************************************************************************-*\"); outtextxy(5,53,\"*-**************************************************************************-*\"); setcolor(11); outtextxy(162,29,\"Rotational Sweep Representation Method\"); setcolor(15); for(int count=0;count<=30;count++) outtextxy(5,(65+(count*12)),\"*-* *-*\"); outtextxy(5,438,\"*-**************************************************************************-*\"); outtextxy(5,450,\"*------------------------- -------------------------*\"); outtextxy(5,462,\"******************************************************************************\"); setcolor(12); outtextxy(229,450,\"Press any Key to exit.\"); }