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
Ihan pätevältä vaikuttaa, on näin niinku toisenkin aloittelijan ymmärrettävissä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.