submodule "point.pli" submodule "vector.pli" submodule "functions.pli" module "matrix.pli"
type MorphMatrix field Float xx xy xt field Float yx yy yt
function build m arg_w MorphMatrix m m xx := 1 ; m xy := 0 ; m xt := 0 m yx := 0 ; m yy := 1 ; m yt := 0
function morph sx sy rx ry tx ty -> m arg Float sx sy rx ry tx ty ; arg MorphMatrix m m xx := sx*cos:rx m xy := -sy*sin:ry m xt := tx m yx := sx*sin:rx m yy := sy*cos:ry m yt:= ty
method mo matrix -> ma arg MorphMatrix mo ; arg Matrix ma ma resize 3 3 ma 0 0 := mo xx ma 0 1 := mo xy ma 0 2 := mo xt ma 1 0 := mo yx ma 1 1 := mo yy ma 1 2 := mo yt ma 2 0 := 0 ma 2 1 := 0 ma 2 2 := 1
function morph ma -> mo arg Matrix ma ; arg MorphMatrix mo check ma:nb_lines=3 and ma:nb_columns=3 mo xx := ma 0 0 mo xy := ma 0 1 mo xt := ma 0 2 mo yx := ma 1 0 mo yy := ma 1 1 mo yt := ma 1 2
function compose mo1 mo2 -> mo arg MorphMatrix mo1 mo2 mo mo := morph mo2:matrix*mo1:matrix
function compose mo1 mo2 mo3 -> mo arg MorphMatrix mo1 mo2 mo3 mo mo := morph mo3:matrix*mo2:matrix*mo1:matrix
function reverse mo -> inv arg MorphMatrix mo inv inv := morph mo:matrix^(-1)
method m '' p -> q arg MorphMatrix m ; arg Point2 p q q := point p:x*m:xx+p:y*m:xy+m:xt p:x*m:yx+p:y*m:yy+m:yt
method m '' v -> w arg MorphMatrix m ; arg Vector2 v w w := vector v:x*m:xx+v:y*m:xy v:x*m:yx+v:y*m:yy
export MorphMatrix morph '' '. matrix' compose reverse
|