Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Algoritmista taidetta

PetriKeckman [23.01.2022 14:24:22]

#

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.

jalski [24.01.2022 22:21:43]

#

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 ;

Vastaus

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

Tietoa sivustosta