Geometrie durch Kurven

Aus DGL Wiki

Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

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
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))
Persönliche Werkzeuge