SVG – Learning by Coding

[ bezier-polynome.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 04/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)">

​ 12:  13: 
  <title>SVG Learning by Coding</title>

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

​ 15:  16: 
  <defs>

​ 17:  18: 
    <style type="text/css">

 19: 
      <![CDATA[

​ 20:  21: 
      *

 22: 
      {

 23: 
        font-familysans-serif;

 24: 
        font-size12px;

 25: 
      }

​ 26:  27: 
      ]]>

 28: 
    </style>

​ 29: ​ 30:  31: 
    <script type="text/javascript">

 32: 
      <![CDATA[

​ 33:  34: 
      var svgdoc,g1,g2,ta,p1,p2,p3;

​ 35: ​ 36:  37: 
      function Init(load_evt)

 38: 
      {

 39: 
        svgdoc=load_evt.target.ownerDocument;

​ 40:  41: 
        g1=svgdoc.getElementById("g1");

 42: 
        g2=svgdoc.getElementById("g2");

 43: 
        p1=svgdoc.getElementById("p1");

 44: 
        p2=svgdoc.getElementById("p2");

 45: 
        p3=svgdoc.getElementById("p3");

 46: 
        ta=svgdoc.getElementById("ta");

​ 47:  48: 
        p1.setAttribute("points",Linear_Bezier(130,200,330,200));

 49: 
        p2.setAttribute("points",Quadratic_Bezier(130,200,280,100,330,200));

 50: 
        p3.setAttribute("points",Cubic_Bezier(130,200,280,100,180,300,330,200));

 51: 
      }

​ 52: ​ 53:  54: 
      function Linear_Bezier(x0,y0,x1,y1)

 55: 
      {

 56: 
        // C(t) = (1-t)*P0 + t*P1 | t = [0...1]

​ 57:  58: 
        var x,y,t,tm,dt=0.005,data="";

​ 59:  60: 
        for(t=0;t<=1;t+=dt)

 61: 
        {

 62: 
          tm=1-t;

 63: 
          x=tm*x0 t*x1;

 64: 
          y=tm*y0 t*y1;

 65: 
          data+=x+","+y;

 66: 
          if(t<1)data+=" ";

 67: 
        }

​ 68:  69: 
        return data;

 70: 
      }

​ 71: ​ 72:  73: 
      function Quadratic_Bezier(x0,y0,x1,y1,x2,y2)

 74: 
      {

 75: 
        // C(t) = (1-t)^2*P0 + 2t(1-t)*P1 + t^2*P2 | t = [0...1]

​ 76:  77: 
        var x,y,t,tm,t0,t1,t2,dt=0.005,data="";

​ 78:  79: 
        for(t=0;t<=1;t+=dt)

 80: 
        {

 81: 
          tm=1-t;

 82: 
          t0=Math.pow(tm,2);

 83: 
          t1=2*t*tm;

 84: 
          t2=Math.pow(t,2);

 85: 
          x=t0*x0 t1*x1 t2*x2;

 86: 
          y=t0*y0 t1*y1 t2*y2;

 87: 
          data+=x+","+y;

 88: 
          if(t<1)data+=" ";

 89: 
        }

​ 90:  91: 
        return data;

 92: 
      }

​ 93: ​ 94:  95: 
      function Cubic_Bezier(x0,y0,x1,y1,x2,y2,x3,y3)

 96: 
      {

 97: 
        // C(t) = (1-t)^3*P0 + 3t(1-t)^2*P1 + 3(1-t)t^2*P2 + t^3*P3 | t = [0...1]

​ 98:  99: 
        var x,y,t,tm,t0,t1,t2,t3,dt=0.005,data="";

​100: 101: 
        for(t=0;t<=1;t+=dt)

102: 
        {

103: 
          tm=1-t;

104: 
          t0=Math.pow(tm,3);

105: 
          t1=3*t*Math.pow(tm,2);

106: 
          t2=3*tm*Math.pow(t,2);

107: 
          t3=Math.pow(t,3);

108: 
          x=t0*x0 t1*x1 t2*x2 t3*x3;

109: 
          y=t0*y0 t1*y1 t2*y2 t3*y3;

110: 
          data+=x+","+y;

111: 
          if(t<1)data+=" ";

112: 
        }

​113: 114: 
        return data;

115: 
      }

​116: 117: 
      ]]>

118: 
    </script>

119: 
  </defs>

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

122: 
    B&#233;zier-Kurven darstellen / berechnen</text>

​123: 124: 
  <!-- Kurven in SVG-Pfadsyntax -->

125: 
  <g id="g1" visibility="hidden" style="fill: none; stroke: #00C">

126: 
    <!-- Gerade ersetzt lineare Bezier-Kurve (L): P0 ... P3 -->

127: 
    <path d="M130,200 L330,200"/>

128: 
    <!-- quadratische Bezier-Kurve (Q): P0 ... [P1] ... P3  -->

129: 
    <path d="M130,200 Q280,100 330,200"/>

130: 
    <!-- kubische Bezier-Kurve (C): P0 ... [P1 P2] ... P3 -->

131: 
    <path d="M130,200 C280,100 180,300 330,200"/>

132: 
  </g>

​133: 134: 
  <!-- Poly-Linien mit den berechneten Daten (Bezier-Polynome) -->

135: 
  <g id="g2" visibility="hidden" style="fill: none; stroke: #F00">

136: 
    <polyline id="p1" points=""/>

137: 
    <polyline id="p2" points=""/>

138: 
    <polyline id="p3" points=""/>

139: 
  </g>

​140: 141: 
  <!-- Tangenten-Hilfslinien -->

142: 
  <g id="ta" visibility="hidden"

143: 
    style="stroke: gray; stroke-width: 1px; stroke-dasharray: 2,4">

144: 
    <line x1="130" y1="200" x2="280" y2="100"/>

145: 
    <line x1="330" y1="200" x2="180" y2="300"/>

146: 
  </g>

​147: 148: 
  <!-- Startund Zielpunkt -->

149: 
  <circle cx="130" cy="200" r="2.5" style="fill: #F00"/>

150: 
  <text x="125" y="215">P0 (Startpunkt)</text>

151: 
  <circle cx="330" cy="200" r="2.5" style="fill: #FB0"/>

152: 
  <text x="325" y="215">P3 (Zielpunkt)</text>

​153: 154: 
  <!-- Kontrollpunkte (Anfasser) -->

155: 
  <circle cx="280" cy="100" r="2.5" style="fill: #090"/>

156: 
  <text x="275" y="115">P1 (Anfasser 1)</text>

157: 
  <circle cx="180" cy="300" r="2.5" style="fill: #00C"/>

158: 
  <text x="175" y="315">P2 (Anfasser 2)</text>

​159: 160: 
  <a xlink:href="http://de.wikipedia.org/wiki/B%C3%A9zierkurve" target="_blank">

161: 
    <text x="20" y="50">Grundlagen bei Wikipedia

162: 
      <set attributeName="fill" to="#090" begin="mouseover" end="mouseout"/>

163: 
    </text>

164: 
  </a>

​165: 166: 
  <a xlink:href="" cursor="pointer" onclick="return false">

167: 
    <text x="70" y="380" onclick="g1.setAttribute('visibility','visible');

168: 
    g2.setAttribute('visibility','hidden');ta.setAttribute('visibility','visible')">

169: 
      SVG-Pfadsyntax

170: 
      <set attributeName="fill" to="#00C" begin="mouseover" end="mouseout"/>

171: 
    </text>

172: 
  </a>

​173: 174: 
  <a xlink:href="" cursor="pointer" onclick="return false">

175: 
    <text x="200" y="380" onclick="g2.setAttribute('visibility','visible');

176: 
    g1.setAttribute('visibility','hidden');ta.setAttribute('visibility','visible')">

177: 
      B&#233;zier-Polynome

178: 
      <set attributeName="fill" to="#F00" begin="mouseover" end="mouseout"/>

179: 
    </text>

180: 
  </a>

​181: 182: 
  <a xlink:href="" cursor="pointer" onclick="return false">

183: 
    <text x="330" y="380" onclick="g2.setAttribute('visibility','hidden');

184: 
    g1.setAttribute('visibility','hidden');ta.setAttribute('visibility','hidden')">

185: 
      Kurven ausblenden

186: 
      <set attributeName="fill" to="#FB0" begin="mouseover" end="mouseout"/>

187: 
    </text>

188: 
  </a>

​189: 190: 
</svg>

[zum Anfang]