| #ifndef GEODESIC_ALGORITHM_EXACT_ELEMENTS |
| #define GEODESIC_ALGORITHM_EXACT_ELEMENTS |
|
|
| #include "../tools/Types.h" |
|
|
| namespace geodesic { |
|
|
| class Interval; |
| class IntervalList; |
| typedef Interval* interval_pointer; |
| typedef IntervalList* list_pointer; |
| typedef OpenMesh::FaceHandle face_pointer; |
| typedef OpenMesh::EdgeHandle edge_pointer; |
| typedef OpenMesh::VertexHandle vertex_pointer; |
| typedef OpenMesh::HalfedgeHandle halfedge_handle; |
|
|
| struct Triangle // Components of a face to be propagated |
| { |
| face_pointer face; |
|
|
| edge_pointer bottom_edge, |
| left_edge, |
| right_edge; |
|
|
| vertex_pointer top_vertex, |
| left_vertex, |
| right_vertex; |
|
|
| Scalar top_alpha, |
| left_alpha, |
| right_alpha; |
|
|
| list_pointer left_list, |
| right_list; |
| }; |
|
|
| class Interval //interval of the edge |
| { |
| public: |
|
|
| Interval() {}; |
| ~Interval() {}; |
|
|
| Scalar& start() { return m_start; }; |
| Scalar& stop() { return m_stop; }; |
| Scalar& d() { return m_d; }; |
| Scalar& pseudo_x() { return m_pseudo_x; }; |
| Scalar& pseudo_y() { return m_pseudo_y; }; |
|
|
| Scalar& sp() { return m_sp; }; |
|
|
| Scalar& shortest_distance() { return m_shortest_distance; } |
|
|
| interval_pointer& next() { return m_next; }; |
| interval_pointer& previous() { return m_previous; }; |
|
|
| private: |
| Scalar m_start; |
| Scalar m_stop; |
| Scalar m_d; |
| Scalar m_pseudo_x; |
| Scalar m_pseudo_y; |
|
|
| Scalar m_sp; |
|
|
| Scalar m_shortest_distance; |
|
|
| interval_pointer m_next; |
| interval_pointer m_previous; |
| }; |
|
|
| class IntervalList //list of the of intervals of the given edge |
| { |
| public: |
| IntervalList() { m_sp = -1; m_begin = m_end = NULL; } |
| ~IntervalList() {}; |
|
|
| void clear() { m_begin = m_end = NULL; } |
| void initialize(edge_pointer e) { m_edge = e; } |
|
|
| vertex_pointer& start_vertex() { return m_start; } |
| edge_pointer& edge() { return m_edge; } |
|
|
| Scalar& sp() { return m_sp; }; |
|
|
| Scalar& pseudo_x() { return m_pseudo_x; }; |
| Scalar& pseudo_y() { return m_pseudo_y; }; |
|
|
| |
| interval_pointer& begin() { return m_begin; } |
|
|
| interval_pointer& end() { return m_end; } |
|
|
| bool empty() { return m_begin == NULL; } |
|
|
| void push_back(interval_pointer & w) |
| { |
| if (!m_end) |
| { |
| w->previous() = NULL; |
| w->next() = NULL; |
| m_begin = m_end = w; |
| } |
| else |
| { |
| w->next() = NULL; |
| w->previous() = m_end; |
| m_end->next() = w; |
| m_end = w; |
| } |
| } |
|
|
| void erase(interval_pointer & w) |
| { |
| if ((w == m_begin) && (w == m_end)) |
| { |
| m_begin = m_end = NULL; |
| } |
| else if (w == m_begin) |
| { |
| m_begin = m_begin->next(); |
| m_begin->previous() = NULL; |
| } |
| else if (w == m_end) |
| { |
| m_end = m_end->previous(); |
| m_end->next() = NULL; |
| } |
| else |
| { |
| w->previous()->next() = w->next(); |
| w->next()->previous() = w->previous(); |
| } |
| } |
|
|
| private: |
|
|
| edge_pointer m_edge; |
| vertex_pointer m_start; |
|
|
| interval_pointer m_begin; |
| interval_pointer m_end; |
|
|
| Scalar m_pseudo_x; |
| Scalar m_pseudo_y; |
|
|
| Scalar m_sp; |
| }; |
|
|
| } |
|
|
| #endif |
|
|