14 #include "../geometry/GeomUtils.h"
26 ViewMap *ViewMap::_pInstance =
nullptr;
31 for (vector<ViewVertex *>::iterator vv = _VVertices.begin(), vvend = _VVertices.end();
38 for (vector<ViewShape *>::iterator vs = _VShapes.begin(), vsend = _VShapes.end(); vs != vsend;
51 vector<FEdge *> tmpEdges;
53 for (vector<ViewShape *>::iterator vs = _VShapes.begin(), vsend = _VShapes.end(); vs != vsend;
55 vector<FEdge *> &edges = (*vs)->sshape()->getEdgeList();
56 for (vector<FEdge *>::iterator it = edges.begin(), itend = edges.end(); it != itend; it++) {
57 if ((*it)->isTemporary()) {
58 (*it)->setTemporary(
false);
59 tmpEdges.push_back(*it);
64 for (vector<FEdge *>::iterator it = tmpEdges.begin(), itend = tmpEdges.end(); it != itend;
66 for (vector<ViewShape *>::iterator vs = _VShapes.begin(), vsend = _VShapes.end(); vs != vsend;
68 (*vs)->sshape()->RemoveEdge(*it);
70 (*it)->vertexA()->RemoveFEdge(*it);
71 (*it)->vertexB()->RemoveFEdge(*it);
78 int index = _shapeIdToIndex[
id];
79 return _VShapes[index];
84 _shapeIdToIndex[iVShape->
getId().
getFirst()] = _VShapes.size();
85 _VShapes.push_back(iVShape);
91 real minDist = DBL_MAX;
92 FEdge *winner =
nullptr;
93 for (fedges_container::const_iterator fe = _FEdges.begin(), feend = _FEdges.end(); fe != feend;
95 Vec2d A((*fe)->vertexA()->point2D()[0], (*fe)->vertexA()->point2D()[1]);
96 Vec2d B((*fe)->vertexB()->point2D()[0], (*fe)->vertexB()->point2D()[1]);
97 real dist = GeomUtils::distPointSegment<Vec2r>(
Vec2r(
x,
y),
A,
B);
110 real minDist = DBL_MAX;
111 FEdge *winner =
nullptr;
112 for (fedges_container::const_iterator fe = _FEdges.begin(), feend = _FEdges.end(); fe != feend;
114 Vec2d A((*fe)->vertexA()->point2D()[0], (*fe)->vertexA()->point2D()[1]);
115 Vec2d B((*fe)->vertexB()->point2D()[0], (*fe)->vertexB()->point2D()[1]);
116 real dist = GeomUtils::distPointSegment<Vec2r>(
Vec2r(
x,
y),
A,
B);
117 if (dist < minDist) {
180 const vector<FEdge *> &fedges = iVertex->
fedges();
181 if (fedges.size() != 2) {
182 cerr <<
"ViewMap warning: Can't split the ViewEdge" << endl;
185 FEdge *fend(
nullptr), *fbegin(
nullptr);
186 for (vector<FEdge *>::const_iterator fe = fedges.begin(), feend = fedges.end(); fe != feend;
188 if ((*fe)->vertexB() == iVertex) {
191 if ((*fe)->vertexA() == iVertex) {
194 if ((fbegin !=
nullptr) && (fend !=
nullptr)) {
202 if (ioEdge->
A() ==
nullptr) {
214 fend->setNextEdge(
nullptr);
235 fend->setNextEdge(
nullptr);
244 vvb->
Replace(ioEdge, newVEdge);
253 newViewEdges.push_back(newVEdge);
260 _VVertices.push_back(vva);
266 FEdge *ViewMap::Connect(
FEdge *ioEdge,
SVertex *ioVertex, vector<ViewEdge *> &oNewVEdges)
289 fe1 = dve1.first->fedgeB();
292 fe1 = dve1.first->fedgeA();
296 fe2 = dve2.first->fedgeB();
299 fe2 = dve2.first->fedgeA();
313 return (
v1.x() >
v2.x());
320 return (
v1.x() <
v2.x());
326 cerr <<
"Warning: null pointer passed as argument of TVertex::setFrontEdgeA()" << endl;
330 if (!_sortedEdges.empty()) {
331 edge_pointers_container::iterator dve = _sortedEdges.begin(), dveend = _sortedEdges.end();
332 for (; (dve != dveend) &&
ViewEdgeComp(**dve, _FrontEdgeA); ++dve) {
335 _sortedEdges.insert(dve, &_FrontEdgeA);
338 _sortedEdges.push_back(&_FrontEdgeA);
345 cerr <<
"Warning: null pointer passed as argument of TVertex::setFrontEdgeB()" << endl;
349 if (!_sortedEdges.empty()) {
350 edge_pointers_container::iterator dve = _sortedEdges.begin(), dveend = _sortedEdges.end();
351 for (; (dve != dveend) &&
ViewEdgeComp(**dve, _FrontEdgeB); ++dve) {
354 _sortedEdges.insert(dve, &_FrontEdgeB);
357 _sortedEdges.push_back(&_FrontEdgeB);
364 cerr <<
"Warning: null pointer passed as argument of TVertex::setBackEdgeA()" << endl;
368 if (!_sortedEdges.empty()) {
369 edge_pointers_container::iterator dve = _sortedEdges.begin(), dveend = _sortedEdges.end();
370 for (; (dve != dveend) &&
ViewEdgeComp(**dve, _BackEdgeA); ++dve) {
373 _sortedEdges.insert(dve, &_BackEdgeA);
376 _sortedEdges.push_back(&_BackEdgeA);
383 cerr <<
"Warning: null pointer passed as argument of TVertex::setBackEdgeB()" << endl;
387 if (!_sortedEdges.empty()) {
388 edge_pointers_container::iterator dve = _sortedEdges.begin(), dveend = _sortedEdges.end();
389 for (; (dve != dveend) &&
ViewEdgeComp(**dve, _BackEdgeB); ++dve) {
392 _sortedEdges.insert(dve, &_BackEdgeB);
395 _sortedEdges.push_back(&_BackEdgeB);
403 if ((iOld == _FrontEdgeA.first) && (_FrontEdgeA.first->B() ==
this)) {
404 _FrontEdgeA.first = iNew;
407 if ((iOld == _FrontEdgeB.first) && (_FrontEdgeB.first->B() ==
this)) {
408 _FrontEdgeB.first = iNew;
411 if ((iOld == _BackEdgeA.first) && (_BackEdgeA.first->B() ==
this)) {
412 _BackEdgeA.first = iNew;
415 if ((iOld == _BackEdgeB.first) && (_BackEdgeB.first->B() ==
this)) {
416 _BackEdgeB.first = iNew;
425 return edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.begin());
431 return const_edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.begin());
438 return edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.end());
450 for (edge_pointers_container::iterator it = _sortedEdges.begin(), itend = _sortedEdges.end();
453 if ((*it)->first == iEdge) {
454 return edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), it);
457 return edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.begin());
461 if (_FrontEdgeA.first == iEdge) {
464 else if (_FrontEdgeB.first == iEdge) {
467 else if (_BackEdgeA.first == iEdge) {
470 else if (_BackEdgeB.first == iEdge) {
473 return edge_iterator(_FrontEdgeA, _FrontEdgeB, _BackEdgeA, _BackEdgeB, dEdge);
479 for (edge_pointers_container::const_iterator it = _sortedEdges.begin(),
480 itend = _sortedEdges.end();
483 if ((*it)->first == iEdge) {
487 return const_edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.begin());
491 if (_FrontEdgeA.first == iEdge) {
494 else if (_FrontEdgeB.first == iEdge) {
497 else if (_BackEdgeA.first == iEdge) {
500 else if (_BackEdgeB.first == iEdge) {
510 _sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.begin());
516 _sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.end());
521 for (edge_pointers_container::iterator it = _sortedEdges.begin(), itend = _sortedEdges.end();
524 if ((*it)->first == iEdge) {
526 _sortedEdges.begin(), _sortedEdges.end(), it);
530 _sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.begin());
545 if (!_ViewEdges.empty()) {
546 edges_container::iterator dve = _ViewEdges.begin(), dveend = _ViewEdges.end();
547 for (; (dve != dveend) &&
ViewEdgeComp(*dve, idve); ++dve) {
550 _ViewEdges.insert(dve, idve);
553 _ViewEdges.push_back(idve);
561 if (!_ViewEdges.empty()) {
562 edges_container::iterator dve = _ViewEdges.begin(), dveend = _ViewEdges.end();
563 for (; (dve != dveend) &&
ViewEdgeComp(*dve, idve); ++dve) {
566 _ViewEdges.insert(dve, idve);
569 _ViewEdges.push_back(idve);
576 return edge_iterator(_ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.begin());
586 return edge_iterator(_ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.end());
596 for (edges_container::iterator it = _ViewEdges.begin(), itend = _ViewEdges.end(); it != itend;
598 if ((it)->first == iEdge) {
599 return edge_iterator(_ViewEdges.begin(), _ViewEdges.end(), it);
602 return edge_iterator(_ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.begin());
607 for (edges_container::const_iterator it = _ViewEdges.begin(), itend = _ViewEdges.end();
610 if ((it)->first == iEdge) {
620 _ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.begin());
626 _ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.end());
631 for (edges_container::iterator it = _ViewEdges.begin(), itend = _ViewEdges.end(); it != itend;
633 if ((it)->first == iEdge) {
635 _ViewEdges.begin(), _ViewEdges.end(), it);
639 _ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.begin());
657 seg =
Vec2r((*it)->orientation2d()[0], (*it)->orientation2d()[1]);
660 }
while ((it != itend) && (it != itlast));
740 this->_FEdgeA->
vertexA(), this->_FEdgeA->vertexA(),
nullptr, _FEdgeA, 0.0f));
773 if (!(_Edges.empty())) {
774 for (vector<ViewEdge *>::iterator
e = _Edges.begin(), eend = _Edges.end();
e != eend;
e++) {
789 for (vector<ViewEdge *>::iterator ve = _Edges.begin(), veend = _Edges.end(); ve != veend; ve++) {
790 if (iViewEdge == (*ve)) {
800 for (vector<ViewVertex *>::iterator vv = _Vertices.begin(), vvend = _Vertices.end(); vv != vvend;
802 if (iViewVertex == (*vv)) {
819 FEdge *currentEdge = _FEdgeA;
822 currentEdge = currentEdge->
nextEdge();
823 }
while (!
ELEM(currentEdge,
NULL, _FEdgeB));
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint y
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble v1
Iterators used to iterate over the various elements of the ViewMap. These iterators can't be exported...
Iterators used to iterate over the various elements of the ViewMap.
Classes to define a View Map (ViewVertex, ViewEdge, etc.)
ATTR_WARN_UNUSED_RESULT const BMVert * v2
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
ViewEdge * viewedge() const
Vec3r orientation2d() const
void setViewEdge(ViewEdge *iViewEdge)
void setPreviousEdge(FEdge *iEdge)
id_type getSecond() const
virtual void Replace(ViewEdge *iOld, ViewEdge *iNew)
void AddIncomingViewEdge(ViewEdge *iVEdge)
virtual ViewVertexInternal::orientedViewEdgeIterator edgesBegin()
virtual edge_iterator edges_iterator(ViewEdge *iEdge)
virtual edge_iterator edges_begin()
void AddOutgoingViewEdge(ViewEdge *iVEdge)
virtual ViewVertexInternal::orientedViewEdgeIterator edgesEnd()
virtual ViewVertexInternal::orientedViewEdgeIterator edgesIterator(ViewEdge *iEdge)
virtual edge_iterator edges_end()
void RemoveEdgeFromChain(FEdge *iEdge)
SVertex * CreateSVertex(const Vec3r &P3D, const Vec3r &P2D, const Id &id)
void AddChain(FEdge *iEdge)
FEdge * SplitEdgeIn2(FEdge *ioEdge, SVertex *ioNewVertex)
void RemoveEdge(FEdge *iEdge)
const vector< FEdge * > & fedges()
ViewVertex * viewvertex()
const Vec3r & point2D() const
void setId(const Id &iId)
void setBackEdgeA(ViewEdge *iBackEdgeA, bool incoming=true)
virtual edge_iterator edges_iterator(ViewEdge *iEdge)
virtual ViewVertexInternal::orientedViewEdgeIterator edgesIterator(ViewEdge *iEdge)
virtual edge_iterator edges_begin()
void setBackEdgeB(ViewEdge *iBackEdgeB, bool incoming=true)
virtual edge_iterator edges_end()
void setFrontEdgeB(ViewEdge *iFrontEdgeB, bool incoming=true)
virtual void Replace(ViewEdge *iOld, ViewEdge *iNew)
void setFrontEdgeA(ViewEdge *iFrontEdgeA, bool incoming=true)
virtual ViewVertexInternal::orientedViewEdgeIterator edgesBegin()
virtual ViewVertexInternal::orientedViewEdgeIterator edgesEnd()
const_vertex_iterator vertices_end() const
virtual Nature::EdgeNature getNature() const
void setFEdgeB(FEdge *iFEdge)
fedge_iterator fedge_iterator_last()
fedge_iterator fedge_iterator_end()
ViewEdgeInternal::edge_iterator_base< Const_traits< ViewEdge * > > const_edge_iterator
void setA(ViewVertex *iA)
edge_iterator ViewEdge_iterator()
view edge iterator
ViewEdgeInternal::fedge_iterator_base< Const_traits< FEdge * > > const_fedge_iterator
void setFEdgeA(FEdge *iFEdge)
const_vertex_iterator vertices_last() const
virtual Interface0DIterator pointsBegin(float t=0.0f)
ViewEdgeInternal::vertex_iterator_base< Nonconst_traits< SVertex * > > vertex_iterator
virtual Interface0DIterator pointsEnd(float t=0.0f)
ViewEdgeInternal::edge_iterator_base< Nonconst_traits< ViewEdge * > > edge_iterator
const_vertex_iterator vertices_begin() const
embedding vertex iterator
fedge_iterator fedge_iterator_begin()
feature edge iterator
virtual Interface0DIterator verticesBegin()
ViewEdgeInternal::vertex_iterator_base< Const_traits< SVertex * > > const_vertex_iterator
virtual Interface0DIterator verticesEnd()
void setNature(Nature::EdgeNature iNature)
ViewEdgeInternal::fedge_iterator_base< Nonconst_traits< FEdge * > > fedge_iterator
void setB(ViewVertex *iB)
ViewShape * viewShape(unsigned id)
const FEdge * getClosestFEdge(real x, real y) const
void AddViewShape(ViewShape *iVShape)
const ViewEdge * getClosestViewEdge(real x, real y) const
void AddSVertex(SVertex *iSVertex)
TVertex * CreateTVertex(const Vec3r &iA3D, const Vec3r &iA2D, FEdge *iFEdgeA, const Vec3r &iB3D, const Vec3r &iB2D, FEdge *iFEdgeB, const Id &id)
void AddFEdge(FEdge *iFEdge)
ViewVertex * InsertViewVertex(SVertex *iVertex, vector< ViewEdge * > &newViewEdges)
void AddViewVertex(ViewVertex *iVVertex)
void AddVertex(ViewVertex *iVertex)
void RemoveVertex(ViewVertex *iViewVertex)
void RemoveEdge(ViewEdge *iViewEdge)
ViewVertexInternal::edge_iterator_base< ViewVertexInternal::edge_const_traits > const_edge_iterator
pair< ViewEdge *, bool > directedViewEdge
ViewVertexInternal::edge_iterator_base< ViewVertexInternal::edge_nonconst_traits > edge_iterator
VecMat::Vec2< real > Vec2r
static bool ViewEdgeComp(ViewVertex::directedViewEdge &dve1, ViewVertex::directedViewEdge &dve2)
T length(const vec_base< T, Size > &a)