Geometrie durch Kurven: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
K (Geometrie durch Kurven: Bildfehler)
K (Geometrie durch Kurven: Codeformatierung)
Zeile 7: Zeile 7:
  
 
  int lengthsegments, int slicesegments;
 
  int lengthsegments, int slicesegments;
 
+
 
  private void ConstructCurve() {
 
  private void ConstructCurve() {
 
+
 
     Vertices = new Vertex[lengthsegments + 1, slicesegments + 1];
 
     Vertices = new Vertex[lengthsegments + 1, slicesegments + 1];
 
     Normals = new Vertex[lengthsegments + 1, slicesegments + 1];
 
     Normals = new Vertex[lengthsegments + 1, slicesegments + 1];
 
+
 
     int i, j;
 
     int i, j;
 
     double t;
 
     double t;
 
     Vertex[] Basis = new Vertex[3];
 
     Vertex[] Basis = new Vertex[3];
 
     Vertex v = new Vertex();
 
     Vertex v = new Vertex();
 
+
 
     for (i = 0; i <= lengthsegments; i++)
 
     for (i = 0; i <= lengthsegments; i++)
 
     {
 
     {
 
         t = ((e-a) / (double)lengthsegments) * (double)i + a;
 
         t = ((e-a) / (double)lengthsegments) * (double)i + a;
 
+
 
         v = Phi(t);
 
         v = Phi(t);
 
+
 
         Basis[0] = (dPhi(t)/dt) //1. Ableitung
 
         Basis[0] = (dPhi(t)/dt) //1. Ableitung
 
         Basis[0] = Basis[0].Normalize();
 
         Basis[0] = Basis[0].Normalize();
 
         Basis[1] = (d^2Phi(t)/dt^2) //2. Ableitung
 
         Basis[1] = (d^2Phi(t)/dt^2) //2. Ableitung
 
         Basis[1] = Basis[1].Normalize();
 
         Basis[1] = Basis[1].Normalize();
 
+
 
         Basis[2] = Basis[0] % Basis[1]; //% ist das Kreuzprodukt
 
         Basis[2] = Basis[0] % Basis[1]; //% ist das Kreuzprodukt
 
         //Die Basis ist nun das Mitlaufende Dreibein des Knotens
 
         //Die Basis ist nun das Mitlaufende Dreibein des Knotens
 
+
 
         for (j = 0; j <= slicesegments; j++)  
 
         for (j = 0; j <= slicesegments; j++)  
 
         {
 
         {
Zeile 45: Zeile 45:
 
  {
 
  {
 
     int i, j;
 
     int i, j;
 
+
 
     for (i = 0; i < lengthsegments; i++)
 
     for (i = 0; i < lengthsegments; i++)
 
     {
 
     {
Zeile 52: Zeile 52:
 
             gl.Normal3d(Normals[i, j].x, Normals[i, j].y, Normals[i, j].z);
 
             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.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.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.Vertex3d(Vertices[i + 1, j].x, Vertices[i + 1, j].y, Vertices[i + 1, j].z);

Version vom 11. Oktober 2006, 20:31 Uhr

Geometrie durch Kurven

Torus Knoten.jpg

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 Phi entlang eines Intervalles I=[a,e] in den R^3:

Phi: I -> R^3

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^2/dt^2 Phi(t) und d/dt Phi(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*Pi]
Phi(t) = (r*cos(t); r*sin(t); 0)

(p,q) Torus Knoten

I := [0,2*Pi]
p,q teilerfremd
Phi(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))