Alla esimerkki kuvan skaalaamisesta käänteisen muunnos matriisin avulla:
: triangulate-rect
nk:rect>pts4 4 a:close
[0,1,2] a:@ nip ; \ We need just the first half
: triangulate-image \ image -- image a
img:size 0 0 2swap 4 a:close \ img rect
triangulate-rect ;
: 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:* ;
: scale-image \ img w h -- img
2dup img:new >r \ src-img w h
rot triangulate-image \ w h src-img src-triangles
r> triangulate-image \ w h src-img src-triangle trgt-img trgt-triangle
2 pick over \ w h src-img src-triangle trgt-img trgt-triangle src-triangle trgt-triangle
calculate-transform mat:inv \ w h src-img src-triangle trgt-img trgt-triangle inverse-transform
nip rot drop \ w h src-img trgt-img inverse-transform
( >r
( r@ 2 a:close dup 2 pick mat:xform 4 pick swap a:open swap img:pix@ nip >r
2 pick swap a:open swap r> img:pix! drop
) 0 6 pick n:1- loop rdrop
) 0 5 pick n:1- loop
drop >r drop 2drop r> ;
: app:main
"logo.png" img:new 194 194 scale-image "test.png" img:>file ;Käänteistä muunnos matriisia apuna käyttämällä onnistuu kohtuullisen kivasti vaikka oma "image morphing" ohjelma.
Kuva omasta keskeneräiseksi joskus aikoinaan jääneestä tuotoksesta.
Aihe on jo aika vanha, joten et voi enää vastata siihen.