30ViewMap *ViewMap::_pInstance =
nullptr;
35 for (vector<ViewVertex *>::iterator vv = _VVertices.begin(), vvend = _VVertices.end();
43 for (vector<ViewShape *>::iterator vs = _VShapes.begin(), vsend = _VShapes.end(); vs != vsend;
57 vector<FEdge *> tmpEdges;
59 for (vector<ViewShape *>::iterator vs = _VShapes.begin(), vsend = _VShapes.end(); vs != vsend;
62 vector<FEdge *> &edges = (*vs)->sshape()->getEdgeList();
63 for (vector<FEdge *>::iterator it = edges.begin(), itend = edges.end(); it != itend; it++) {
64 if ((*it)->isTemporary()) {
65 (*it)->setTemporary(
false);
66 tmpEdges.push_back(*it);
71 for (vector<FEdge *>::iterator it = tmpEdges.begin(), itend = tmpEdges.end(); it != itend; it++)
73 for (vector<ViewShape *>::iterator vs = _VShapes.begin(), vsend = _VShapes.end(); vs != vsend;
76 (*vs)->sshape()->RemoveEdge(*it);
78 (*it)->vertexA()->RemoveFEdge(*it);
79 (*it)->vertexB()->RemoveFEdge(*it);
86 int index = _shapeIdToIndex[id];
87 return _VShapes[index];
92 _shapeIdToIndex[iVShape->
getId().
getFirst()] = _VShapes.size();
93 _VShapes.push_back(iVShape);
99 real minDist = DBL_MAX;
100 FEdge *winner =
nullptr;
101 for (fedges_container::const_iterator fe = _FEdges.begin(), feend = _FEdges.end(); fe != feend;
104 Vec2d A((*fe)->vertexA()->point2D()[0], (*fe)->vertexA()->point2D()[1]);
105 Vec2d B((*fe)->vertexB()->point2D()[0], (*fe)->vertexB()->point2D()[1]);
107 if (dist < minDist) {
119 real minDist = DBL_MAX;
120 FEdge *winner =
nullptr;
121 for (fedges_container::const_iterator fe = _FEdges.begin(), feend = _FEdges.end(); fe != feend;
124 Vec2d A((*fe)->vertexA()->point2D()[0], (*fe)->vertexA()->point2D()[1]);
125 Vec2d B((*fe)->vertexB()->point2D()[0], (*fe)->vertexB()->point2D()[1]);
127 if (dist < minDist) {
190 const vector<FEdge *> &fedges = iVertex->
fedges();
191 if (fedges.size() != 2) {
192 cerr <<
"ViewMap warning: Can't split the ViewEdge" << endl;
195 FEdge *fend(
nullptr), *fbegin(
nullptr);
196 for (vector<FEdge *>::const_iterator fe = fedges.begin(), feend = fedges.end(); fe != feend;
199 if ((*fe)->vertexB() == iVertex) {
202 if ((*fe)->vertexA() == iVertex) {
205 if ((fbegin !=
nullptr) && (fend !=
nullptr)) {
213 if (ioEdge->
A() ==
nullptr) {
225 fend->setNextEdge(
nullptr);
246 fend->setNextEdge(
nullptr);
255 vvb->
Replace(ioEdge, newVEdge);
264 newViewEdges.push_back(newVEdge);
271 _VVertices.push_back(vva);
277FEdge *ViewMap::Connect(
FEdge *ioEdge,
SVertex *ioVertex, vector<ViewEdge *> &oNewVEdges)
300 fe1 = dve1.first->fedgeB();
303 fe1 = dve1.first->fedgeA();
307 fe2 = dve2.first->fedgeB();
310 fe2 = dve2.first->fedgeA();
314 Vec2r v1(V1.x(), V1.y());
324 return (v1.
x() >
v2.x());
331 return (v1.
x() <
v2.x());
337 cerr <<
"Warning: null pointer passed as argument of TVertex::setFrontEdgeA()" << endl;
341 if (!_sortedEdges.empty()) {
342 edge_pointers_container::iterator dve = _sortedEdges.begin(), dveend = _sortedEdges.end();
343 for (; (dve != dveend) &&
ViewEdgeComp(**dve, _FrontEdgeA); ++dve) {
346 _sortedEdges.insert(dve, &_FrontEdgeA);
349 _sortedEdges.push_back(&_FrontEdgeA);
356 cerr <<
"Warning: null pointer passed as argument of TVertex::setFrontEdgeB()" << endl;
360 if (!_sortedEdges.empty()) {
361 edge_pointers_container::iterator dve = _sortedEdges.begin(), dveend = _sortedEdges.end();
362 for (; (dve != dveend) &&
ViewEdgeComp(**dve, _FrontEdgeB); ++dve) {
365 _sortedEdges.insert(dve, &_FrontEdgeB);
368 _sortedEdges.push_back(&_FrontEdgeB);
375 cerr <<
"Warning: null pointer passed as argument of TVertex::setBackEdgeA()" << endl;
379 if (!_sortedEdges.empty()) {
380 edge_pointers_container::iterator dve = _sortedEdges.begin(), dveend = _sortedEdges.end();
381 for (; (dve != dveend) &&
ViewEdgeComp(**dve, _BackEdgeA); ++dve) {
384 _sortedEdges.insert(dve, &_BackEdgeA);
387 _sortedEdges.push_back(&_BackEdgeA);
394 cerr <<
"Warning: null pointer passed as argument of TVertex::setBackEdgeB()" << endl;
398 if (!_sortedEdges.empty()) {
399 edge_pointers_container::iterator dve = _sortedEdges.begin(), dveend = _sortedEdges.end();
400 for (; (dve != dveend) &&
ViewEdgeComp(**dve, _BackEdgeB); ++dve) {
403 _sortedEdges.insert(dve, &_BackEdgeB);
406 _sortedEdges.push_back(&_BackEdgeB);
414 if ((iOld == _FrontEdgeA.first) && (_FrontEdgeA.first->B() ==
this)) {
415 _FrontEdgeA.first = iNew;
418 if ((iOld == _FrontEdgeB.first) && (_FrontEdgeB.first->B() ==
this)) {
419 _FrontEdgeB.first = iNew;
422 if ((iOld == _BackEdgeA.first) && (_BackEdgeA.first->B() ==
this)) {
423 _BackEdgeA.first = iNew;
426 if ((iOld == _BackEdgeB.first) && (_BackEdgeB.first->B() ==
this)) {
427 _BackEdgeB.first = iNew;
436 return edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.begin());
442 return const_edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.begin());
449 return edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.end());
461 for (edge_pointers_container::iterator it = _sortedEdges.begin(), itend = _sortedEdges.end();
465 if ((*it)->first == iEdge) {
466 return edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), it);
469 return edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.begin());
473 if (_FrontEdgeA.first == iEdge) {
476 else if (_FrontEdgeB.first == iEdge) {
479 else if (_BackEdgeA.first == iEdge) {
482 else if (_BackEdgeB.first == iEdge) {
485 return edge_iterator(_FrontEdgeA, _FrontEdgeB, _BackEdgeA, _BackEdgeB, dEdge);
491 for (edge_pointers_container::const_iterator it = _sortedEdges.begin(),
492 itend = _sortedEdges.end();
496 if ((*it)->first == iEdge) {
500 return const_edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.begin());
504 if (_FrontEdgeA.first == iEdge) {
507 else if (_FrontEdgeB.first == iEdge) {
510 else if (_BackEdgeA.first == iEdge) {
513 else if (_BackEdgeB.first == iEdge) {
523 _sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.begin());
529 _sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.end());
534 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;
613 if ((it)->first == iEdge) {
614 return edge_iterator(_ViewEdges.begin(), _ViewEdges.end(), it);
617 return edge_iterator(_ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.begin());
622 for (edges_container::const_iterator it = _ViewEdges.begin(), itend = _ViewEdges.end();
626 if ((it)->first == iEdge) {
636 _ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.begin());
642 _ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.end());
647 for (edges_container::iterator it = _ViewEdges.begin(), itend = _ViewEdges.end(); it != itend;
650 if ((it)->first == iEdge) {
652 _ViewEdges.begin(), _ViewEdges.end(), it);
656 _ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.begin());
674 seg =
Vec2r((*it)->orientation2d()[0], (*it)->orientation2d()[1]);
675 length += seg.
norm();
677 }
while ((it != itend) && (it != itlast));
757 this->_FEdgeA->
vertexA(), this->_FEdgeA->vertexA(),
nullptr, _FEdgeA, 0.0f));
790 if (!_Edges.empty()) {
791 for (vector<ViewEdge *>::iterator
e = _Edges.begin(), eend = _Edges.end();
e != eend;
e++) {
806 for (vector<ViewEdge *>::iterator ve = _Edges.begin(), veend = _Edges.end(); ve != veend; ve++) {
807 if (iViewEdge == (*ve)) {
817 for (vector<ViewVertex *>::iterator vv = _Vertices.begin(), vvend = _Vertices.end(); vv != vvend;
820 if (iViewVertex == (*vv)) {
837 FEdge *currentEdge = _FEdgeA;
840 currentEdge = currentEdge->
nextEdge();
841 }
while (!
ELEM(currentEdge,
nullptr, _FEdgeB));
Various tools for geometry.
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
Return the length of the vector.
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)
FEdge * SplitEdgeIn2(FEdge *ioEdge, SVertex *ioNewVertex)
void AddChain(FEdge *iEdge)
SVertex * CreateSVertex(const Vec3r &P3D, const Vec3r &P2D, const Id &id)
void RemoveEdge(FEdge *iEdge)
ViewVertex * viewvertex()
const Vec3r & point2D() const
const vector< FEdge * > & fedges()
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()
Vec< T, N > & normalize()
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)
const FEdge * getClosestFEdge(real x, real y) const
ViewShape * viewShape(uint id)
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
real distPointSegment(const T &P, const T &A, const T &B)
VecMat::Vec2< real > Vec2r
static bool ViewEdgeComp(ViewVertex::directedViewEdge &dve1, ViewVertex::directedViewEdge &dve2)