/****************************************************************************
* *
* PROGRAMMATION 3D *
* *
*****************************************************************************/
#include<graphics.h>
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<math.h>
#include<mem.h>
typedef float Matrice[4][4];
typedef float Cube[8][4];
Cube Unity={0,0,0,100,100,0,0,100,100,100,0,100,0,100,0,100,0,
100,100,100,0,0,100,100,100,0,100,100,100,100,100,100};
/********************************************************************
* GRAPHICS INTERFACE *
*********************************************************************/
int Initial_graph(void)
{
int gdriver = DETECT, gmode, errorcode;
initgraph(&gdriver, &gmode, "c:\\langages\\tc\\bgi");
errorcode = graphresult();
if (errorcode != grOk)
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1); /* terminate with an error code */
}
return 0;
}
/************************ Matrice Identité **************************/
void MatriceIdentity(Matrice I4)
{
memset(I4,NULL,sizeof(Matrice));//zero partout ds la matrice
I4[0][0]=1;
I4[1][1]=1;
I4[2][2]=1;
I4[3][3]=1;
}
/********************* Multiplication de matrices ********************/
void MultiMatrice(Cube m1,Matrice m2,Cube Produit)
{
int i,j,k;
for(i=0;i<8;i++)
for(j=0;j<4;j++)
{
Produit[i][j]=0;
for(k=0;k<4;k++)
Produit[i][j] += m1[i][k]*m2[k][j] ;
}
}
/*********************** Copie des matrices **********************/
void CopierCube(Cube Source,Cube Destination)
{
/* int i,j;
for(i=0;i<8;i++)
for(j=0;j<4;j++)
Destination[i][j]=Source[i][j];*/
memcpy(Destination,Source,sizeof(Cube));
}
/***************************** Echelle *******************************/
void Echelle(Cube m,float x,float y,float z)
{
Matrice EchelleMat; //matrice d'echelle
Cube m1;
MatriceIdentity(EchelleMat);
EchelleMat[0][0]=x;
EchelleMat[1][1]=y;
EchelleMat[2][2]=z;
MultiMatrice(m,EchelleMat,m1);
CopierCube(m1,m);
}
/****************************************************************************
* *
* Projection *
*****************************************************************************/
/********************* Projecations Perspective ***********************/
/*********** Z=0 ************/
void ProjPersp(Matrice m,float r)
{
Matrice PerspMatZ;
Cube m1;
MatriceIdentity(PerspMatZ);
PerspMatZ[2][3]=r;
PerspMatZ[2][2]=0;
MultiMatrice(m,PerspMatZ,m1);
for(int i=0;i<8;i++)
for(int j=0;j<4;j++)
m1[i][j]/=m1[i][3];
CopierCube(m1,m);
}
/**************************** Projection oblique ****************************/
void ProjOblique(Cube m,float Theta,float f)
{
Cube m1;
Matrice ObliqMat;
MatriceIdentity(ObliqMat);
ObliqMat[2][0]=f*cos(Theta*M_PI/180);
ObliqMat[2][1]=f*sin(Theta*M_PI/180);
ObliqMat[2][2]=0;
MultiMatrice(m,ObliqMat,m1);
CopierCube(m1,m);
}
/************************* Affichage des matrices ********************/
/**********************************************************************************************/
void AfficheCube(Cube M)
{
void Affiche(Cube);
int x;
int e=getmaxx()/2;
int f=getmaxy()/2;
cleardevice();
printf("Projection 2D!");
printf("\n\nQuel type de projection?");
printf("\n\n\t1-Oblique\n");
printf("\n\t2-Perspective");
printf("\n\n\n\n\n\n\n\n\n\n");
printf("\n\n\n\n\n\n\n\n\n\n\t\t\t\t\tQuel est votre choix:");
scanf("%d",&x);
switch(x)
{
case 1: cleardevice();
float a,b;
printf("\nSpecifier l'angle de Projection(45ø Cavaliere):");
scanf("%f",&a);
printf("\nSpecifiez le rapport de r‚duction(1 Cavaliere):");
scanf("%f",&b);
ProjOblique(M,a,b);
break;
case 2:cleardevice();
float d;
printf("\nDonner le rapport de projection perspective:");
scanf("%f",&d);
Echelle(M,100,100,100);
ProjPersp(M,d);
break;
default :cleardevice();
printf("Erreur 1 ou 2 svp!");
break;
}
cleardevice();
setcolor(15);
line(e,0,e,getmaxy());
line(0,f,getmaxx(),f);
Affiche(Unity);
setcolor(7);
line(M[0][0]+e,-M[0][1]+f,M[1][0]+e,-M[1][1]+f);
line(M[1][0]+e,-M[1][1]+f,M[2][0]+e,-M[2][1]+f);
line(M[2][0]+e,-M[2][1]+f,M[3][0]+e,-M[3][1]+f);
line(M[0][0]+e,-M[0][1]+f,M[3][0]+e,-M[3][1]+f);
line(M[5][0]+e,-M[5][1]+f,M[6][0]+e,-M[6][1]+f);
line(M[6][0]+e,-M[6][1]+f,M[7][0]+e,-M[7][1]+f);
line(M[4][0]+e,-M[4][1]+f,M[7][0]+e,-M[7][1]+f);
line(M[4][0]+e,-M[4][1]+f,M[5][0]+e,-M[5][1]+f);
line(M[3][0]+e,-M[3][1]+f,M[4][0]+e,-M[4][1]+f);
line(M[2][0]+e,-M[2][1]+f,M[7][0]+e,-M[7][1]+f);
line(M[3][0]+e,-M[3][1]+f,M[4][0]+e,-M[4][1]+f);
line(M[1][0]+e,-M[1][1]+f,M[6][0]+e,-M[6][1]+f);
line(M[0][0]+e,-M[0][1]+f,M[5][0]+e,-M[5][1]+f);
/* int i,j;
printf("\n\n");
for(i=0;i<8;i++)
{
for(j=0;j<4;j++)
printf("%2.2f\t",M[i][j]);
printf("\n");*/
getch();cleardevice();
}
/****************************************************************************/
void Affiche(Cube M)
{
int e=getmaxx()/2;
int f=getmaxy()/2;
ProjOblique(M,30,0.5);
cleardevice();
setcolor(2);
settextstyle(4,0,5);
outtextxy(10,10,"Cube Unit‚");
setcolor(3);
settextstyle(0,0,0);
outtextxy(10,60,"Projection Oblique d'angle 30ø");
outtextxy(10,70,"Rapport de projection = 0.5");
line(e,0,e,getmaxy());
line(0,f,getmaxx(),f);
setcolor(14);
line(M[0][0]+e,-M[0][1]+f,M[1][0]+e,-M[1][1]+f);
line(M[1][0]+e,-M[1][1]+f,M[2][0]+e,-M[2][1]+f);
line(M[2][0]+e,-M[2][1]+f,M[3][0]+e,-M[3][1]+f);
line(M[0][0]+e,-M[0][1]+f,M[3][0]+e,-M[3][1]+f);
line(M[5][0]+e,-M[5][1]+f,M[6][0]+e,-M[6][1]+f);
line(M[6][0]+e,-M[6][1]+f,M[7][0]+e,-M[7][1]+f);
line(M[4][0]+e,-M[4][1]+f,M[7][0]+e,-M[7][1]+f);
line(M[4][0]+e,-M[4][1]+f,M[5][0]+e,-M[5][1]+f);
line(M[3][0]+e,-M[3][1]+f,M[4][0]+e,-M[4][1]+f);
line(M[2][0]+e,-M[2][1]+f,M[7][0]+e,-M[7][1]+f);
line(M[3][0]+e,-M[3][1]+f,M[4][0]+e,-M[4][1]+f);
line(M[1][0]+e,-M[1][1]+f,M[6][0]+e,-M[6][1]+f);
line(M[0][0]+e,-M[0][1]+f,M[5][0]+e,-M[5][1]+f);
}
/****************************************************************************
* *
* TRANSFORMATIONS *
* *
*****************************************************************************/
/***************************** Translation ****************************/
void Translation(Cube m,float x,float y,float z)
{
Cube m1;
Matrice TranslMat; //matrice de translation
MatriceIdentity(TranslMat);
TranslMat[3][0]=x;
TranslMat[3][1]=y;
TranslMat[3][2]=z;
MultiMatrice(m,TranslMat,m1);
CopierCube(m1,m);
}
/****************************************************************************
* Rotations *
*****************************************************************************/
/***** par rapport … l'axe X *****/
void RotationX(Cube m,int Theta)
{
Matrice XMatrice;
Cube m1;
MatriceIdentity(XMatrice);
XMatrice[1][1]=cos(Theta*M_PI/180);
XMatrice[1][2]=sin(Theta*M_PI/180);
XMatrice[2][1]=-sin(Theta*M_PI/180);
XMatrice[2][2]=cos(Theta*M_PI/180);
MultiMatrice(m,XMatrice,m1);
CopierCube(m1,m);
}
/***** par rapport … l'axe Y *****/
void RotationY(Cube m,int Phi)
{
Matrice YMatrice;
Cube m1;
MatriceIdentity(YMatrice);
YMatrice[0][0]=cos(Phi*M_PI/180);
YMatrice[0][2]=-sin(Phi*M_PI/180);
YMatrice[2][0]=sin(Phi*M_PI/180);
YMatrice[2][2]=cos(Phi*M_PI/180);
MultiMatrice(m,YMatrice,m1);
CopierCube(m1,m);
}
/***** par rapport … l'axe Z *****/
void RotationZ(Cube m,int Psi)
{
Matrice ZMatrice;
Cube m1;
MatriceIdentity(ZMatrice);
ZMatrice[0][0]=cos(Psi*M_PI/180);
ZMatrice[0][1]=sin(Psi*M_PI/180);
ZMatrice[1][0]=-sin(Psi*M_PI/180);
ZMatrice[1][1]=cos(Psi*M_PI/180);
MultiMatrice(m,ZMatrice,m1);
CopierCube(m1,m);
}
/************ AXE Quelconque***********/
//en cours....
/****************************** Symetrie *******************************/
/******* Per rapport au Plan XY *********/
void SymetrieXY(Cube m)
{
Cube m1;
Matrice SymetXY;
MatriceIdentity(SymetXY);
SymetXY[2][2]=-1;
MultiMatrice(m,SymetXY,m1);
CopierCube(m1,m);
}
/******* Per rapport au Plan XZ *********/
void SymetrieXZ(Cube m)
{
Cube m1;
Matrice SymetXZ;
MatriceIdentity(SymetXZ);
SymetXZ[1][1]=-1;
MultiMatrice(m,SymetXZ,m1);
CopierCube(m1,m);
}
/******* Per rapport au Plan YZ *********/
void SymetrieYZ(Cube m)
{
Cube m1;
Matrice SymetYZ;
MatriceIdentity(SymetYZ);
SymetYZ[0][0]=-1;
MultiMatrice(m,SymetYZ,m1);
CopierCube(m1,m);
}