// Computergraphik I // Prof. Dr. Juergen Doellner // Sommersemester 2001 // // Rahmenprogramm fuer Aufgabenzettel 8 #include "shape.h" #include #include // // Hilfsfunktionen // static inline double min(double a, double b) { return((a < b) ? a : b); } static inline double max(double a, double b) { return((a > b) ? a : b); } // Berechnet die Normale zum Dreieck. Die Dreieckseckpunkte muessen // dazu im Gegenuhrzeigersinn angegeben werden. static inline Vector normal(const Vector& p0, const Vector& p1, const Vector& p2) { // Verwende die ueberladenen Operatoren von Vector return((p1 - p0) * (p0 - p2)); } // // Triangle // Triangle::Triangle(const Vector& p0, const Vector& p1, const Vector& p2) { points_[0] = p0; points_[1] = p1; points_[2] = p2; } void Triangle::render() { glBegin(GL_TRIANGLES); glNormal3dv(normal(points_[0], points_[1], points_[2]).rep()); glVertex3dv(points_[0].rep()); glVertex3dv(points_[1].rep()); glVertex3dv(points_[2].rep()); glEnd(); } // // Box // Box::Box(const Vector& llf, const Vector& urb) { lowerLeftFront_ = Vector(min(llf[0], urb[0]), min(llf[1], urb[1]), min(llf[2], urb[2])); upperRightBack_ = Vector(max(llf[0], urb[0]), max(llf[1], urb[1]), max(llf[2], urb[2])); } void Box::render() { // damit das Tippen leichter fällt ... #define l lowerLeftFront_ #define r upperRightBack_ // oben Triangle oben1(Vector(l[0], r[1], l[2]), Vector(r[0], r[1], l[2]), Vector(r[0], r[1], r[2])); Triangle oben2(Vector(l[0], r[1], l[2]), Vector(r[0], r[1], r[2]), Vector(l[0], r[1], r[2])); oben1.render(); oben2.render(); // unten Triangle unten1(Vector(l[0], l[1], l[2]), Vector(r[0], l[1], l[2]), Vector(r[0], l[1], r[2])); Triangle unten2(Vector(l[0], l[1], l[2]), Vector(r[0], l[1], r[2]), Vector(l[0], l[1], r[2])); unten1.render(); unten2.render(); // hinten Triangle hinten1(Vector(l[0], l[1], r[2]), Vector(r[0], l[1], r[2]), Vector(r[0], r[1], r[2])); Triangle hinten2(Vector(l[0], l[1], r[2]), Vector(r[0], r[1], r[2]), Vector(l[0], r[1], r[2])); hinten1.render(); hinten2.render(); // vorn Triangle vorn1(Vector(l[0], l[1], l[2]), Vector(r[0], l[1], l[2]), Vector(r[0], r[1], l[2])); Triangle vorn2(Vector(l[0], l[1], l[2]), Vector(r[0], r[1], l[2]), Vector(l[0], r[1], l[2])); vorn1.render(); vorn2.render(); // links Triangle links1(Vector(l[0], l[1], l[2]), Vector(l[0], r[1], r[2]), Vector(l[0], l[1], r[2])); Triangle links2(Vector(l[0], l[1], l[2]), Vector(l[0], r[1], l[2]), Vector(l[0], r[1], r[2])); links1.render(); links2.render(); // rechts Triangle rechts1(Vector(r[0], l[1], l[2]), Vector(r[0], r[1], r[2]), Vector(r[0], l[1], r[2])); Triangle rechts2(Vector(r[0], l[1], l[2]), Vector(r[0], r[1], l[2]), Vector(r[0], r[1], r[2])); rechts1.render(); rechts2.render(); #undef l #undef r }