28 #include "../geometry/GeomUtils.h"
40 ViewMap *ViewMap::_pInstance =
nullptr;
45 for (vector<ViewVertex *>::iterator vv = _VVertices.begin(), vvend = _VVertices.end();
52 for (vector<ViewShape *>::iterator vs = _VShapes.begin(), vsend = _VShapes.end(); vs != vsend;
65 vector<FEdge *> tmpEdges;
67 for (vector<ViewShape *>::iterator vs = _VShapes.begin(), vsend = _VShapes.end(); vs != vsend;
69 vector<FEdge *> &edges = (*vs)->sshape()->getEdgeList();
70 for (vector<FEdge *>::iterator it = edges.begin(), itend = edges.end(); it != itend; it++) {
71 if ((*it)->isTemporary()) {
72 (*it)->setTemporary(
false);
73 tmpEdges.push_back(*it);
78 for (vector<FEdge *>::iterator it = tmpEdges.begin(), itend = tmpEdges.end(); it != itend;
80 for (vector<ViewShape *>::iterator vs = _VShapes.begin(), vsend = _VShapes.end(); vs != vsend;
82 (*vs)->sshape()->RemoveEdge(*it);
84 (*it)->vertexA()->RemoveFEdge(*it);
85 (*it)->vertexB()->RemoveFEdge(*it);
92 int index = _shapeIdToIndex[
id];
93 return _VShapes[index];
98 _shapeIdToIndex[iVShape->
getId().
getFirst()] = _VShapes.size();
99 _VShapes.push_back(iVShape);
105 real minDist = DBL_MAX;
106 FEdge *winner =
nullptr;
107 for (fedges_container::const_iterator fe = _FEdges.begin(), feend = _FEdges.end(); fe != feend;
109 Vec2d A((*fe)->vertexA()->point2D()[0], (*fe)->vertexA()->point2D()[1]);
110 Vec2d B((*fe)->vertexB()->point2D()[0], (*fe)->vertexB()->point2D()[1]);
111 real dist = GeomUtils::distPointSegment<Vec2r>(
Vec2r(
x,
y),
A,
B);
112 if (dist < minDist) {
124 real minDist = DBL_MAX;
125 FEdge *winner =
nullptr;
126 for (fedges_container::const_iterator fe = _FEdges.begin(), feend = _FEdges.end(); fe != feend;
128 Vec2d A((*fe)->vertexA()->point2D()[0], (*fe)->vertexA()->point2D()[1]);
129 Vec2d B((*fe)->vertexB()->point2D()[0], (*fe)->vertexB()->point2D()[1]);
130 real dist = GeomUtils::distPointSegment<Vec2r>(
Vec2r(
x,
y),
A,
B);
131 if (dist < minDist) {
194 const vector<FEdge *> &fedges = iVertex->
fedges();
195 if (fedges.size() != 2) {
196 cerr <<
"ViewMap warning: Can't split the ViewEdge" << endl;
199 FEdge *fend(
nullptr), *fbegin(
nullptr);
200 for (vector<FEdge *>::const_iterator fe = fedges.begin(), feend = fedges.end(); fe != feend;
202 if ((*fe)->vertexB() == iVertex) {
205 if ((*fe)->vertexA() == iVertex) {
208 if ((fbegin !=
nullptr) && (fend !=
nullptr)) {
216 if (ioEdge->
A() ==
nullptr) {
228 fend->setNextEdge(
nullptr);
249 fend->setNextEdge(
nullptr);
258 vvb->
Replace(ioEdge, newVEdge);
267 newViewEdges.push_back(newVEdge);
274 _VVertices.push_back(vva);
280 FEdge *ViewMap::Connect(
FEdge *ioEdge,
SVertex *ioVertex, vector<ViewEdge *> &oNewVEdges)
303 fe1 = dve1.first->fedgeB();
306 fe1 = dve1.first->fedgeA();
310 fe2 = dve2.first->fedgeB();
313 fe2 = dve2.first->fedgeA();
327 return (
v1.x() >
v2.x());
334 return (
v1.x() <
v2.x());
340 cerr <<
"Warning: null pointer passed as argument of TVertex::setFrontEdgeA()" << endl;
344 if (!_sortedEdges.empty()) {
345 edge_pointers_container::iterator dve = _sortedEdges.begin(), dveend = _sortedEdges.end();
346 for (; (dve != dveend) &&
ViewEdgeComp(**dve, _FrontEdgeA); ++dve) {
349 _sortedEdges.insert(dve, &_FrontEdgeA);
352 _sortedEdges.push_back(&_FrontEdgeA);
359 cerr <<
"Warning: null pointer passed as argument of TVertex::setFrontEdgeB()" << endl;
363 if (!_sortedEdges.empty()) {
364 edge_pointers_container::iterator dve = _sortedEdges.begin(), dveend = _sortedEdges.end();
365 for (; (dve != dveend) &&
ViewEdgeComp(**dve, _FrontEdgeB); ++dve) {
368 _sortedEdges.insert(dve, &_FrontEdgeB);
371 _sortedEdges.push_back(&_FrontEdgeB);
378 cerr <<
"Warning: null pointer passed as argument of TVertex::setBackEdgeA()" << endl;
382 if (!_sortedEdges.empty()) {
383 edge_pointers_container::iterator dve = _sortedEdges.begin(), dveend = _sortedEdges.end();
384 for (; (dve != dveend) &&
ViewEdgeComp(**dve, _BackEdgeA); ++dve) {
387 _sortedEdges.insert(dve, &_BackEdgeA);
390 _sortedEdges.push_back(&_BackEdgeA);
397 cerr <<
"Warning: null pointer passed as argument of TVertex::setBackEdgeB()" << endl;
401 if (!_sortedEdges.empty()) {
402 edge_pointers_container::iterator dve = _sortedEdges.begin(), dveend = _sortedEdges.end();
403 for (; (dve != dveend) &&
ViewEdgeComp(**dve, _BackEdgeB); ++dve) {
406 _sortedEdges.insert(dve, &_BackEdgeB);
409 _sortedEdges.push_back(&_BackEdgeB);
417 if ((iOld == _FrontEdgeA.first) && (_FrontEdgeA.first->B() ==
this)) {
418 _FrontEdgeA.first = iNew;
421 if ((iOld == _FrontEdgeB.first) && (_FrontEdgeB.first->B() ==
this)) {
422 _FrontEdgeB.first = iNew;
425 if ((iOld == _BackEdgeA.first) && (_BackEdgeA.first->B() ==
this)) {
426 _BackEdgeA.first = iNew;
429 if ((iOld == _BackEdgeB.first) && (_BackEdgeB.first->B() ==
this)) {
430 _BackEdgeB.first = iNew;
439 return edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.begin());
445 return const_edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.begin());
452 return edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.end());
464 for (edge_pointers_container::iterator it = _sortedEdges.begin(), itend = _sortedEdges.end();
467 if ((*it)->first == iEdge) {
468 return edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), it);
471 return edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.begin());
475 if (_FrontEdgeA.first == iEdge) {
478 else if (_FrontEdgeB.first == iEdge) {
481 else if (_BackEdgeA.first == iEdge) {
484 else if (_BackEdgeB.first == iEdge) {
487 return edge_iterator(_FrontEdgeA, _FrontEdgeB, _BackEdgeA, _BackEdgeB, dEdge);
493 for (edge_pointers_container::const_iterator it = _sortedEdges.begin(),
494 itend = _sortedEdges.end();
497 if ((*it)->first == iEdge) {
501 return const_edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.begin());
505 if (_FrontEdgeA.first == iEdge) {
508 else if (_FrontEdgeB.first == iEdge) {
511 else if (_BackEdgeA.first == iEdge) {
514 else if (_BackEdgeB.first == iEdge) {
524 _sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.begin());
530 _sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.end());
535 for (edge_pointers_container::iterator it = _sortedEdges.begin(), itend = _sortedEdges.end();
538 if ((*it)->first == iEdge) {
540 _sortedEdges.begin(), _sortedEdges.end(), it);
544 _sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.begin());
559 if (!_ViewEdges.empty()) {
560 edges_container::iterator dve = _ViewEdges.begin(), dveend = _ViewEdges.end();
561 for (; (dve != dveend) &&
ViewEdgeComp(*dve, idve); ++dve) {
564 _ViewEdges.insert(dve, idve);
567 _ViewEdges.push_back(idve);
575 if (!_ViewEdges.empty()) {
576 edges_container::iterator dve = _ViewEdges.begin(), dveend = _ViewEdges.end();
577 for (; (dve != dveend) &&
ViewEdgeComp(*dve, idve); ++dve) {
580 _ViewEdges.insert(dve, idve);
583 _ViewEdges.push_back(idve);
590 return edge_iterator(_ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.begin());
600 return edge_iterator(_ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.end());
610 for (edges_container::iterator it = _ViewEdges.begin(), itend = _ViewEdges.end(); it != itend;
612 if ((it)->first == iEdge) {
613 return edge_iterator(_ViewEdges.begin(), _ViewEdges.end(), it);
616 return edge_iterator(_ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.begin());
621 for (edges_container::const_iterator it = _ViewEdges.begin(), itend = _ViewEdges.end();
624 if ((it)->first == iEdge) {
634 _ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.begin());
640 _ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.end());
645 for (edges_container::iterator it = _ViewEdges.begin(), itend = _ViewEdges.end(); it != itend;
647 if ((it)->first == iEdge) {
649 _ViewEdges.begin(), _ViewEdges.end(), it);
653 _ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.begin());
671 seg =
Vec2r((*it)->orientation2d()[0], (*it)->orientation2d()[1]);
674 }
while ((it != itend) && (it != itlast));
754 this->_FEdgeA->
vertexA(), this->_FEdgeA->vertexA(),
nullptr, _FEdgeA, 0.0f));
787 if (!(_Edges.empty())) {
788 for (vector<ViewEdge *>::iterator
e = _Edges.begin(), eend = _Edges.end();
e != eend;
e++) {
803 for (vector<ViewEdge *>::iterator ve = _Edges.begin(), veend = _Edges.end(); ve != veend; ve++) {
804 if (iViewEdge == (*ve)) {
814 for (vector<ViewVertex *>::iterator vv = _Vertices.begin(), vvend = _Vertices.end(); vv != vvend;
816 if (iViewVertex == (*vv)) {
833 FEdge *currentEdge = _FEdgeA;
836 currentEdge = currentEdge->
nextEdge();
837 }
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
SIMD_FORCE_INLINE btScalar length(const btQuaternion &q)
Return the length of a quaternion.
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)