00001 #include "quadric.h" 00002 00003 #include <geometry/quaternion.h> 00004 00005 #include <util/glu.h> 00006 00007 #include <iostream> 00008 00009 using geometry::Matrix4d; 00010 using geometry::Point4d; 00011 using geometry::Quaternion; 00012 00013 namespace shape 00014 { 00015 void sphere(const Point3d& center, double radius, int slices, int stacks) 00016 { 00017 glMatrixMode(GL_MODELVIEW); 00018 glPushMatrix(); 00019 glTranslated(center.x(), center.y(), center.z()); 00020 GLUquadric *q = gluNewQuadric(); 00021 gluSphere(q, radius, slices, stacks); 00022 gluDeleteQuadric(q); 00023 glPopMatrix(); 00024 } 00025 00026 void cylinder(const Point3d& base_center, const Point3d& axis, 00027 double radius_base, double radius_top, double length, 00028 int slices, int stacks, bool closed) 00029 { 00030 Quaternion rot(Point3d(0,0,1), axis); 00031 00032 glMatrixMode(GL_MODELVIEW); 00033 glPushMatrix(); 00034 Matrix4d m; 00035 rot.setMatrix(m); 00036 m(0,3) = base_center.x(); 00037 m(1,3) = base_center.y(); 00038 m(2,3) = base_center.z(); 00039 GLdouble mm[16]; 00040 m.fillArray(mm, false); 00041 glMultMatrixd(mm); 00042 GLUquadric *q = gluNewQuadric(); 00043 gluCylinder(q, radius_base, radius_top, length, slices, stacks); 00044 if(closed) 00045 { 00046 gluQuadricOrientation(q, GLU_INSIDE); 00047 gluDisk(q, 0, radius_base, slices, 1); 00048 glTranslated(0,0,length); 00049 gluQuadricOrientation(q, GLU_OUTSIDE); 00050 gluDisk(q, 0, radius_top, slices, 1); 00051 } 00052 gluDeleteQuadric(q); 00053 glPopMatrix(); 00054 } 00055 00056 void disk(const Point3d& center, const Point3d& normal, 00057 double inner_radius, double outer_radius, 00058 int slices, int loops) 00059 { 00060 Quaternion rot(Point3d(0,0,1), normal); 00061 00062 glMatrixMode(GL_MODELVIEW); 00063 glPushMatrix(); 00064 Matrix4d m; 00065 rot.setMatrix(m); 00066 m(0,3) = center.x(); 00067 m(1,3) = center.y(); 00068 m(2,3) = center.z(); 00069 GLdouble mm[16]; 00070 m.fillArray(mm, false); 00071 00072 glMultMatrixd(mm); 00073 GLUquadric *q = gluNewQuadric(); 00074 gluDisk(q, inner_radius, outer_radius, slices, loops); 00075 gluDeleteQuadric(q); 00076 glPopMatrix(); 00077 } 00078 00079 }