Geometrie durch Kurven: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
K (Geometrie durch Kurven: Math. Symb)
K (Geometrie durch Kurven: Kategorie hinzugef.)
Zeile 71: Zeile 71:
 
           (R + r * Math.Cos(p * t)) * Math.Sin(q * t);
 
           (R + r * Math.Cos(p * t)) * Math.Sin(q * t);
 
             r * Math.Sin(p*t))
 
             r * Math.Sin(p*t))
 +
 +
[[Kategorie:Technik_oder_Algorithmus]]

Version vom 12. Oktober 2006, 18:24 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 den 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 Kreuzprodukt 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))