Geometrie durch Kurven: Unterschied zwischen den Versionen
Aus DGL Wiki
K (→Geometrie durch Kurven: Kategorie hinzugef.) |
K (Fehlerkorrektur) |
||
Zeile 2: | Zeile 2: | ||
[[Bild:Torus_Knoten.jpg|center|Ein Torusknoten]] | [[Bild:Torus_Knoten.jpg|center|Ein Torusknoten]] | ||
− | Die Geometrie vieler | + | 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 R<sup>3</sup>: |
φ: I -> R<sup>3</sup> | φ: I -> R<sup>3</sup> | ||
− | Ist ihre 1. und 2. Ableitung ungleich Null, so kann man sehr leicht ein | + | Ist ihre 1. und 2. Ableitung ungleich Null, so kann man sehr leicht ein geometrisches Objekt erzeugen, denn d/dt φ(t) ist senkrecht zu d<sup>2</sup>/dt<sup>2</sup> φ(t) und d/dt φ(t) zeigt tangential zur Kurve. Mithilfe des [[Vektorprodukt|Kreuzprodukt]]s erhält man so ein begleitendes Dreibein. |
int lengthsegments, int slicesegments; | int lengthsegments, int slicesegments; |
Version vom 12. Oktober 2006, 17:27 Uhr
Inhaltsverzeichnis
Geometrie durch Kurven
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
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))