Hei! Harrastan algoritmista taidetta: https://petke.info/ Itseäni ovat aina eniten kiinnostaneet kuvat ja animaatiot. Olisi kiva, jos täältä löytäisi hengenheimolaisia ts. muita algoritmisen taiteen harrastajia? Ja linkki sivuille olisi kiva! Teen taidettani harvinaisella REBOL-ohjelmointikielellä. Tuskin täältä löytyy muita REBOL:in harrastajia, mutta kysytään nyt sitäkin? http://www.rebol.com/
Jotta postaukseen tulisi koodiakin, niin tässä linkki lyhkäseen koodikuvaan: REBOL-koodiani Julkaisen sen linkkinä kuvaan, missä syntaksi väritetty, koska luonnollisesti täällä ei ole REBOL-kielen tagia.
Harvoin tulee kommentoitua koodia (paha vika!) - nyt taas ehkä kommentoin liikaa. Koodin idea on yksinkertainen: käydään kahdessa sisäkkäisessä loopissa jokainen kuvan pixeli läpi ja asetetaan joillain lausekkeilla RGB-arvo pixelille. En tietenkään etukäteen osaa yhtään arvata minkälainen kuva eri lausekkeilla tulee, mutta kuvan koodilla sattu tulemaan tällainen kuva: Esimerkkikuva
No, julkaistaan nyt koodi vaikka "Muu kieli" tageillakin:
rebol[] plot: copy[] ; Grafiikka "blockin" alustus print "odota" ; Avaan konsoli-ikkunan tulostamalla sinne, jotta voin virhetilanteessa pysäyttää ohjelman. maxx: 4000 ; Kuvan leveys maxy: 3000 ; Kuvan korkeus main: layout [ ; Asetetaan layout muuttujan arvoksi grafiikkablocki panel1: box (as-pair maxx maxy) white effect reduce ['draw plot] ] kuva: copy/part skip to-image main 20x20 (as-pair maxx maxy) ;kuva: to-image main ; Muutetaan se kuvaksi. Koska blockissa ei ollut yhtään käskyä, saadaan tyhjä kuva. for x 0 (maxx - 1) 1 [ ; Aletaan täyttämään tyhjän kuvan pisteitä kahdessaa sisäkkäisessä silmukassa, joista for y 0 (maxy - 1) 1 [ ; ulommmassa x käy kaikki arvot 0:sta maxx:ään ja sisemmässä y 0:sta maxy:hyn. xp: 0.09 * x ; xp on skaalattu x:stä kertoimella 0.09 yp: 0.09 * y ; yp on skaalattu y:stä kertoimella 0.09 r: x * cosine yp ; Kaikki kuvaruudun "pikseleiden" väriarvot koostuvat RGB-arvoista, g: y * sine xp ; joissa ilmoitetaan punaisen=RED, vihreän=GREEN ja sinisen=BLUE arvo 0...255 b: (xp * yp) * cosine (xp + yp) ; Lausekkeet, joilla lasken muuttujien r, g ja b arvot ovat ihan kokeiluja. väri: to-tuple compose [(to-integer r) (to-integer (g)) (to-integer (b))] ; Tuple on tietorakenne, millä väri ilmoitetaan... poke kuva (as-pair x y) väri ; ...poke-käskylle väri-nimessä muuttujassa ja asetetaan se pisteen, ] ; minkä koordinaatit ovat x+20 ja y+20 arvoksi. Koordinaatteihin lisätään 20, koska REBOL:in box käsky piirsi aiemmin kuvaan... ] ; ...sen paksuiset reunat. save/png %pistepisteeltä3b.png kuva ; Talletetaan kuva pistepisteeltä nimisenä png formaatissa. halt ; pysäytetään ohjelma.
Kirjoittelin tuosta piruuttani version 8th-ohjelmointikielellä ja tein pari huomioita Rebol-ohjelmointikielestä:
Trigonometriset funktiot näyttäisivät oletuksena käyttävän asteita radiaanien sijaan. Missä kohtaa muuten Rebol-koodia rajoitetaan värikomponenttien arvot välille 0 - 255? Tuossa on selkeästi luettavissa integer muunnos, mutta toiminta näyttäisi olevan myös luku modulo 256.
Alla oma 8th käännökseni. Yksinkertainen tapa nopeuttaa ohjelman toimintaa olisi käyttää useampaa säiettä ja antaa jokaiselle säikeelle omat osat kuvasta tehtäväksi.
needs math/trigd "art.png" constant fname 4000 constant WIDTH 3000 constant HEIGHT WIDTH HEIGHT img:new constant buffer : draw -- img buffer ( >r ( r@ dup 0.09 n:* 2 pick 0.09 n:* \ buffer y x xp yp dup n:cosd 3 pick n:* \ buffer y x xp yp x*cosd(yp) 2 pick n:sind 5 pick n:* \ buffer y x xp yp x*cosd(yp) y*sind(xp) 2swap 2dup n:* >r n:+ cosd r> n:* \ buffer y x xp yp x*cosd(yp) y*sind(xp) xp*yp*cosine(xp+yp) 255 4 a:close ( n:int 256 n:mod ) a:map \ buffer y x [r,g,b,a] img:pix! ) 0 HEIGHT n:1- loop rdrop ) 0 WIDTH n:1- loop ; : app:main fname f:rm drop draw fname img:>file fname null f:launch bye ;
Aihe on jo aika vanha, joten et voi enää vastata siihen.