Patch title: Release 82 bulk changes
Abstract:
File: /pliant/math/morph.pli
Key:
    Removed line
    Added line
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