polyhedron.cpp
00001 #include "polyhedron.h"
00002
00003 #include <util/gl.h>
00004
00005 namespace shape
00006 {
00007
00008 void cube(const Point3d& center, const Point3d& axis1_, const Point3d& axis2_, double size)
00009 {
00010 Point3d axis1 = util::normalized(axis1_);
00011 Point3d axis3 = util::normalized(axis1 ^ axis2_);
00012 Point3d axis2 = axis3 ^ axis1;
00013 axis1 *= size;
00014 axis2 *= size;
00015 axis3 *= size;
00016
00017 Point3d c1 = center - (axis1 + axis2 + axis3)/2;
00018 Point3d c2 = c1 + axis1;
00019 Point3d c3 = c2 + axis2;
00020 Point3d c4 = c1 + axis2;
00021
00022 Point3d c5 = c1 + axis3;
00023 Point3d c6 = c5 + axis1;
00024 Point3d c7 = c6 + axis2;
00025 Point3d c8 = c5 + axis2;
00026
00027 glBegin(GL_QUADS);
00028
00029 glNormal3dv((-axis2).c_data());
00030 glVertex3dv(c1.c_data());
00031 glVertex3dv(c2.c_data());
00032 glVertex3dv(c6.c_data());
00033 glVertex3dv(c5.c_data());
00034
00035 glNormal3dv((axis1).c_data());
00036 glVertex3dv(c2.c_data());
00037 glVertex3dv(c3.c_data());
00038 glVertex3dv(c7.c_data());
00039 glVertex3dv(c6.c_data());
00040
00041 glNormal3dv((axis2).c_data());
00042 glVertex3dv(c3.c_data());
00043 glVertex3dv(c4.c_data());
00044 glVertex3dv(c8.c_data());
00045 glVertex3dv(c7.c_data());
00046
00047 glNormal3dv((-axis1).c_data());
00048 glVertex3dv(c4.c_data());
00049 glVertex3dv(c1.c_data());
00050 glVertex3dv(c5.c_data());
00051 glVertex3dv(c8.c_data());
00052
00053 glNormal3dv((-axis3).c_data());
00054 glVertex3dv(c1.c_data());
00055 glVertex3dv(c4.c_data());
00056 glVertex3dv(c3.c_data());
00057 glVertex3dv(c2.c_data());
00058
00059 glNormal3dv((axis3).c_data());
00060 glVertex3dv(c5.c_data());
00061 glVertex3dv(c6.c_data());
00062 glVertex3dv(c7.c_data());
00063 glVertex3dv(c8.c_data());
00064
00065 glEnd();
00066 }
00067
00068 void parallelepiped(const Point3d& corner, const Point3d& edge1, const Point3d& edge2, const Point3d& edge3)
00069 {
00070 Point3d norm12 = edge1 ^ edge2;
00071 Point3d norm23 = edge2 ^ edge3;
00072 Point3d norm13 = edge1 ^ edge3;
00073
00074 Point3d c1 = corner;
00075 Point3d c2 = c1+edge1;
00076 Point3d c3 = c2+edge2;
00077 Point3d c4 = c1+edge2;
00078
00079 Point3d c5 = c1+edge3;
00080 Point3d c6 = c5+edge1;
00081 Point3d c7 = c6+edge2;
00082 Point3d c8 = c5+edge2;
00083
00084 glBegin(GL_QUADS);
00085
00086 glNormal3dv((norm13).c_data());
00087 glVertex3dv(c1.c_data());
00088 glVertex3dv(c2.c_data());
00089 glVertex3dv(c6.c_data());
00090 glVertex3dv(c5.c_data());
00091
00092 glNormal3dv((norm23).c_data());
00093 glVertex3dv(c2.c_data());
00094 glVertex3dv(c3.c_data());
00095 glVertex3dv(c7.c_data());
00096 glVertex3dv(c6.c_data());
00097
00098 glNormal3dv((-norm13).c_data());
00099 glVertex3dv(c3.c_data());
00100 glVertex3dv(c4.c_data());
00101 glVertex3dv(c8.c_data());
00102 glVertex3dv(c7.c_data());
00103
00104 glNormal3dv((-norm23).c_data());
00105 glVertex3dv(c4.c_data());
00106 glVertex3dv(c1.c_data());
00107 glVertex3dv(c5.c_data());
00108 glVertex3dv(c8.c_data());
00109
00110 glNormal3dv((-norm12).c_data());
00111 glVertex3dv(c1.c_data());
00112 glVertex3dv(c4.c_data());
00113 glVertex3dv(c3.c_data());
00114 glVertex3dv(c2.c_data());
00115
00116 glNormal3dv((norm12).c_data());
00117 glVertex3dv(c5.c_data());
00118 glVertex3dv(c6.c_data());
00119 glVertex3dv(c7.c_data());
00120 glVertex3dv(c8.c_data());
00121
00122 glEnd();
00123 }
00124
00125 }
00126