/****************************************** * Пример программы вращения куба * * FILE : rcube.c * CREATED : 10.03.1997 * * (c) Evgeny S. Borisov * * OS : MS DOS 6.22 * COMPILER : TopSpeed C ******************************************/ #include #include #include #include float v11, v12, v13, v21, v22, v23, v31, v32, v33, v43, horfact, vertfact; float d=15, c1=4.5, c2=3.5,x_max=10.0, y_max=7.0; int X__max, Y__max; /*----------------------------------------------------*/ void initgr(void) { _setvideomode( _VRES16COLOR ); X__max = 640; Y__max = 480; horfact = X__max / x_max; vertfact = Y__max / y_max; } /*-------------------------------------------------------*/ void endgr() { getch(); _setvideomode( _DEFAULTMODE ); } /*-------------------------------------------------------*/ int IX(float x) { return (int) (x * horfact + 0.5); } /*-------------------------------------------------------*/ int IY(float y) { return (int) Y__max - (int)(y * vertfact + 0.5); } /*-------------------------------------------------------*/ void coeff( float rho, float theta, float phi ,float alpha) { float th, ph, c1, s1, c2, s2, s3, c3, factor; factor=atan(1.0)/45.0; th=theta*factor; ph=phi*factor; alpha=alpha*factor; c1=cos(th); s1=sin(th); c2=cos(ph); s2=sin(ph); c3=cos(alpha); s3=sin(alpha); /* матрица V */ v11=c1*c3+s1*s2*s3; v12=-c1*s3+c3*s1*s2; v13=c2*s1; v21=c2*s3; v22=c2*c3; v23=-s2; v31=-c3*s1+c1*s2*s3; v32=s1*s3+c1*c3*s2; v33=c1*c2; v43=rho; } /*------------------------------------------*/ void perspective(float x, float y, float z, float *pX, float *pY) { float xe, ye, ze; /* видовое преобразование */ xe = v11*x + v21*y + v31*z; ye = v12*x + v22*y + v32*z; ze = v13*x + v23*y + v33*z + v43; /* перспективное преобразование */ *pX = screen_dist*xe/ze + c1; *pY = screen_dist*ye/ze + c2; } /*------------------------------------*/ /* lineto для 3D */ void dw(float x, float y, float z) { float X, Y; perspective(x, y, z, &X, &Y); _lineto(IX(X), IY(Y)); } /*-------------------------------------------------*/ /* Прорисовка куба */ void drawcube() { float h=50.0; mv(h, -h, -h); dw(h, h, -h); /* AB */ dw(-h, h, -h); /* BC */ dw(-h, h, h); /* CG */ dw(-h, -h, h); /* GH */ dw(h, -h, h); /* HE */ dw(h, -h, -h); /* EA */ mv(h, h, -h); dw(h, h, h); /* BF */ dw(-h, h, h); /* FG */ mv(h, h, h); dw(h, -h, h); /* FE */ mv(h, -h, -h); dw(-h, -h, -h); /* AD */ dw(-h, h, -h); /* DC */ mv(-h, -h, -h); dw(-h, -h, h); /* DH */ } /*--------------------------------------------------*/ int main() { float rho=500,theta=0, phi=0 ,psi=0; printf("Угол phi: "); scanf("%f", &phi); printf("Угол psi: "); scanf("%f", &psi); printf("Угол theta: "); scanf("%f", &theta); coeff(rho, phi, psi, theta); initgr(); drawcube(); endgr(); return 0; }