Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: C: Spiraalin piirto Allegro-kirjastolla

samlui [17.02.2005 09:34:38]

#

Piirtää kaksi värisen spiraalin, jonka suurimman ja pienimmän säteen, kierteiden lukumäärän ym. voi itse valita.
Olis kiva saada kommenteja, kun olen vielä aloittelija.

#include <allegro.h>
#include <math.h>

//bmp = pinta jolle spiraali piirretään
//x,y = keskipisteen koordinaatit
//rmin = spiraalin pienin säde
//rmax = spiraalin suurin säde
//rounds = kierteiden lukumäärä
//color,color2 = 1. ja 2. väri

void spiral(BITMAP *bmp, int x, int y, double rmin, double rmax, double rounds, int color, int color2)
{
 double rspace = (rmin + rmax)/rounds; // paljon jää tilaa kierteiden väliin
 double radd = rspace / (6.28 / 0.01); // paljonko sädettä lisätään yhdellä kierroksella
 double i,r,i2 = 0;
 int x2, y2;
 int color3 = color;
 for(i = 0, r = rmin; i < 6.28 * rounds; i += 0.01, r += radd) //käydään kierrokset läpi ja lisätään sädettä samaan aikaan
 {
  x2 = (int)(x + sin(i) * r); //lasketaan pixelin koordinaatit
  y2 = (int)(y + cos(i) * r);

  i2 += 0.01;
  if(i2 >= 3.14) color3 = color2; //tarkistetaan ollaanko piirretty puoli kierrosta, jos ollaaan niin vaihdetaan väriä
  if(i2 > 6.28){ i2 = 0; color3 = color; } //jos ollaan piirretty koko kierros aloitetaan alusta ja vaihdetaan väriä
  putpixel(bmp,x2,y2,color3); //asetetaan pixeli
 }
}

int main()
{
 allegro_init();                          //otetaan allegro ym. käyttöön
 install_keyboard();
 install_timer();
 set_gfx_mode(GFX_AUTODETECT,640,480,0,0);

 BITMAP *s = create_bitmap(640,480);     //luodaan pohja jolle spiraaali piirretään (rote_sprite vaatii tämän)
 BITMAP *temp = create_bitmap(640,480);  //luodaan myös temp pinta johon kaikki piirretään ja joka lopuksi piirretään ruudulle
 clear_bitmap(temp);                     //tämän avulla vähennetään välkyntää

 int angle = 1;                          //muuttujia
 int rmax = 200, direction = 1;


 while(!key[KEY_ESC])                    //looppi
 {
  clear_bitmap(s);                       //tyhjennetään pinta
  spiral(s,320,240,10,rmax,rmax/5,1,2);  //piirretään spiraali kierrosten lukumäärä on max säde jaettuna 5
  clear_bitmap(temp);                    //tyhjennetään temp

  rotate_sprite(temp,s,0,0,itofix(angle)); //piirretään spiraali oikeassa kulmassa temppiin
  blit(temp,screen,0,0,0,0,800,600);       //piirretään temppi ruudulle

  angle++;                                 //kasvatetaan kulmaa
  if(angle > 255) angle = 0;               //tarkistetaan että kulma ei kasva liian suureksi

  switch(direction)                        //tarkistetaan kumpaan suuntaan mennään
  {
   case 1:                                 //kasvaako max säde
        rmax++;
        if(rmax >= 200) direction = 2;
        break;
   case 2:
        rmax--;
        if(rmax <= 0) direction = 1;       //vai pieneneekö
   default:
           break;
  }
 }
 allegro_exit();                           //tuhotaan allegro
 return 0;
}
END_OF_MAIN();                             //allegron juttuja

Saapas [24.05.2005 22:09:26]

#

Ihan pätevältä vaikuttaa, on näin niinku toisenkin aloittelijan ymmärrettävissä.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta