Geometrie durch Kurven: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
K (Fehlerkorrektur)
K (Geometrie durch Kurven)
 
Zeile 6: Zeile 6:
 
Ist ihre 1. und 2. Ableitung ungleich Null, so kann man sehr leicht ein geometrisches Objekt erzeugen, denn d/dt &phi;(t) ist senkrecht zu d<sup>2</sup>/dt<sup>2</sup> &phi;(t) und d/dt &phi;(t) zeigt tangential zur Kurve. Mithilfe des [[Vektorprodukt|Kreuzprodukt]]s erhält man so ein begleitendes Dreibein.
 
Ist ihre 1. und 2. Ableitung ungleich Null, so kann man sehr leicht ein geometrisches Objekt erzeugen, denn d/dt &phi;(t) ist senkrecht zu d<sup>2</sup>/dt<sup>2</sup> &phi;(t) und d/dt &phi;(t) zeigt tangential zur Kurve. Mithilfe des [[Vektorprodukt|Kreuzprodukt]]s erhält man so ein begleitendes Dreibein.
  
 +
<source lang="c">
 
  int lengthsegments, int slicesegments;
 
  int lengthsegments, int slicesegments;
 
   
 
   
Zeile 41: Zeile 42:
 
     }
 
     }
 
  }
 
  }
 +
</source>
  
 +
<source lang="c">
 
  public override void RenderCurve()
 
  public override void RenderCurve()
 
  {
 
  {
Zeile 59: Zeile 62:
 
     }
 
     }
 
  }
 
  }
 +
</source>
 +
  
 
=== Beispiele ===
 
=== Beispiele ===

Aktuelle Version vom 18. Mai 2018, 21:11 Uhr

Geometrie durch Kurven

Ein Torusknoten

Die Geometrie vieler kurvenförmiger Objekte lässt sich leicht erzeugen, wenn man eine Kurve kennt, die an ihnen entlang führt. Man hat also eine Funktion φ entlang eines Intervalles I=[a,e] in R3:

φ: I -> R3

Ist ihre 1. und 2. Ableitung ungleich Null, so kann man sehr leicht ein geometrisches Objekt erzeugen, denn d/dt φ(t) ist senkrecht zu d2/dt2 φ(t) und d/dt φ(t) zeigt tangential zur Kurve. Mithilfe des Kreuzprodukts erhält man so ein begleitendes Dreibein.

 int lengthsegments, int slicesegments;
 
 private void ConstructCurve() {
 
     Vertices = new Vertex[lengthsegments + 1, slicesegments + 1];
     Normals = new Vertex[lengthsegments + 1, slicesegments + 1];
 
     int i, j;
     double t;
     Vertex[] Basis = new Vertex[3];
     Vertex v = new Vertex();
 
     for (i = 0; i <= lengthsegments; i++)
     {
         t = ((e-a) / (double)lengthsegments) * (double)i + a;
 
         v = Phi(t);
 
         Basis[0] = (dPhi(t)/dt) //1. Ableitung
         Basis[0] = Basis[0].Normalize();
         Basis[1] = (d^2Phi(t)/dt^2) //2. Ableitung
         Basis[1] = Basis[1].Normalize();
 
         Basis[2] = Basis[0] % Basis[1]; //% ist das Kreuzprodukt
         //Die Basis ist nun das Mitlaufende Dreibein des Knotens
 
         for (j = 0; j <= slicesegments; j++) 
         {
             double mu = 1.0/(double) slicesegments *2.0*Math.PI * j;
             Normals[i,j] = Math.Sin(mu)*Basis[1] +
                             Math.Cos(mu)*Basis[2]; 
             Vertices[i,j] = tuberadius * Normals[i,j] + v;
         }
     }
 }
 public override void RenderCurve()
 {
     int i, j;
 
     for (i = 0; i < lengthsegments; i++)
     {
         gl.Begin(gl.TRIANGLE_STRIP);
         for (j = 0; j <= slicesegments; j++) {
             gl.Normal3d(Normals[i, j].x, Normals[i, j].y, Normals[i, j].z);
             gl.Vertex3d(Vertices[i, j].x, Vertices[i, j].y, Vertices[i, j].z);
           
             gl.Normal3d(Normals[i + 1, j].x, Normals[i + 1, j].y, Normals[i + 1, j].z);
             gl.Vertex3d(Vertices[i + 1, j].x, Vertices[i + 1, j].y, Vertices[i + 1, j].z);
         }
         gl.End();
     }
 }


Beispiele

Torus

I := [0,2*π]
φ(t) = (r*cos(t); r*sin(t); 0)

(p,q) Torus Knoten

Ein Torusknoten
I := [0,2*π]
p,q teilerfremd
φ(t) = ((R + r * Math.Cos(p * t)) * Math.Cos(q * t); 
          (R + r * Math.Cos(p * t)) * Math.Sin(q * t);
           r * Math.Sin(p*t))