petit code que je m'etais amusé à faire au debut de mon apprentissage du c++ il y a aussi un peu d'assembler pour des routines optimisées
ce code peut s'apparenté à une trés petite ebauche de moteur 3d
Pour compiler utiliser turbo c++ de borland
Source / Exemple :
#include <stdio.h>
#include <conio.h>
#include <math.h>
#define DISTANCE 256
#define UINT unsigned int
#define PI 3.141592654
typedef struct point
{
int x,y,z;
UINT x2d,y2d;
}tPoint;
typedef struct tangle
{
short x,y,z;
}tAngle;
tPoint t[8],tp[8];
double sintab[360],costab[360];
short lien[10][3];
int i,j;
tAngle angle;
void TestLigne();
void PutPixel(UINT x,UINT y,short c)
{
asm mov ax,0a000h
asm mov es,ax
asm mov ax,320
asm mul y
asm add ax,x
asm mov di,ax
asm mov al,byte ptr c
asm mov es:[di],al
}
void Efface()
{
asm mov ax,0a000h
asm mov es,ax
asm mov di,0
asm mov ax,0
asm mov cx,32000
asm rep stosw
}
void Vbl()
{
while(!(inp(0x03da) & 0x8));
while(inp(0x03da) & 0x8);
}
void Invers( UINT* a,UINT* b,UINT* c,UINT* d)
{
UINT inter;
inter = *a;
inter = *b;
}
void Ligne(UINT x1,UINT y1,UINT x2,UINT y2,short couleur)
{
int diffx,diffy,dim;
UINT x,y,i;
if(x1 == x2)
{
if(y1 > y2) Invers(&x1,&y1,&x2,&y2);
for(i=y1;i<=y2;i++)
PutPixel(x1,i,couleur);
}
else if(y1 == y2)
{
if(x1 > x2) Invers(&x1,&y1,&x2,&y2);
for(i=x1;i<=x2;i++)
PutPixel(i,y1,couleur);
}
else
{
diffx = x2-x1;
diffy = y2-y1;
if(abs(diffx) > abs(diffy))
{
if(diffx < 0)
{
Invers(&x1,&y1,&x2,&y2);
diffy = -diffy;
diffx = -diffx;
}
x = x1;
y = y1;
dim = diffx;
if(diffy > 0)
do
{
do
{
PutPixel(x,y,couleur);
dim = dim-diffy;
x++;
}
while(dim >= 0);
dim += diffx;
y++;
}
while(y != y2);
else
do
{
do
{
PutPixel(x,y,couleur);
dim += diffy;
x++;
}
while(dim >= 0);
dim += diffx;
y--;
}
while(y != y2);
}
else
{
if(diffy < 0)
{
Invers(&x1,&y1,&x2,&y2);
diffx = -diffx;
diffy = -diffy;
}
x = x1;
y = y1;
dim = diffy;
if(diffx > 0)
do
{
do
{
PutPixel(x,y,couleur);
dim -= diffx;
y++;
}
while(dim >= 0);
dim += diffy;
x++;
}
while(x != x2);
else
do
{
do
{
PutPixel(x,y,couleur);
dim += diffx;
y++;
}
while(dim >= 0);
dim += diffy;
x--;
}
while(x != x2);
}
}
}
void Projeter(tPoint* p)
{
p->x2d = (UINT)((DISTANCE*p->x)/(DISTANCE+p->z))+160;
p->y2d = (UINT)((DISTANCE*p->y)/(DISTANCE+p->z))+100;
}
void Tourner( tAngle move,tPoint ori, tPoint* p)
{
double temp1,temp2;
p->x = ori.x;
p->y = ori.y;
p->z = ori.z;
temp1 = p->y*costab[move.x]-p->z*sintab[move.x];
temp2 = p->z*costab[move.x]+p->y*sintab[move.x];
p->y = (UINT)temp1;
p->z = (UINT)temp2;
temp1 = p->z*costab[move.y]-p->x*sintab[move.y];
temp2 = p->x*costab[move.y]+p->z*sintab[move.y];
p->z = (UINT)temp1;
p->x = (UINT)temp2;
temp1 = p->x*costab[move.z]-p->y*sintab[move.z];
temp2 = p->y*costab[move.z]+p->x*sintab[move.z];
p->x = (UINT)temp1;
p->y = (UINT)temp2;
}
void main()
{
for(i=0;i<360;i++)
{
sintab[i] = sin(i*PI/180);
costab[i] = cos(i*PI/180);
}
angle.x = 0;
angle.y = 0;
angle.z = 0;
t[0].x = -30; t[0].y = 30; t[0].z = -30;
t[1].x = 30; t[1].y = 30; t[1].z = -30;
t[2].x = 30; t[2].y = -30; t[2].z = -30;
t[3].x = -30; t[3].y = -30; t[3].z = -30;
t[4].x = -30; t[4].y = 30; t[4].z = 30;
t[5].x = 30; t[5].y = 30; t[5].z = 30;
t[6].x = 30; t[6].y = -30; t[6].z = 30;
t[7].x = -30; t[7].y = -30; t[7].z = 30;
lien[0][0] = 0; lien[0][1] = 4; lien[0][2] = 3;
lien[1][0] = 3; lien[1][1] = 4; lien[1][2] = 7;
lien[2][0] = 0; lien[2][1] = 1; lien[2][2] = 3;
lien[3][0] = 1; lien[3][1] = 2; lien[3][2] = 3;
lien[4][0] = 1; lien[4][1] = 2; lien[4][2] = 6;
lien[5][0] = 1; lien[5][1] = 5; lien[5][2] = 6;
lien[6][0] = 4; lien[6][1] = 5; lien[6][2] = 7;
lien[7][0] = 5; lien[7][1] = 6; lien[7][2] = 7;
lien[8][0] = 0; lien[8][1] = 4; lien[8][2] = 5;
lien[9][0] = 3; lien[9][1] = 6; lien[9][2] = 7;
asm mov ax,13h
asm int 10h
do
{
angle.x++;
angle.x %= 360;
for(i=0;i<8;i++)
{
Tourner(angle,t[i],&tp[i]);
Projeter(&tp[i]);
}
for(i=0;i<10;i++)
{
for(j=0;j<2;j++)
Ligne(tp[lien[i][j]].x2d,tp[lien[i][j]].y2d,tp[lien[i][j+1]].x2d,tp[lien[i][j+1]].y2d,64);
Ligne(tp[lien[i][0]].x2d,tp[lien[i][0]].y2d,tp[lien[i][2]].x2d,tp[lien[i][2]].y2d,64);
}
Vbl();
Efface();
}
while(!kbhit());
getch();
angle.x = 0;
do
{
angle.y++;
angle.y %= 360;
for(i=0;i<8;i++)
{
Tourner(angle,t[i],&tp[i]);
Projeter(&tp[i]);
}
for(i=0;i<10;i++)
{
for(j=0;j<2;j++)
Ligne(tp[lien[i][j]].x2d,tp[lien[i][j]].y2d,tp[lien[i][j+1]].x2d,tp[lien[i][j+1]].y2d,64);
Ligne(tp[lien[i][0]].x2d,tp[lien[i][0]].y2d,tp[lien[i][2]].x2d,tp[lien[i][2]].y2d,64);
}
Vbl();
Efface();
}
while(!kbhit());
getch();
angle.y = 0;
do
{
angle.z++;
angle.z %= 360;
for(i=0;i<8;i++)
{
Tourner(angle,t[i],&tp[i]);
Projeter(&tp[i]);
}
for(i=0;i<10;i++)
{
for(j=0;j<2;j++)
Ligne(tp[lien[i][j]].x2d,tp[lien[i][j]].y2d,tp[lien[i][j+1]].x2d,tp[lien[i][j+1]].y2d,64);
Ligne(tp[lien[i][0]].x2d,tp[lien[i][0]].y2d,tp[lien[i][2]].x2d,tp[lien[i][2]].y2d,64);
}
Vbl();
Efface();
}
while(!kbhit());
getch();
angle.z = 0;
do
{
angle.x++;
angle.x %= 360;
angle.y++;
angle.y %= 360;
angle.z++;
angle.z %= 360;
for(i=0;i<8;i++)
{
Tourner(angle,t[i],&tp[i]);
Projeter(&tp[i]);
}
for(i=0;i<10;i++)
{
for(j=0;j<2;j++)
Ligne(tp[lien[i][j]].x2d,tp[lien[i][j]].y2d,tp[lien[i][j+1]].x2d,tp[lien[i][j+1]].y2d,64);
Ligne(tp[lien[i][0]].x2d,tp[lien[i][0]].y2d,tp[lien[i][2]].x2d,tp[lien[i][2]].y2d,64);
}
Vbl();
Efface();
}
while(!kbhit());
asm mov ax,03h
asm int 10h
}
void TestLigne()
{
do
{
Ligne(0,50,319,50,1);
Ligne(319,150,0,150,2);
Ligne(120,0,120,200,3);
Ligne(240,200,240,0,4);
Ligne(0,0,319,200,5);
Ligne(319,0,0,200,6);
Ligne(0,180,300,0,7);
Ligne(319,180,20,0,8);
}
while(!kbhit());
}
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.