/* Agregados troncos2.1 4 de Noviembre de 1999*/ /* Se autoriza la distribucion y uso libre de este programa (freeware) */ /* Fernando Galindo Soria Cd. de Mexico */ #include #include #include #include #include #include #include void escrcolordac16(char ,char,char,char); void main() { int gd=DETECT,gm,x,y,x1,y1,basex,basey,radio,an,colicion=0,ncolic=0,i; initgraph(&gd,&gm,""); // mensaje de inicio cleardevice(); printf(" Agregados troncos2.1\n\n"); printf("programa que genera puntos y los agrega en forma aleatoria \n\n"); printf("Se autoriza la distribucion y uso libre de este programa (freeware)\n"); printf("Fernando Galindo Soria Cd. de Mexico\n"); printf("4 de Noviembre de 1999\n\n"); printf("el programa termina con cualquier tecla\n\n"); printf("oprime una tecla para continuar"); getch(); // inicia sistema cleardevice(); randomize(); basex=getmaxx()/2; basey=getmaxy()/2; radio=30; //printf("radio= %d",radio); putpixel(basex,basey,15); //pone el punto inicial an=random(360); //genera las coordenadas del siguiente punto en forma aleatoria x=basex-(radio*cos(an/57.29578)); //en la circunferencia con centro (basex,basey) y=basey-(radio*sin(an/57.29578)); //y radio "radio" while(!kbhit()){//entra en un ciclo que se termina cuando se oprima cualquier tecla //encuentra las siguientes coordenadas del punto en forma aleatoria do {x1=x+1-random(3); y1=y+1-random(3);} while(x==x1 && y==y1); //genera los agregados para lo cual detecta si el punto coliciona con puntos anteriores if(getpixel(x1,y1)==0)//Si las siguientes coordenadas del punto no estan ocupadas { putpixel(x,y,0);//o sea que el punto actual no choca con otro punto, borra el punto actual x=x1; y=y1; colicion=0;ncolic++;}//y cambia las coordenadas a la siguiente posicion else //si en las siguientes coordenadas ya existia un punto //deja el punto donde esta (o sea agrega los puntos) { an=random(360);// y genera las coordenadas de un nuevo punto en forma aleatoria x=basex-(radio*cos(an/57.295)); y=basey-(radio*sin(an/57.295)); colicion++;ncolic=0;} /* verifica que las coordenadas de los puntos esten dentro de una circunferencia con centro en (basex,basey) y radio "radio" si un punto sale de la circunferencia lo borra y se genera las coordenadas de un nuevo punto en la circunferencia */ if(x<(basex-radio) || x>(basex+radio) || y<(basey-radio) || y>(basey+radio)){ an=random(360); x=basex-(radio*cos(an/57.29578)); y=basey-(radio*sin(an/57.29578)); } putpixel(x,y,radio/15);//pone el punto //Las siguientes condiciones permiten regular que tan rapido crece el radio /*si los puntos colicionan en forma consecutiva mas de 30 veces o se cumple una condicion aleatoria se aumenta el radio de generacion de puntos*/ if(((random(34000)==17) && (radio30)) if(random(7)==3){ radio+=5+random(7);/*printf(" %d",radio);*/ } //si los puntos se mueven sin colicionar mas de 5000 veces se disminuye el radio if(ncolic>5000 && radio>30){ radio-=3; ncolic=0; /*printf(" %d",radio);*/ } /*si se cumple una condicion aleatoria se cambia los valores rgb de la paleta y si se cumple otra condicion se borra la pantalla y se inicia un nuevo agregado*/ if(random(16000)==27)if(random(15)==7){ for (i=0;i<16;i++)//cambia los valores rgb de la paleta de colores escrcolordac16(i,random(63),random(63),random(63)); if(random(3360)==7) { //mientras se cumple la siguiente condicion cambia los valores rgb de la paleta de colores while((random(33300)!=11 && random(300)!=11) || kbhit()) if(random(16000)==27) for (i=0;i<16;i++)escrcolordac16(i,random(63),random(63),random(63)); //se borra la pantalla y se inicia un nuevo agregado*/ printf("radio= %d",radio);sound(1350);delay(100);nosound();delay(1000); cleardevice();putpixel(basex,basey,15);x=-1; radio=30;/* printf("radio= %d",radio);*/ } } } //termina getch(); closegraph(); } /*rutina que cambia de color paleta llamando directamente a los puertos del convertidor analogico digital de la tarjeta de video 31/iii/96 utiliza initgraph y maneja paleta rgb de 16 colores b(lue) g(reen) r(ed) 14/iv/96 */ void escrcolordac16(char color,char r,char g,char b) { char indcol[]={0,1,2,3,4,5,20,7,56,57,58,59,60,61,62,63}; outportb(0x3C8,indcol[color]);/*inicializa el color*/ outportb(0x3C9,r); outportb(0x3C9,g); outportb(0x3C9,b); }