SVG – Learning by Coding

[ matrix_reverse.svg --> Grafik anzeigen ]

  1: 
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
  2: 
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN"

  3: 
  "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd" [

  4: 
  <!ATTLIST svg xmlns:xlink CDATA #FIXED "http://www.w3.org/1999/xlink">

  5: 
]>

​  6:   7: 
<!-- SVG Learning by Coding http://www.datenverdrahten.de/svglbc/ -->

  8: 
<!--    AuthorDrThomas Meinike 05/05 thomas@handmadecode.de     -->

​  9:  10: 
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"

 11: 
  onload="Init(evt);ShowResults(2.101802,0.954189,-1.331028,0.347296,20,30)">

​ 12:  13: 
  <!-- einige Versuchsparameter fuer MatrixReverse():

​ 14:  15: 
  matrix(0.606,0.350,-0.350,0.606,80,40) =

 16: 
  skewY(0translate(80,40rotate(30.008915scale(0.699811,0.699811skewX(0)

​ 17:  18: 
  matrix(0.922671,0.385587,-0.317494,0.94826,0,0) =

 19: 
  skewY(0translate(0,0rotate(22.680197scale(1.000000,0.997354skewX(4.157762)

​ 20:  21: 
  matrix(2.101802,0.954189,-1.331028,0.347296,20,30) =

 22: 
  skewY(0translate(20,30rotate(24.417391scale(2.308257,0.866455skewX(-24.837804)

​ 23:  24: 
  matrix(0.971193,-0.238295,0.196019,0.9806,100,130) =

 25: 
  skewY(0translate(100,130rotate(166.214071scale(-1.000000,-0.999062skewX(-2.479346)

​ 26:  27: 
  matrix(-0.814408,-0.580292,0.969382,-0.245558,450,375) =

 28: 
  skewY(0translate(450,400rotate(35.471099scale(-1.000000,-0.762509skewX(-32.901964)

​ 29:  30: 
  matrix(1.019499,0.207055,1.070792,1.159111,40.769400,-23.107890) =

 31: 
  skewY(0translate(40.7694,-23.10789rotate(11.480333scale(1.040312,0.922799skewX(50.899217)

​ 32:  33: 
  -->

​ 34:  35: 
  <title>SVG Learning by Coding</title>

 36: 
  <desc>SVG-Spezifikation in Beispielen</desc>

​ 37:  38: 
  <defs>

​ 39:  40: 
    <script type="text/javascript">

 41: 
      <![CDATA[

​ 42:  43: 
      var svgdoc;

​ 44: ​ 45:  46: 
      function Init(load_evt)

 47: 
      {

 48: 
        svgdoc=load_evt.target.ownerDocument;

 49: 
      }

​ 50: ​ 51:  52: 
      function SetRadio(click_evt)

 53: 
      {

 54: 
        svgdoc.getElementById("radi").setAttribute("cx",click_evt.target.getAttribute("cx"));

 55: 
        svgdoc.getElementById("radi").setAttribute("cy",click_evt.target.getAttribute("cy"));

 56: 
      }

​ 57: ​ 58:  59: 
      function MatrixReverse(a,b,c,d,e,f)

 60: 
      {

 61: 
        //*

 62: 
            Zu den mathematischen Details der Umsetzung siehe:

 63: 
            http://svglbc.datenverdrahten.de/info/matrix_reverse1.htm

 64: 
            http://svglbc.datenverdrahten.de/info/matrix_reverse2.htm

 65: 
        */

​ 66:  67: 
        var tx,        // translate_x

 68: 
            ty,        // translate_y

 69: 
            ro,        // rotate_winkel

 70: 
            scx,       // scale_x

 71: 
            scy,       // scale_y

 72: 
            skx,       // skew_x_winkel

 73: 
            sky,       // skew_y_winkel

 74: 
            tanskx,    // Tangens von skx

 75: 
            tansky=0,  // Tangens von sky (frei waehlbar, Definitionsbereich beachten!)

 76: 
            cosro,     // Cosinus von ro

 77: 
            sinro,     // Sinus von ro

 78: 
            acosro,    // Arcuscosinus von ro

 79: 
            asinro,    // Arcussinus von ro

 80: 
            konst1,    // Konstante

 81: 
            konst2,    // Konstante

 82: 
            stellen=6// Anzahl Nachkommastellen

 83: 
            ergebnis;  // transform-Attributwert mit Komponenten

​ 84:  85: 
        konst1=a*a*tansky*tansky+a*a-2*a*b*tansky+b*b;

 86: 
        konst2=Math.sqrt(1/konst1);

 87: 
        if(a<|| b<0)konst2=-konst2;

​ 88:  89: 
        tanskx=(a*c+b*d-a*d*tansky-b*c*tansky+a*c*tansky*tansky)/konst1;

​ 90:  91: 
        skx=(Math.atan(tanskx)*180/Math.PI).toFixed(stellen);

 92: 
        sky=0;

 93: 
        // sofern tansky != 0 sky-Berechnung anpassen

 94: 
        // sky=(Math.atan(tansky)*180/Math.PI).toFixed(stellen);

​ 95:  96: 
        scx=(konst1*konst2).toFixed(stellen);

 97: 
        scy=((a*d-b*c)*konst2).toFixed(stellen);

​ 98:  99: 
        tx=e;

100: 
        ty=f-e*tansky;

​101: 102: 
        cosro=a*konst2;

103: 
        sinro=(b-a*tansky)*konst2;

104: 
        acosro=Math.acos(cosro);

105: 
        asinro=Math.asin(sinro);

106: 
        // ro-Spezialfall-Korrektur (asinro<0) von Peter Coppens 06/2007

107: 
        if(asinro<0)ro=(2*Math.PI-acosro)*180/Math.PI;

108: 
        else ro=acosro*180/Math.PI;

109: 
        ro=ro.toFixed(stellen);        

​110: 111: 
        // Wert des transform-Attributes zusammensetzen und ausgeben

112: 
        // (Reihenfolge der Abarbeitung von rechts nach links)

​113: 114: 
        ergebnis="skewY("+sky+") translate("+tx+","+ty+") rotate("+ro+

115: 
          ") scale("+scx+","+scy+") skewX("+skx+")";

​116: 117: 
        return ergebnis;

118: 
      }

​119: ​120: 121: 
      function ShowResults(a,b,c,d,e,f)

122: 
      {

123: 
        var eingabe,ausgabe;

​124: 125: 
        eingabe="matrix("+a+","+b+","+c+","+d+","+e+","+f+")";

126: 
        ausgabe=MatrixReverse(a,b,c,d,e,f);

​127: 128: 
        // transform-Attributwerte ausgeben

129: 
        svgdoc.getElementById("input").firstChild.nodeValue=

130: 
          "transform=\""+eingabe+"\"";

131: 
        svgdoc.getElementById("output").firstChild.nodeValue=

132: 
          "transform=\""+ausgabe+"\"";

​133: 134: 
        // Transformationen mit Rechtecken testen

135: 
        svgdoc.getElementById("mat").setAttribute("transform",eingabe);

136: 
        svgdoc.getElementById("rev").setAttribute("transform",ausgabe);

137: 
      }

​138: 139: 
      ]]>

140: 
    </script>

​141: 142: 
  </defs>

​143: 144: 
  <text x="20" y="30" style="fill: #000; font-size: 24px">

145: 
    Matrix-Transformationen in Komponenten zerlegen</text>

​146: 147: 
  <text id="input" x="20" y="60" font-size="14" fill="#00C">&#160;</text>

148: 
  <text id="output" x="20" y="80" font-size="14" fill="#F00">&#160;</text>

149: 
  <text x="20" y="120" font-size="12px" fill="#000">Hinweis: Die ausgehend vom 

150: 
    grünen Rechteck transformierten Rechtecke (rot blausollten dieselbe Lage

151: 
    einnehmen.</text>

​152: 153: 
  <!-- rotes Rechteck mit den separierten Transformationskomponenten -->

154: 
  <rect id="rev" x="200" y="150" width="100" height="50" fill="none" stroke="#F00"/>

155: 
  <!-- blaues Rechteck mit der gegebenen Matrix -->

156: 
  <rect id="mat" x="200" y="150" width="100" height="50" fill="none" stroke="#00C"

157: 
    stroke-dasharray="15,15"/>

158: 
  <!-- gruenes Ausgangsrechteck -->

159: 
  <rect x="200" y="150" width="100" height="50" fill="none" stroke="#090"/>

​160: 161: 
  <!-- Auswahl von Beispiel-Transformationen -->

162: 
  <g font-size="12px">

163: 
    <text x="45" y="155">Beispiel 1</text>

164: 
    <text x="45" y="175">Beispiel 2</text>

165: 
    <text x="45" y="195">Beispiel 3</text>

166: 
    <text x="45" y="215">Beispiel 4</text>

167: 
    <text x="45" y="235">Beispiel 5</text>

168: 
    <text x="45" y="255">Beispiel 6</text>

169: 
  </g>

​170: 171: 
  <circle id="radi" cx="30" cy="150" r="2" fill="#000"/><!-- Radio-Knopf innen -->

​172: 173: 
  <circle cx="30" cy="150" r="5" fill="none" stroke="#000" pointer-events="all" onclick=

174: 
    "SetRadio(evt);ShowResults(2.101802,0.954189,-1.331028,0.347296,20,30)"/>

​175: 176: 
  <circle cx="30" cy="170" r="5" fill="none" stroke="#000" pointer-events="all" onclick=

177: 
    "SetRadio(evt);ShowResults(0.922671,0.385587,-0.317494,0.94826,0,0)"/>

​178: 179: 
  <circle cx="30" cy="190" r="5" fill="none" stroke="#000" pointer-events="all" onclick=

180: 
    "SetRadio(evt);ShowResults(1.019499,0.207055,1.070792,1.159111,40.769400,-23.107890)"/>

​181: 182: 
  <circle cx="30" cy="210" r="5" fill="none" stroke="#000" pointer-events="all" onclick=

183: 
    "SetRadio(evt);ShowResults(0.606,0.350,-0.350,0.606,80,40)"/>

​184: 185: 
  <circle cx="30" cy="230" r="5" fill="none" stroke="#000" pointer-events="all" onclick=

186: 
    "SetRadio(evt);ShowResults(-0.814408,-0.580292,0.969382,-0.245558,450,375)"/>

​187: 188: 
  <circle cx="30" cy="250" r="5" fill="none" stroke="#000" pointer-events="all" onclick=

189: 
    "SetRadio(evt);ShowResults(0.971193,-0.238295,0.196019,0.9806,100,130)"/>

​190: 191: 
</svg>

[zum Anfang]