void main() {
register unsigned int a;
int i,j;
unsigned char pl[3];
float D1,D2;
int color;
// Inicialitza el mode 13h:
InitMode(0x13);
// Mostra la paletta per defecte:
WaitRetrace(); // Abans de dibuixar en pantalla hem d'esperar un retraçat vertical.
for(i=0;i<256;i++) {
for(j=0;j<200;j++) {
vd[j*320+i]=i; // Dibuixa un punt de color 'i' en la coordenada (i,j)
}
}
getch(); // Espera a que apreti una tecla l'usuari.
// Esborra la pantalla:
WaitRetrace();
for(a=0;a<64000U;a++) {
vd[a]=0;
}
// Paleta negra:
for(i=0;i<256;i++) {
pal
register unsigned int a;
int i,j;
unsigned char pl[3];
float D1,D2;
int color;
// Inicialitza el mode 13h:
InitMode(0x13);
// Mostra la paletta per defecte:
WaitRetrace(); // Abans de dibuixar en pantalla hem d'esperar un retraçat vertical.
for(i=0;i<256;i++) {
for(j=0;j<200;j++) {
vd[j*320+i]=i; // Dibuixa un punt de color 'i' en la coordenada (i,j)
}
}
getch(); // Espera a que apreti una tecla l'usuari.
// Esborra la pantalla:
WaitRetrace();
for(a=0;a<64000U;a++) {
vd[a]=0;
}
// Paleta negra:
for(i=0;i<256;i++) {
pal
- =0; // Vermell
pal[1]=0; // Verd
pal[2]=0; // Blau
}
WaitRetrace();
FastSetVGAPalette();
// Dibuixa linies per a l'animació de paleta:
for(i=0;i<320;i++) {
for(j=0;j<190;j++) {
vd[j*320+i]=50+(40*sin((float)(i+j+random(2))/10.0));
}
}
// Barra inferior:
for(a=0;a<320;a++) {
for(j=190;j<200;j++) {
color=((a<<7)/160)+random(5)-2;
if(color>255) color=255;
if(color<1) color=1;
vd[j*320+a]=color;
}
}
// Nota: el numero aleatori que se li suma suavitza la imatge (difumina).
// Modifiquem la paletta:
// Nota: Les intensitats de color RGB van de 0 a 63.
for(i=0;i<128;i++) {
pal- =0; // Vermell
pal[1]=i>>3; // Verd
pal[2]=i>>1; // Blau
pal[255-i][0]=0; // Vermell
pal[255-i][1]=i>>3; // Verd
pal[255-i][2]=i>>1; // Blau
}
WaitRetrace();
FastSetVGAPalette();
// Animació per rotació de paletta:
do {
pl[0]=pal[255][0];
pl[1]=pal[255][1];
pl[2]=pal[255][2];
for(i=255;i>1;i--) {
pal- =pal[i-1][0];
pal[1]=pal[i-1][1];
pal[2]=pal[i-1][2];
}
pal[1][0]=pl[0];
pal[1][1]=pl[1];
pal[1][2]=pl[2];
WaitRetrace(); // A mes a mes d'evitar les pampallugues, controla la velocitat de l'animació
FastSetVGAPalette();
} while(!kbhit());
getch();
// Esborra la pantalla:
WaitRetrace();
fclrscr();
// ANIMACIó 3D amb linies (no esta gens optimitzada, utilitza coma flotant):
// Com que nomes es dibuixen els vertex del cub, l'ull pot interpretar l'imatge
// de dues maneres diferents, aixo provoca que a vegades no veiem un cub a la
// pantalla. Es pot intentar solucionar tancant els ulls i tornant a mirar la
// figura en pantalla.
/* Taula de sinus i cosinus. Accelera els calculs de la rotació */
for(i=0;i<256;i++) {
sinus=sin(((float)i*M_PI)/128.0);
cosinus=cos(((float)i*M_PI)/128.0);
}
AngX=AngY=AngZ=0;
CentreX=0;
CentreY=0;
CentreZ=100;
// Coordenades relatives al centre de l'objecte:
RPt[0].X=-20;
RPt[0].Y=20;
RPt[0].Z=-20;
RPt[1].X=20;
RPt[1].Y=20;
RPt[1].Z=-20;
RPt[2].X=20;
RPt[2].Y=20;
RPt[2].Z=20;
RPt[3].X=-20;
RPt[3].Y=20;
RPt[3].Z=20;
RPt[4].X=-20;
RPt[4].Y=-20;
RPt[4].Z=-20;
RPt[5].X=20;
RPt[5].Y=-20;
RPt[5].Z=-20;
RPt[6].X=20;
RPt[6].Y=-20;
RPt[6].Z=20;
RPt[7].X=-20;
RPt[7].Y=-20;
RPt[7].Z=20;
SetVGAColor(252,20,20,20);
SetVGAColor(253,0,0,63);
SetVGAColor(254,0,63,0);
SetVGAColor(255,63,0,0);
do {
// Incrementa l'angle de rotació:
AngX+=INC_ANGLE;
AngY+=INC_ANGLE;
AngZ+=INC_ANGLE;
/* Rotar l'Objecte: */
for(i=0;i<8;i++) {
Pt.X=RPt.X;
Pt.Y=RPt.Y;
Pt.Z=RPt.Z;
// Utilitza matrius de rotació:
// Rotar Y-Z
D1=Pt.Y;
D2=Pt.Z;
Pt.Y=cosinus[AngX&0xFF]*D1+sinus[AngX&0xFF]*D2;
Pt.Z=-sinus[AngX&0xFF]*D1+cosinus[AngX&0xFF]*D2;
// Rotar X-Z
D1=Pt.X;
D2=Pt.Z;
Pt.X=cosinus[AngY&0xFF]*D1-sinus[AngY&0xFF]*D2;
Pt.Z=sinus[AngY&0xFF]*D1+cosinus[AngY&0xFF]*D2;
// Rotar Y-X
D1=Pt.X;
D2=Pt.Y;
Pt.X=cosinus[AngZ&0xFF]*D1+sinus[AngZ&0xFF]*D2;
Pt.Y=-sinus[AngZ&0xFF]*D1+cosinus[AngZ&0xFF]*D2;
Pt.X+=CentreX;
Pt.Y+=CentreY;
Pt.Z+=CentreZ;
}
// Projecta els punts 3D en pantalla:
for(i=0;i<8;i++) {
Scr.X=160+K3D*(Pt.X/Pt.Z);
Scr.Y=100+K3D*(Pt.Y/Pt.Z);
}
// DIBUIXA EN PANTALLA:
WaitRetrace();
for(a=19840;a<44160;a++) {
vd[a]=0;
}
for(i=0;i<8;i++) {
for(j=i+1;j<8;j++) {
fline(Scr.X,Scr.Y,Scr[j].X,Scr[j].Y,252);
}
}
for(i=0;i<4;i++) {
fline(Scr.X,Scr.Y,Scr[(i+1)&0x03].X,Scr[(i+1)&0x03].Y,253);
fline(Scr[i+4].X,Scr[i+4].Y,Scr[((i+1)&0x03)+4].X,Scr[((i+1)&0x03)+4].Y,254);
fline(Scr.X,Scr.Y,Scr[i+4].X,Scr[i+4].Y,255);
}
//WaitRetrace();
} while(!kbhit());
getch();
// Torna al mode text:
ModeText();
printf("DEMO MODE 13h. Ver. 1.0\t\t\t\tRoger Vilaseca\n");
} [/color]
este seria uno .... muy buena respuesta.. y si me sacas de esta duda de verdad que me va a ayudar mucho...
- =pal[i-1][0];
- =0; // Vermell