SVG – Learning by Coding
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:
<!-- Author: Dr. Thomas 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(0) translate(80,40) rotate(30.008915) scale(0.699811,0.699811) skewX(0)
17: 18:
matrix(0.922671,0.385587,-0.317494,0.94826,0,0) =
19:
skewY(0) translate(0,0) rotate(22.680197) scale(1.000000,0.997354) skewX(4.157762)
20: 21:
matrix(2.101802,0.954189,-1.331028,0.347296,20,30) =
22:
skewY(0) translate(20,30) rotate(24.417391) scale(2.308257,0.866455) skewX(-24.837804)
23: 24:
matrix(0.971193,-0.238295,0.196019,0.9806,100,130) =
25:
skewY(0) translate(100,130) rotate(166.214071) scale(-1.000000,-0.999062) skewX(-2.479346)
26: 27:
matrix(-0.814408,-0.580292,0.969382,-0.245558,450,375) =
28:
skewY(0) translate(450,400) rotate(35.471099) scale(-1.000000,-0.762509) skewX(-32.901964)
29: 30:
matrix(1.019499,0.207055,1.070792,1.159111,40.769400,-23.107890) =
31:
skewY(0) translate(40.7694,-23.10789) rotate(11.480333) scale(1.040312,0.922799) skewX(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<0 || 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"> </text>
148:
<text id="output" x="20" y="80" font-size="14" fill="#F00"> </text>
149:
<text x="20" y="120" font-size="12px" fill="#000">Hinweis: Die ausgehend vom
150:
grünen Rechteck transformierten Rechtecke (rot + blau) sollten 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]