C
void Sphere::triangleTessellation()
{
assert(tessellation >= 0);
// sonst ist die Tessellation zu fein, ggf. diese Zeilen entfernen
// oder die Konstante erhoehen
if (tessellation > 7)
{
cerr << "Zu feine Tessellation, zu hoher Rechenaufwand." << endl;
return;
}
// alte Daten loeschen
sphere.clear();
// Tessellionsverfahren 2 (Tetraeder/rekursive Zerlegung)
// Hinweis: Erzeugen Sie Dreiecke und speichern Sie diese im Array "sphere":
// sphere.push_back(Triangle(pointA,pointB,pointC));
if(tessellation == 0)
return;
// Ecken des Tetraeders (da der Radius 1 ist, muss er nicht weiter beachtet werden)
Vector pointA(-1,-1,-1); pointA.normalize();
Vector pointB(1,1,-1); pointB.normalize();
Vector pointC(-1,1,1); pointC.normalize();
Vector pointD(1,-1,1); pointD.normalize();
// mit den 4 Seiten des Tetraeders die Tessellation beginnen
recursiveSubdivision(Triangle(pointA,pointB,pointC), tessellation-1);
recursiveSubdivision(Triangle(pointA,pointB,pointD), tessellation-1);
recursiveSubdivision(Triangle(pointA,pointC,pointD), tessellation-1);
recursiveSubdivision(Triangle(pointC,pointB,pointD), tessellation-1);
}
/// Dreieck in vier Teildreiecke zerlegen bis recursions==0, dann Array sphere hinzufuegen
void Sphere::recursiveSubdivision(const Triangle& triangle, unsigned int recursionsLeft)
{
assert(recursionsLeft >= 0);
// Ende der Rekursion
if(recursionsLeft == 0) {
sphere.push_back(triangle);
return;
}
// Ein Dreieck in vier Dreiecke zerlegen und neue Ecken auf Kugel projizieren
Vector pointA = 0.5 * (triangle.a + triangle.b); pointA.normalize();
Vector pointB = 0.5 * (triangle.a + triangle.c); pointB.normalize();
Vector pointC = 0.5 * (triangle.c + triangle.b); pointC.normalize();
// Rekursiv selbstaufrufen (Dreiecke erneut zerlegen)
recursiveSubdivision(Triangle(pointA,pointB,pointC), recursionsLeft-1);
recursiveSubdivision(Triangle(pointA,pointB,triangle.a), recursionsLeft-1);
recursiveSubdivision(Triangle(pointA,pointC,triangle.b), recursionsLeft-1);
recursiveSubdivision(Triangle(pointC,pointB,triangle.c), recursionsLeft-1);
}
So, den Rest kann man sich selber zusammen reimen ... isn Ausschnitt aus na ComputerGrafik Hausaufgabe ...
Ansonsten gabs dazu igrendwo n Wiki beitrag, vielleicht mal nach sphere tesselation oder so suchen ...