45#ifndef LASS_GUARDIAN_OF_INCLUSION_SPAT_QUAD_EDGE_H
46#define LASS_GUARDIAN_OF_INCLUSION_SPAT_QUAD_EDGE_H
54 template<
typename EdgeHandle >
58 typedef EdgeHandle TEdgeHandle;
62 friend class QuadEdge<EdgeHandle>;
64 Edge() : next_(NULL) {}
66 Edge* rot() {
return (index_ < 3) ?
this + 1 :
this - 3; }
67 Edge* invRot(){
return (index_ > 0) ?
this - 1 :
this + 3; }
68 Edge* sym() {
return (index_ < 2) ?
this + 2 :
this - 2; }
69 Edge* oNext() {
return next_; }
70 Edge* oPrev() {
return rot()->oNext()->rot(); }
71 Edge* dNext() {
return sym()->oNext()->sym(); }
72 Edge* dPrev() {
return invRot()->oNext()->invRot(); }
73 Edge* lNext() {
return invRot()->oNext()->rot(); }
74 Edge* lPrev() {
return oNext()->sym(); }
75 Edge* rNext() {
return rot()->oNext()->invRot(); }
76 Edge* rPrev() {
return sym()->oNext(); }
78 const Edge* rot()
const {
return (index_ < 3) ?
this + 1 :
this - 3; }
79 const Edge* invRot()
const{
return (index_ > 0) ?
this - 1 :
this + 3; }
80 const Edge* sym()
const {
return (index_ < 2) ?
this + 2 :
this - 2; }
81 const Edge* oNext()
const {
return next_; }
82 const Edge* oPrev()
const {
return rot()->oNext()->rot(); }
83 const Edge* dNext()
const {
return sym()->oNext()->sym(); }
84 const Edge* dPrev()
const {
return invRot()->oNext()->invRot(); }
85 const Edge* lNext()
const {
return invRot()->oNext()->rot(); }
86 const Edge* lPrev()
const {
return oNext()->sym(); }
87 const Edge* rNext()
const {
return rot()->oNext()->invRot(); }
88 const Edge* rPrev()
const {
return sym()->oNext(); }
90 const QuadEdge* quadEdge()
const {
return (QuadEdge*)(
this - index_); }
91 QuadEdge* quadEdge() {
return (QuadEdge*)(
this - index_); }
92 const EdgeHandle& handle()
const {
return edgeHandle_;}
93 EdgeHandle& handle() {
return edgeHandle_; }
94 bool isConstrained()
const {
return quadEdge()->isConstrained(); }
95 bool isEdgeConstrained()
const {
return quadEdge()->isEdgeConstrained(); }
96 bool isFaceConstrained()
const {
return quadEdge()->isFaceConstrained(); }
98 int index()
const {
return index_; }
101 EdgeHandle edgeHandle_;
107 QuadEdge(
bool makeConstrained=
false);
108 QuadEdge(
const QuadEdge& other);
111 QuadEdge& operator=(
const QuadEdge& other);
113 void edgeConstrain();
114 void edgeDeconstrain();
115 void faceConstrain();
116 void faceDeconstrain();
117 bool isConstrained()
const;
118 bool isEdgeConstrained()
const;
119 bool isFaceConstrained()
const;
122 static void splice( Edge* a, Edge* b);
128 void copyEdges(
const QuadEdge& other);
131 bool edgeConstrained_;
132 bool faceConstrained_;
138 template<
typename EdgeHandle > QuadEdge<EdgeHandle>::QuadEdge(
bool makeEdgeConstrained)
140 edgeConstrained_ = makeEdgeConstrained;
141 faceConstrained_ =
false;
146 template<
typename EdgeHandle > QuadEdge<EdgeHandle>::QuadEdge(
const QuadEdge& other):
147 edgeConstrained_(other.edgeConstrained_),
148 faceConstrained_(other.faceConstrained_),
149 deleted(other.deleted)
155 template<
typename EdgeHandle > QuadEdge<EdgeHandle>& QuadEdge<EdgeHandle>::operator=(
const QuadEdge& other)
157 deleted = other.deleted;
162 template<
typename EdgeHandle > QuadEdge<EdgeHandle>::~QuadEdge()
164 LASS_ASSERT( !faceConstrained_ );
168 template<
typename EdgeHandle >
void QuadEdge<EdgeHandle>::detach()
170 LASS_ASSERT( !faceConstrained_ );
172 splice(edges_, edges_->oPrev());
173 splice(edges_->sym(), edges_->sym()->oPrev());
178 template<
typename EdgeHandle >
void QuadEdge<EdgeHandle>::splice( Edge* a, Edge* b )
180 Edge* alpha = a->oNext()->rot();
181 Edge* beta = b->oNext()->rot();
183 Edge* t1 = b->oNext();
184 Edge* t2 = a->oNext();
185 Edge* t3 = beta->oNext();
186 Edge* t4 = alpha->oNext();
194 template<
typename EdgeHandle >
void QuadEdge<EdgeHandle>::edgeConstrain()
196 edgeConstrained_ =
true;
198 template<
typename EdgeHandle >
void QuadEdge<EdgeHandle>::edgeDeconstrain()
200 edgeConstrained_ =
false;
202 template<
typename EdgeHandle >
void QuadEdge<EdgeHandle>::faceConstrain()
204 faceConstrained_ =
true;
206 template<
typename EdgeHandle >
void QuadEdge<EdgeHandle>::faceDeconstrain()
208 faceConstrained_ =
false;
210 template<
typename EdgeHandle >
bool QuadEdge<EdgeHandle>::isConstrained()
const
212 return edgeConstrained_ || faceConstrained_;
214 template<
typename EdgeHandle >
bool QuadEdge<EdgeHandle>::isEdgeConstrained()
const
216 return edgeConstrained_;
218 template<
typename EdgeHandle >
bool QuadEdge<EdgeHandle>::isFaceConstrained()
const
220 return faceConstrained_;
222 template<
typename EdgeHandle >
typename QuadEdge<EdgeHandle>::Edge* QuadEdge<EdgeHandle>::edges()
277 template<
typename EdgeHandle >
void QuadEdge<EdgeHandle>::initEdges()
279 for (
int i=0;i<4;++i)
280 edges_[i].index_ = i;
281 edges_[0].next_ = &edges_[0];
282 edges_[1].next_ = &edges_[3];
283 edges_[2].next_ = &edges_[2];
284 edges_[3].next_ = &edges_[1];
287 template<
typename EdgeHandle >
void QuadEdge<EdgeHandle>::copyEdges(
const QuadEdge& other)
289 for (
int i=0;i<4;++i)
290 edges_[i].edgeHandle_ = other.edges_[i].edgeHandle_;
spatial subdivisions, quadtrees, octrees, meshes in 2D and 3D, triangulators, ...
Library for Assembled Shared Sources.