Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: Runsain mitoin algoritmista taidetta REBOL:lla

PetriKeckman [27.06.2022 04:35:37]

#

Oon keksinyt mielestäni kivan tavan tuottaa värikästä komean näköistä abstraktia taidetta liukuhihnalta runsain mitoin :) Siis tapa on niin yksinkertaisen nerokas, että tekisi mieli patentoida se, heh, mutta julkaisen nyt kuitenkin.

Tuolla tuhat:
https://petke.info/albumi.php

Koodin kommenteista seljennee kuinka ne on tuotettu.

rebol[]
plot: copy[] ;blockki johon kerätään yleensä grafiikka käskyjä, mutta...
maxx: 1000
maxy: 1000
random/seed now/precise
main: layout [ ; nyt on tarkoitus luoda vain tyhjä kuvapohja, mikä saadaan kun plot on tyhja
	box (as-pair (maxx) (maxy)) black effect reduce ['draw plot]
]
kuva2: copy/part skip to-image main 20x20 (as-pair maxx maxy) ;REBOL laittaa oletusarvoisesti layouttiin
; ikävät harmaat 20 pixeliä paksut reunat. Otetaan ne kuvapohjasta pois.
random/seed now/precise ;satunnaislukugeneraattorin alustus
print "wait..." ;tulostetaan konsoliin, jotta ohjelman ajon voi halutessaan lopettaa
kerroinx: 0.0001 ;skaalauskerroin x koordinaatille.
kerroiny: 0.0001 ;skaalauskerroin y koordinaatille. Nämä ovat välttämättömiä, muuten kuvista tulee rummempia...
for kuvaind 1 100 1 [ ;tuotetaan 100 kpl kuvia
	x0: random maxx ; arvotaan 9 pistettä kuvapohjasta
	y0: random maxy
	x1: random maxx
	y1: random maxy
	x2: random maxx
	y2: random maxy
	x3: random maxx
	y3: random maxy
	x4: random maxx
	y4: random maxy
	x5: random maxx
	y5: random maxy
	x6: random maxx
	y6: random maxy
	x7: random maxx
	y7: random maxy
	x8: random maxx
	y8: random maxy
	x9: random maxx
	y9: random maxy
	kuvaindapuri: kuvaind / 100 ;vaikuttaa väriarvoihin
	for x 0 (maxx - 1) 1 [ ;käydään jokainen kuvan pixeli läpi kahdessa sisäkkäisessä luupissa
		for y 0 (maxy - 1) 1 [
			xp: x0 + (kerroinx * x)
			yp: y0 + (kerroiny * y)

			;lasketaan etäisyyksiä arvottuihin pisteisiin
			et1: square-root (((xp - x1) * (xp - x1)) + ((yp - y1) * (yp - y1)))
			et2: square-root (((xp - x2) * (xp - x2)) + ((yp - y2) * (yp - y2)))
			et3: square-root (((xp - x3) * (xp - x3)) + ((yp - y3) * (yp - y3)))
			et4: square-root (((xp - x4) * (xp - x4)) + ((yp - y4) * (yp - y4)))
			et5: square-root (((xp - x5) * (xp - x5)) + ((yp - y5) * (yp - y5)))
			et6: square-root (((xp - x6) * (xp - x6)) + ((yp - y6) * (yp - y6)))
			et7: square-root (((xp - x7) * (xp - x7)) + ((yp - y7) * (yp - y7)))
			et8: square-root (((xp - x8) * (xp - x8)) + ((yp - y8) * (yp - y8)))
			et9: square-root (((xp - x9) * (xp - x9)) + ((yp - y9) * (yp - y9)))
			;sitten aletaan täysin hatusta vedetyillä lausekkeilla laskemaan pisteen x,y RGB väriarvoja
			Ri: (xp + yp * et1 + kuvaindapuri)
			Gi: (xp * yp + et2 - kuvaindapuri)
			Bi: xp + yp + et3 * kuvaindapuri
			R: 255 * cosine (360 * sine Ri)
			G: 255 * sine (360 * cosine Gi) + et4
			B: 255 * cosine (360 * sine Bi)

			väri: to-tuple compose [(to-integer (G + B)) (to-integer (G + R)) (to-integer (B + R))]
			;kuviin saadaan mukavaa vaihtelua eri ehdoilla. Nekin tietysti hatusta vedettyjä
			if (R * G * B) <= (3 * 128 * 128 * 128) [
				Ri: (xp + yp * et4)
				Gi: (xp * yp + et5)
				Bi: xp + yp + et6
				R: 255 * sine (360 * cosine Ri) + et3
				G: 255 * sine (360 * sine Gi)
				B: 255 * cosine (360 * cosine Bi)
				väri: to-tuple compose [(to-integer (G + B)) (to-integer (G + R)) (to-integer (B + R))]
			]
			if (R * G * B) >= (3 * 128) [
				Ri: (xp + yp - et7 + et3)
				Gi: (xp * yp + et8)
				Bi: xp + yp * et9 + et6
				R: 255 * sine (360 * cosine Ri)
				G: 255 * sine (360 * sine Gi)
				B: 255 * cosine (360 * cosine Bi)
				väri: to-tuple compose [(to-integer (R)) (to-integer (G)) (to-integer (B))]
			]
			poke kuva2 (as-pair x y) (väri) ;aikaansaatu väriarvo asetetaan pixeliin
		]
	]
	save/png to-file rejoin ["kuva" kuvaind ".png"] kuva2 ;talletetaan aikaan saatu kuva
	print kuvaind
	kerroinx: 1.01 * kerroinx ;kasvatetaan huvin vuoksi hieman skaalauskertoimia
	kerroiny: 1.01 * kerroiny
]
halt

Vastaus

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

Tietoa sivustosta