Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: Twirl efekti kuvalle ja animaation teko

PetriKeckman [28.06.2022 21:34:29]

#

Luon REBOL:lla ja MakeAvi ohjelmalla animaationi. Ensin tuotan framet REBOL:lla ja teen niistä .avi videon yksinkertaisella, näppärällä ja ilmaisella MakeAvi ohjelmalla http://makeavi.sourceforge.net/ Framejen teko perustuu tietysti siihen, että jotain kuvan määrittämää parametria hieman muutetaan joka kuvan tuotoksen jälkeen.

Alla koodi, millä tuotan ruudukko kuvasta twirl efekti kuvat. Se ei ole täydellinen twirl efekti, sillä tuotettuun kuvaan tulee tyhjiä kohtia, mutta en parempaa aikaansaannut. Tyhjiä kohtia ei näytä tulevan IrfanView https://www.irfanview.com/ ohjelman twirl efektiin.

Tuolla lopputuloksena saatu animaatio: https://youtu.be/U9lyzYs0RZk

rebol[]
print "wait..."
kuva: load %neliöt.png ;ladataan kuva missä on ruudukoita.
maxx: kuva/size/1
maxy: kuva/size/2
x0: maxx / 2
y0: maxy / 2
plot: copy[]
main: layout [
	box (as-pair (maxx) (maxy)) white effect reduce ['draw plot]
]
pohja: copy/part skip to-image main (as-pair 20 20) (as-pair maxx maxy)
;luotiin tyhjällä plot blockilla tyhjä valkoinen kuvapohja
width: kuva/size/1
height: kuva/size/2
dr: 0
dalfa: 0
maxkuvaind: 400 ;tuotetaan 400 framea, jolloin saadaan 20 fr/s nopeudella 20 sekunnin animaatio.
apuri: 0
for kuvaind 1 maxkuvaind 1 [
	pohja: copy/part skip to-image main (as-pair 20 20) (as-pair maxx maxy)
;Otetaan joka kierroksella uudestaan tyhjä kuvapohja käyttöön.
	alfa: 0
	r: 0
	for x 0 (width - 1) 1 [
		for y 0 (height - 1) 1 [ ;käydään kaikki ladatun ruudukko kuvan pixelit läpi.
			et: square-root (((x - x0) * (x - x0)) + ((y - y0) * (y - y0)))
;Pixelin etäisyys keskipisteestä.

			beta: et * 0.5 * sine (0.9 * (kuvaind - 1)) ; Kulma beta on
;verrallolinen kuvaindeksiin ja se määrittelee paljon
;jokaista kuvan pistettä kierretään etäisyydellä et keskipisteestä
;ruudukkokuvassa.
;Koska betan määrittelyssä on sini funktio, heiluu animaation twirl efekti
;edestakaisin.
			xp: x
			yp: y

			;siirrot
			xp: x0 - xp
			yp: y0 - yp

			;tehdään kierrot kuvapisteelle eli rotaatio kuvaus keskipisteen
; x0,y0 ympäri kulman beta verran
			apu: xp
			xp2: (xp * cosine beta) - (yp * sine beta)
			yp2: (apu * sine beta) + (yp * cosine beta)

			;siirrot takas. Siirrot jouduttiin tekemään, jotta kiertoefekti
;tulee kuvan keskipisteen ympäri
			xp2: xp2 + x0
			yp2: yp2 + y0

			väri: pick kuva (as-pair xp2 yp2) ;Luetaan pixelin väriarvo ruudukkokuvasta lasketun koordinaatan
			; xp2,yp2 kohdalta
			if väri <> none [
				poke pohja (as-pair x y) väri ;Laitetaan pisteen väri kuvapohjaan.
			]
		]
	]
	save/png to-file rejoin ["twirl" kuvaind ".png"] pohja ;Talletetaan frame
	print kuvaind
]
halt

jalski [30.06.2022 10:25:57]

#

Onko Rebolissa mukana kirjastoja matriisien pyörittelyyn ja erityisesti "affine transformation" tukea? Kuvan aukkojen välttämiseksi hyödyksi voisi myös olla mahdollisuus muodostaa käänteinen matriisi tuosta "affine transformation" matriisista.

PetriKeckman [30.06.2022 14:01:03]

#

jalski kirjoitti:

Onko Rebolissa mukana kirjastoja matriisien pyörittelyyn ja erityisesti "affine transformation" tukea?

En oo ite koskaan käyttänyt mitään kirjastoja.

Nopean googlauksen perusteella voisi REBOL:ssakin olla: http://www.rebol.com/docs/library.html Mutta ei varmaankaan ehkä siinä muodossa kuin tarkoitat? Ja ei liene ainakaan "affline transformation" tukea.

jalski kirjoitti:

Kuvan aukkojen välttämiseksi hyödyksi voisi myös olla mahdollisuus muodostaa käänteinen matriisi tuosta "affine transformation" matriisista.

Eipä tuo osittainen tyhjä kohta mua haittaa. Ei kai tuotokseni tarvitse olla mikään aito ja oikea virallinen Twirl efekti. Olennaista oli ohjelmoida jotain itse :)

mpni [30.06.2022 19:46:20]

#

jalski kirjoitti:

Onko Rebolissa mukana kirjastoja matriisien pyörittelyyn ja erityisesti "affine transformation" tukea? Kuvan aukkojen välttämiseksi hyödyksi voisi myös olla mahdollisuus muodostaa käänteinen matriisi tuosta "affine transformation" matriisista.

Onko ajatuksenasi pyörittää kuvaa yhtäaikaa kahteen eri suuntaan vältääksesi mustat aukot? Skaalaus pienemmälle kuva-alueelle lienee järkevämpää.

jalski [30.06.2022 22:44:21]

#

mpni kirjoitti:

Onko ajatuksenasi pyörittää kuvaa yhtäaikaa kahteen eri suuntaan vältääksesi mustat aukot? Skaalaus pienemmälle kuva-alueelle lienee järkevämpää.

En tiedä soveltuuko tähän ongelmaan, mutta yleensä ottaen jos haluat vaikka pyörittää kuvaa niin suoraan laskemalla ja piirtämällä pikselin uuteen paikkaan tulee kuvaan ärsyttävän näköisiä aukkoja.

Jakamalla kuvan kahdeksi kolmioksi ja laskemalla pyöritetyn kuvan kolmioiden kärkipisteiden paikat voidaan laskea "transformation" matriisiisi. Nyt kun iteroidaan pyöritettyjen kolmioiden sisällä olevia pikseleitä voidaan "inverse transformation" matriisin avulla hakea alkuperäisen kolmion sisällä olevan pikselin väri suoraan ja kuvaan ei tule häiritseviä aukkoja.

Saan 8th:lla muodostettua "transformation" matriisin kahdelle kolmiolle vaikka näin:

: map-x-before-y  \ a -- a
  ' a:open a:map >r 3 a:close r> a:+ ;

: calculate-transform  \ [[x11,y11],[x12,y12],[x13,y13]] [[x21,y21],[x22,y22],[x23,y23]] -- Tm
  map-x-before-y [1,1,1] dup >r a:+ [3,3] mat:new
  swap
  map-x-before-y r> a:+ [3,3] mat:new
  3 mat:ident mat:* mat:inv mat:* ;

Ja kokeiltaessa hakea siirretyn kolmion viimeisen nurkkapisteen alkuperäinen piste:

[4,3]
[[-3,0],[0,3],[3,0]] [[2,3],[3,2],[4,3]] calculate-transform
mat:inv mat:xform . cr

Saadaan:

 [3.00000,0.00000]

Vastaus

Muista lukea kirjoitusohjeet.
Tietoa sivustosta