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

Soyez le premier à donner votre avis sur cette source.

Vue 6 491 fois - Téléchargée 273 fois

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

Ajouter un commentaire

Commentaires

Messages postés
35
Date d'inscription
vendredi 7 février 2003
Statut
Membre
Dernière intervention
20 février 2009

je pense que c dev-c++
car il possede un fichier conio.h
Messages postés
138
Date d'inscription
jeudi 24 août 2000
Statut
Membre
Dernière intervention
6 avril 2002

Salut,
pourrais tu indiquer len om du compilateur que tu a utilise car tu dit C++ sous Dos OK mais ca voudrait dire que tu sous entend ANSI C++ et cela n'est pas le cas, car conio.h n'existe pas ds la normae ANSI C ou ANSI C++

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.