Thomas Meinike: SVG - Matrix-Transformationen in Komponenten zerlegen

Beitrag lesen

Hallo,

ich brauche mal etwas Unterstuetzung bei der Umsetzung einer Funktion, die (speziell fuer SVG) Matrix-Transformationen in die einzelnen Grundkomponenten translate, rotate, scale, skewX, skewY zurueck fuehrt.

Der Weg in Richtung matrix(a,b,c,d,e,f) mit dem Aufbau

|a c e|
|b d f|
|0 0 1|

kann relativ einfach durch nacheinander ausgefuehrte Matrizen-Multiplikation gegangen werden, siehe MatrixCalc.

Nun wurde die (eher akademische) Frage aufgeworfen, wie man das umkehren kann. Mein in zwei Tagen ausgetueftelter Ansatz ausgehend von der Belegung der Einzel-Matrizen ist vielleicht etwas naiv, funktioniert immerhin schon ganz gut, aber noch nicht allgemeingueltig und genau hier stellen sich Fragen wie:

  • Ist die angedachte Rueckfuehrung auf Teilkomponenten ueberhaupt eindeutig loesbar?
  • Ist mein Algorithmus ein sinnvoller Ansatz bzw. welche Umsetzung waere praktikabler?

Der aktuelle Code laeuft sowohl mit dem ASV 3/6 als auch unter Firefox 1.0+ ("Deer Park Alpha 1").

Aus "matrix(2.101802,0.954189,-1.331028,0.347296,20,30)"
ensteht zurzeit "skewY(0.327000) skewX(56.462975) scale(1.978126,1.015411) rotate(69.677985) translate(20,30)".

BTW: Eine Suche nach "reverse affine matrix transformations" hat zwar viel Input gebracht, aber noch keine wirkliche Loesung.

Danke vorab fuer kreative Hinweise.

MfG, Thomas