2 #ifndef GEODESIC_MESH_ELEMENTS_20071231 3 #define GEODESIC_MESH_ELEMENTS_20071231 17 class MeshElementBase;
19 typedef Vertex* vertex_pointer;
20 typedef Edge* edge_pointer;
21 typedef Face* face_pointer;
22 typedef Mesh* mesh_pointer;
23 typedef MeshElementBase* base_pointer;
34 typedef Data* iterator;
36 unsigned size(){
return m_size;};
37 iterator begin(){
return m_begin;};
38 iterator end(){
return m_begin + m_size;};
40 template<
class DataPo
inter>
41 void set_allocation(DataPointer begin,
unsigned size)
43 assert(begin != NULL || size == 0);
45 m_begin = (iterator)begin;
48 Data& operator[](
unsigned i)
51 return *(m_begin + i);
76 typedef SimpleVector<vertex_pointer> vertex_pointer_vector;
77 typedef SimpleVector<edge_pointer> edge_pointer_vector;
78 typedef SimpleVector<face_pointer> face_pointer_vector;
82 m_type(UNDEFINED_POINT)
85 vertex_pointer_vector& adjacent_vertices(){
return m_adjacent_vertices;};
86 edge_pointer_vector& adjacent_edges(){
return m_adjacent_edges;};
87 face_pointer_vector& adjacent_faces(){
return m_adjacent_faces;};
89 unsigned& id(){
return m_id;};
90 PointType type(){
return m_type;};
93 vertex_pointer_vector m_adjacent_vertices;
94 edge_pointer_vector m_adjacent_edges;
95 face_pointer_vector m_adjacent_faces;
112 double* xyz(){
return m_coordinates;};
113 double& x(){
return *m_coordinates;};
114 double& y(){
return *(m_coordinates+1);};
115 double& z(){
return *(m_coordinates+2);};
117 void set(
double new_x,
double new_y,
double new_z)
124 void set(
double* data)
131 double distance(
double* v)
133 double dx = m_coordinates[0] - v[0];
134 double dy = m_coordinates[1] - v[1];
135 double dz = m_coordinates[2] - v[2];
137 return sqrt(dx*dx + dy*dy + dz*dz);
140 double distance(Point3D* v)
142 return distance(v->xyz());
152 void multiply(
double v)
160 double m_coordinates[3];
163 class Vertex:
public MeshElementBase,
public Point3D
173 bool& saddle_or_boundary(){
return m_saddle_or_boundary;};
176 bool m_saddle_or_boundary;
180 class Face:
public MeshElementBase
190 edge_pointer opposite_edge(vertex_pointer v);
191 vertex_pointer opposite_vertex(edge_pointer e);
192 edge_pointer next_edge(edge_pointer e, vertex_pointer v);
194 double vertex_angle(vertex_pointer v)
196 for(
unsigned i=0; i<3; ++i)
198 if(adjacent_vertices()[i]->
id() == v->id())
200 return m_corner_angles[i];
207 double* corner_angles(){
return m_corner_angles;};
210 double m_corner_angles[3];
213 class Edge:
public MeshElementBase
223 double& length(){
return m_length;};
225 face_pointer opposite_face(face_pointer f)
227 if(adjacent_faces().size() == 1)
229 assert(adjacent_faces()[0]->
id() == f->id());
233 assert(adjacent_faces()[0]->
id() == f->id() ||
234 adjacent_faces()[1]->id() == f->id());
236 return adjacent_faces()[0]->id() == f->id() ?
237 adjacent_faces()[1] : adjacent_faces()[0];
240 vertex_pointer opposite_vertex(vertex_pointer v)
244 return adjacent_vertices()[0]->id() == v->id() ?
245 adjacent_vertices()[1] : adjacent_vertices()[0];
248 bool belongs(vertex_pointer v)
250 return adjacent_vertices()[0]->id() == v->id() ||
251 adjacent_vertices()[1]->id() == v->id();
254 bool is_boundary(){
return adjacent_faces().size() == 1;};
256 vertex_pointer v0(){
return adjacent_vertices()[0];};
257 vertex_pointer v1(){
return adjacent_vertices()[1];};
259 void local_coordinates(Point3D* point,
263 double d0 = point->distance(v0());
271 double d1 = point->distance(v1());
279 x = m_length/2.0 + (d0*d0 - d1*d1)/(2.0*m_length);
280 y = sqrt(std::max(0.0, d0*d0 - x*x));
288 class SurfacePoint:
public Point3D
295 SurfacePoint(vertex_pointer v):
296 SurfacePoint::Point3D(v),
300 SurfacePoint(face_pointer f):
304 add(f->adjacent_vertices()[0]);
305 add(f->adjacent_vertices()[1]);
306 add(f->adjacent_vertices()[2]);
310 SurfacePoint(edge_pointer e,
316 vertex_pointer v0 = e->adjacent_vertices()[0];
317 vertex_pointer v1 = e->adjacent_vertices()[1];
319 x() = b*v0->x() + a*v1->x();
320 y() = b*v0->y() + a*v1->y();
321 z() = b*v0->z() + a*v1->z();
324 SurfacePoint(base_pointer g,
328 PointType t = UNDEFINED_POINT):
334 void initialize(SurfacePoint
const& p)
341 PointType type(){
return m_p ? m_p->type() : UNDEFINED_POINT;};
342 base_pointer& base_element(){
return m_p;};
347 inline edge_pointer Face::opposite_edge(vertex_pointer v)
349 for(
unsigned i=0; i<3; ++i)
351 edge_pointer e = adjacent_edges()[i];
361 inline vertex_pointer Face::opposite_vertex(edge_pointer e)
363 for(
unsigned i=0; i<3; ++i)
365 vertex_pointer v = adjacent_vertices()[i];
375 inline edge_pointer Face::next_edge(edge_pointer e, vertex_pointer v)
377 assert(e->belongs(v));
379 for(
unsigned i=0; i<3; ++i)
381 edge_pointer next = adjacent_edges()[i];
382 if(e->id() != next->id() && next->belongs(v))
398 inline bool operator < (
const HalfEdge &x,
const HalfEdge &y)
400 if(x.vertex_0 == y.vertex_0)
402 return x.vertex_1 < y.vertex_1;
406 return x.vertex_0 < y.vertex_0;
410 inline bool operator != (
const HalfEdge &x,
const HalfEdge &y)
412 return x.vertex_0 != y.vertex_0 || x.vertex_1 != y.vertex_1;
415 inline bool operator == (
const HalfEdge &x,
const HalfEdge &y)
417 return x.vertex_0 == y.vertex_0 && x.vertex_1 == y.vertex_1;
Definition: geodesic_cpp_03_02_2008/geodesic_algorithm_base.h:11