Geometrie durch Kurven: Unterschied zwischen den Versionen
Aus DGL Wiki
K (→Geometrie durch Kurven: Codeformatierung) |
Flash (Diskussion | Beiträge) K (Bild beschriftet und an passender Stelle erneut eingebunden) |
||
Zeile 1: | Zeile 1: | ||
== Geometrie durch Kurven == | == Geometrie durch Kurven == | ||
− | [[Bild:Torus_Knoten.jpg|center]] | + | [[Bild:Torus_Knoten.jpg|center|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 Phi entlang eines Intervalles I=[a,e] in den R^3: | 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: | ||
Zeile 65: | Zeile 65: | ||
Phi(t) = (r*cos(t); r*sin(t); 0) | Phi(t) = (r*cos(t); r*sin(t); 0) | ||
==== (p,q) Torus Knoten ==== | ==== (p,q) Torus Knoten ==== | ||
+ | [[Bild:Torus_Knoten.jpg|thumb|right|100px|Ein Torusknoten]] | ||
I := [0,2*Pi] | I := [0,2*Pi] | ||
p,q teilerfremd | p,q teilerfremd |
Version vom 11. Oktober 2006, 21:53 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 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))