Geometrie durch Kurven: Unterschied zwischen den Versionen
Aus DGL Wiki
K (→Geometrie durch Kurven: Bildfehler) |
K (→Geometrie durch Kurven) |
||
(6 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt) | |||
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 | + | 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> | |
− | 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. |
+ | <source lang="c"> | ||
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 41: | Zeile 42: | ||
} | } | ||
} | } | ||
+ | </source> | ||
+ | <source lang="c"> | ||
public override void RenderCurve() | public override void RenderCurve() | ||
{ | { | ||
int i, j; | int i, j; | ||
− | + | ||
for (i = 0; i < lengthsegments; i++) | for (i = 0; i < lengthsegments; i++) | ||
{ | { | ||
Zeile 52: | Zeile 55: | ||
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); | ||
Zeile 59: | Zeile 62: | ||
} | } | ||
} | } | ||
+ | </source> | ||
+ | |||
=== Beispiele === | === Beispiele === | ||
==== Torus ==== | ==== Torus ==== | ||
− | I := [0,2* | + | I := [0,2*π] |
− | + | φ(t) = (r*cos(t); r*sin(t); 0) | |
==== (p,q) Torus Knoten ==== | ==== (p,q) Torus Knoten ==== | ||
− | I := [0,2* | + | [[Bild:Torus_Knoten.jpg|thumb|right|100px|Ein Torusknoten]] |
+ | I := [0,2*π] | ||
p,q teilerfremd | 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 + r * Math.Cos(p * t)) * Math.Sin(q * t); | ||
r * Math.Sin(p*t)) | r * Math.Sin(p*t)) | ||
+ | |||
+ | [[Kategorie:Technik_oder_Algorithmus]] |
Aktuelle Version vom 18. Mai 2018, 20:11 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))