Geometrie durch Kurven

Aus DGL Wiki
Version vom 18. Mai 2018, 21:11 Uhr von Mathias (Diskussion | Beiträge) (Geometrie durch Kurven)

(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

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))