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