2 #ifndef GEODESIC_MESH_ELEMENTS_20071231 3 #define GEODESIC_MESH_ELEMENTS_20071231 16 class MeshElementBase;
18 typedef Vertex* vertex_pointer;
19 typedef Edge* edge_pointer;
20 typedef Face* face_pointer;
21 typedef Mesh* mesh_pointer;
22 typedef MeshElementBase* base_pointer;
33 typedef Data* iterator;
35 unsigned size(){
return m_size;};
36 iterator begin(){
return m_begin;};
37 iterator end(){
return m_begin + m_size;};
39 template<
class DataPo
inter>
40 void set_allocation(DataPointer begin,
unsigned size)
42 FEASSERT(begin != NULL || size == 0);
44 m_begin = (iterator)begin;
47 Data& operator[](
unsigned i)
50 return *(m_begin + i);
75 typedef SimpleVector<vertex_pointer> vertex_pointer_vector;
76 typedef SimpleVector<edge_pointer> edge_pointer_vector;
77 typedef SimpleVector<face_pointer> face_pointer_vector;
81 m_type(UNDEFINED_POINT)
84 vertex_pointer_vector& adjacent_vertices(){
return m_adjacent_vertices;};
85 edge_pointer_vector& adjacent_edges(){
return m_adjacent_edges;};
86 face_pointer_vector& adjacent_faces(){
return m_adjacent_faces;};
88 unsigned& id(){
return m_id;};
89 PointType type(){
return m_type;};
92 vertex_pointer_vector m_adjacent_vertices;
93 edge_pointer_vector m_adjacent_edges;
94 face_pointer_vector m_adjacent_faces;
111 double* xyz(){
return m_coordinates;};
112 double& x(){
return *m_coordinates;};
113 double& y(){
return *(m_coordinates+1);};
114 double& z(){
return *(m_coordinates+2);};
116 void set(
double new_x,
double new_y,
double new_z)
123 void set(
double* data)
130 double distance(
double* v)
132 double dx = m_coordinates[0] - v[0];
133 double dy = m_coordinates[1] - v[1];
134 double dz = m_coordinates[2] - v[2];
136 return sqrt(dx*dx + dy*dy + dz*dz);
139 double distance(Point3D* v)
141 return distance(v->xyz());
151 void multiply(
double v)
159 double m_coordinates[3];
162 class Vertex:
public MeshElementBase,
public Point3D
172 bool& saddle_or_boundary(){
return m_saddle_or_boundary;};
175 bool m_saddle_or_boundary;
179 class Face:
public MeshElementBase
189 edge_pointer opposite_edge(vertex_pointer v);
190 vertex_pointer opposite_vertex(edge_pointer e);
191 edge_pointer next_edge(edge_pointer e, vertex_pointer v);
193 double vertex_angle(vertex_pointer v)
195 for(
unsigned i=0; i<3; ++i)
197 if(adjacent_vertices()[i]->
id() == v->id())
199 return m_corner_angles[i];
206 double* corner_angles(){
return m_corner_angles;};
209 double m_corner_angles[3];
212 class Edge:
public MeshElementBase
222 double& length(){
return m_length;};
224 face_pointer opposite_face(face_pointer f)
226 if(adjacent_faces().size() == 1)
228 FEASSERT(adjacent_faces()[0]->
id() == f->id());
232 FEASSERT(adjacent_faces()[0]->
id() == f->id() ||
233 adjacent_faces()[1]->id() == f->id());
235 return adjacent_faces()[0]->id() == f->id() ?
236 adjacent_faces()[1] : adjacent_faces()[0];
239 vertex_pointer opposite_vertex(vertex_pointer v)
241 FEASSERT(belongs(v));
243 return adjacent_vertices()[0]->id() == v->id() ?
244 adjacent_vertices()[1] : adjacent_vertices()[0];
247 bool belongs(vertex_pointer v)
249 return adjacent_vertices()[0]->id() == v->id() ||
250 adjacent_vertices()[1]->id() == v->id();
253 bool is_boundary(){
return adjacent_faces().size() == 1;};
255 vertex_pointer v0(){
return adjacent_vertices()[0];};
256 vertex_pointer v1(){
return adjacent_vertices()[1];};
258 void local_coordinates(Point3D* point,
262 double d0 = point->distance(v0());
270 double d1 = point->distance(v1());
278 x = m_length/2.0 + (d0*d0 - d1*d1)/(2.0*m_length);
279 y = sqrt(std::max(0.0, d0*d0 - x*x));
287 class SurfacePoint:
public Point3D
294 SurfacePoint(vertex_pointer v):
295 SurfacePoint::Point3D(v),
299 SurfacePoint(face_pointer f):
303 add(f->adjacent_vertices()[0]);
304 add(f->adjacent_vertices()[1]);
305 add(f->adjacent_vertices()[2]);
309 SurfacePoint(edge_pointer e,
315 vertex_pointer v0 = e->adjacent_vertices()[0];
316 vertex_pointer v1 = e->adjacent_vertices()[1];
318 x() = b*v0->x() + a*v1->x();
319 y() = b*v0->y() + a*v1->y();
320 z() = b*v0->z() + a*v1->z();
323 SurfacePoint(base_pointer g,
327 PointType t = UNDEFINED_POINT):
333 void initialize(SurfacePoint
const& p)
340 PointType type(){
return m_p ? m_p->type() : UNDEFINED_POINT;};
341 base_pointer& base_element(){
return m_p;};
346 inline edge_pointer Face::opposite_edge(vertex_pointer v)
348 for(
unsigned i=0; i<3; ++i)
350 edge_pointer e = adjacent_edges()[i];
360 inline vertex_pointer Face::opposite_vertex(edge_pointer e)
362 for(
unsigned i=0; i<3; ++i)
364 vertex_pointer v = adjacent_vertices()[i];
374 inline edge_pointer Face::next_edge(edge_pointer e, vertex_pointer v)
376 FEASSERT(e->belongs(v));
378 for(
unsigned i=0; i<3; ++i)
380 edge_pointer next = adjacent_edges()[i];
381 if(e->id() != next->id() && next->belongs(v))
397 inline bool operator < (
const HalfEdge &x,
const HalfEdge &y)
399 if(x.vertex_0 == y.vertex_0)
401 return x.vertex_1 < y.vertex_1;
405 return x.vertex_0 < y.vertex_0;
409 inline bool operator != (
const HalfEdge &x,
const HalfEdge &y)
411 return x.vertex_0 != y.vertex_0 || x.vertex_1 != y.vertex_1;
414 inline bool operator == (
const HalfEdge &x,
const HalfEdge &y)
416 return x.vertex_0 == y.vertex_0 && x.vertex_1 == y.vertex_1;
Definition: geodesic_cpp_03_02_2008/geodesic_algorithm_base.h:11