Cube en 3d filaire (c++ sous dos)

Description

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;

  • a = *c;
  • c = inter;
inter = *b;
  • b = *d;
  • d = inter;
} 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()); }

Codes Sources

A voir également

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.