Une tunnelle en langage c.

Soyez le premier à donner votre avis sur cette source.

Vue 8 042 fois - Téléchargée 475 fois

Description

Code source compile sous Borland 4.52

ce petit prog vous montre une tunnelle en progresssion. La tunnelle est constituee par une serie de cercles de points distants d'environ 6 degree(angle+=6). Le cercles sont dessines de maniere a ce que les plus petits ont une couleur pale, et les plus grands avec une couleur foncee. De plus, pour creer cet effet de tunnelle, on calcule l'origine du cercle de maniere circulaire.

xc=60*cos(200-rayon+x)
yc=30*sin(200-rayon+y)

voici les etapes a suivre

angle=0

tant qu'une touche n'est pas pressee
debut :
initialise l'ecran virtuel
pour rayon allant de 30 a 200
debut:
phi=(200-rayon+x)*pi/128 // -128 a +128 ca va mieux avec
xc=60*cos(phi)
phi=(200-rayon+y)*pi/128
yc=30*sin(phi)
cercle(xc+160,yc+100,rayon)
Fin tant que
on copie tout sur l'ecran reel
x=x+3
y=y+3
Fin de la boucle

A vrai dire, mon code n'est pas strictement ca, mais cette partie est utilisee pour creer l'effet de tunnelle et d'une animation fluide.
A chaque nouvelle valeur de X et Y on trace a nouveau un ensemble de cercle dont les origines sont en rotations. Et cela vous donne l'impression d'une progression uniforme infinie. Et si vous enlevez x, les cercles bougeront en meme temps comme un pendule et de maniere statique.

C'est mon deuxieme code source qui illustre la puissance des formules trigonometriques dans l'animation 3D des objets graphiques sur l'ecran 2D.

A vrai dire, mon code n'est pas optimise, car les calculs se font en temps reel. Je le fais seulement dans le souci de clarte du code.

Vous pouvez pressez les touches fleches avant,arriere, backspace,+,- pour changer l'effet d'animation de la tunnelle.

Pour tout commentaire, ecrivez moi a : douggynix@yahoo.fr
Et je voudrais avoir aussi des mordus de ce style de programmation des sites ou je pourrais me renforcer dans la programmation graphique en C.

Source / Exemple :


#include<conio.h>
#include<stdio.h>
#include<math.h>
#include<dos.h>
#include<stdlib.h>
#include<mem.h>

#define VIDEO 0xA0000000L
#define PI 3.14159

#define UP      72
#define LEFT	 75
#define RIGHT   77
#define DOWN    80
#define ENTER   13
#define ESC     27
#define SPACE   32
#define ENTER   13

typedef unsigned char byte;

void modevga()
	{
	asm
		{
		mov ax,0x13
		int 0x10
		}
	}

void setpixel(byte col,int x,int y,byte *mem=(byte *)VIDEO)
	{
	if( (unsigned) x<320 && (unsigned) y<200)

  • (mem +320*y+x)=col;
} void setpal(byte color,byte red, byte green, byte blue) { outp(0x3C8,color); outp(0x3C9,red); outp(0x3c9,green); outp(0x3c9,blue); } void ellipse(int xc,int yc,short rx,short ry,byte col,byte *mem=(byte *)VIDEO) { int x,y,tabxy[360][2]; unsigned short angle; float phi; for(angle=0;angle<360;angle+=6) { phi=angle*3.14159/128; x=rx*cos(phi); y=ry*sin(phi); tabxy[angle][0]=x+xc; tabxy[angle][1]=y+yc; setpixel(col,x+xc,y+yc,mem); } } void prepal() { int i; for(i=0;i<64;i++) setpal(i,i,i,i); for(i=64;i<192;i++) setpal(i,i%255,i%25,i%110); } byte *screen=(byte *)VIDEO,*virtuel=(byte *)malloc(64000L*sizeof(byte)); void main() { short r,angle=0; byte col=5; r=30; float xc,yc,phi; int x=0,y=0,key=0; short sign=1; unsigned int retard=30; puts(" Ce petit programme illustre une tunnelle. La tunnelle est forme ") ; puts(" d'un ensemble de cercles de couleurs pales pour les rayons petits,"); puts(" et de couleurs foncees pour les les plus grands rayons. L'effet "); puts("de tunnelle est cree par le fait que l'origine des cercles ne sont pas"); puts("les memes et sont calcules circulairement"); puts("\n\nPressez la touche :"); puts("\n Fleche avant --> pour aller de l'avant dans la tunnelle"); puts("\n Fleche arriere <-- pour aller de l'arriere dans la tunnelle"); puts("\n Barre d'espace pour stopper la tunnelle"); puts("\n La touche + pour augmenter la vitesse"); puts("\n La touche - pour diminuer la vitesse"); puts("\n puis la touche ESC pour sortir"); puts("Ce petit programme est ecrit par : Lefruy James Douglass"); puts(" email me at : douggynix@yahoo.fr"); puts("\n Presser une touche pour continuer"); getch(); modevga(); prepal(); while(key != ESC) { memset(virtuel,1,64000L); for(r=30;r<=200;r+=2) { phi=(200-r+x)*PI/128; xc=90*cos(phi); phi=(200-r+x)*PI/128; yc=45*sin(phi); xc+=160.0;yc+=100.0; ellipse(xc,yc,r,r,col,virtuel); col+=5; if(col>256)col=1; col++; } memcpy(screen,virtuel,64000L); if(kbhit()) { key=getch(); switch(key) { case UP : sign=1;break; case DOWN : sign=-1; break; case SPACE : sign=0; break; case '+' : if(retard>7) retard-=8;break; case '-' : retard+=8; } } x+=(sign*4); y+=3; delay(retard); } exit(0); }

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
123
Date d'inscription
samedi 29 novembre 2003
Statut
Membre
Dernière intervention
11 mars 2007

Pas mal.

Au fait: un tunnel ;-)
Messages postés
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 décembre 2008

Tunnel
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
Salut,

le prends pas mal mais la même chose en mode fenêtré et au moins en 32 bits serait nettement plus intéressant. Les outp() et autres appels d'interruptions étaient valables au siècle dernier mais maintenant c'est totalement dépassé.

Bonne continuation.

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.

Du même auteur (douggyfresh)