00001 #ifndef TRIANGLESET_H
00002 #define TRIANGLESET_H
00003
00011 #include "Triangle.h"
00012
00013 #include <vector>
00014 #include <math.h>
00015
00016 #ifndef BUILDING_DOX
00017 struct Triangle;
00018 #endif
00019
00025 class TriangleSet {
00026 public:
00033 static float distance(Vertex a, Vertex b) {
00034 const float dx = a.x - b.x;
00035 const float dy = a.y - b.y;
00036 const float dz = a.z - b.z;
00037
00038 return sqrtf(dx*dx + dy*dy + dz*dz);
00039 }
00040
00048 static Vertex centre(Vertex a, Vertex b) {
00049 return Vertex(
00050 (a.x + b.x)/2,
00051 (a.y + b.y)/2,
00052 (a.z + b.z)/2);
00053 }
00054
00060 void add(Triangle *triangle);
00061
00067 void add(TriangleSet* tset);
00068
00073 size_t count();
00074
00080 Triangle& operator[] (unsigned index);
00081
00090 template <int QUALITY> static float size (Triangle* triangle);
00091
00098 static TriangleSet* divide(Triangle *triangle);
00099
00100 private:
00101 typedef std::vector<Triangle> TContainer;
00102 TContainer container_;
00103
00104 };
00105
00111 template <> inline float TriangleSet::size<0> (Triangle *t) {
00112 Vertex *v = t->vertex;
00113 float size = 0.0;
00114 for(int i=0; i<3; i++)
00115 size+= distance(v[i], v[(i+1)%3]);
00116
00117 return size;
00118 }
00119
00125 template <> inline float TriangleSet::size<1> (Triangle *t) {
00126 Vertex *v = t->vertex;
00127 float length[3];
00128 float sum = 0.0;
00129 for(int i=0; i<3; i++)
00130 sum+= length[i]= distance(v[i], v[(i+1)%3]);
00131
00132 float size = (sum/=2);
00133 for(int i=0; i<3; i++)
00134 size*= sum-length[i];
00135
00136 return sqrtf(size);
00137 }
00138
00139
00140 #endif // TRIANGLESET_H