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;
437 return edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.begin());
443 return const_edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.begin());
450 return edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.end());
462 for (edge_pointers_container::iterator it = _sortedEdges.begin(), itend = _sortedEdges.end();
466 if ((*it)->first == iEdge) {
467 return edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), it);
470 return edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.begin());
474 if (_FrontEdgeA.first == iEdge) {
477 else if (_FrontEdgeB.first == iEdge) {
480 else if (_BackEdgeA.first == iEdge) {
483 else if (_BackEdgeB.first == iEdge) {
486 return edge_iterator(_FrontEdgeA, _FrontEdgeB, _BackEdgeA, _BackEdgeB, dEdge);
492 for (edge_pointers_container::const_iterator it = _sortedEdges.begin(),
493 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();
539 if ((*it)->first == iEdge) {
541 _sortedEdges.begin(), _sortedEdges.end(), it);
545 _sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.begin());
560 if (!_ViewEdges.empty()) {
561 edges_container::iterator dve = _ViewEdges.begin(), dveend = _ViewEdges.end();
562 for (; (dve != dveend) &&
ViewEdgeComp(*dve, idve); ++dve) {
565 _ViewEdges.insert(dve, idve);
568 _ViewEdges.push_back(idve);
576 if (!_ViewEdges.empty()) {
577 edges_container::iterator dve = _ViewEdges.begin(), dveend = _ViewEdges.end();
578 for (; (dve != dveend) &&
ViewEdgeComp(*dve, idve); ++dve) {
581 _ViewEdges.insert(dve, idve);
584 _ViewEdges.push_back(idve);
592 return edge_iterator(_ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.begin());
602 return edge_iterator(_ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.end());
612 for (edges_container::iterator it = _ViewEdges.begin(), itend = _ViewEdges.end(); it != itend;
615 if ((it)->first == iEdge) {
616 return edge_iterator(_ViewEdges.begin(), _ViewEdges.end(), it);
619 return edge_iterator(_ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.begin());
624 for (edges_container::const_iterator it = _ViewEdges.begin(), itend = _ViewEdges.end();
628 if ((it)->first == iEdge) {
638 _ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.begin());
644 _ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.end());
649 for (edges_container::iterator it = _ViewEdges.begin(), itend = _ViewEdges.end(); it != itend;
652 if ((it)->first == iEdge) {
654 _ViewEdges.begin(), _ViewEdges.end(), it);
658 _ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.begin());
676 seg =
Vec2r((*it)->orientation2d()[0], (*it)->orientation2d()[1]);
679 }
while ((it != itend) && (it != itlast));
759 this->_FEdgeA->vertexA(), this->_FEdgeA->vertexA(),
nullptr, _FEdgeA, 0.0f));
766 nullptr, this->_FEdgeA->vertexA(), _FEdgeB,
nullptr,
getLength2D()));
792 if (!_Edges.empty()) {
793 for (vector<ViewEdge *>::iterator
e = _Edges.begin(), eend = _Edges.end();
e != eend;
e++) {
808 for (vector<ViewEdge *>::iterator ve = _Edges.begin(), veend = _Edges.end(); ve != veend; ve++) {
809 if (iViewEdge == (*ve)) {
811 _SShape->RemoveEdge(fedge);
819 for (vector<ViewVertex *>::iterator vv = _Vertices.begin(), vvend = _Vertices.end(); vv != vvend;
822 if (iViewVertex == (*vv)) {
839 FEdge *currentEdge = _FEdgeA;
842 currentEdge = currentEdge->
nextEdge();
843 }
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
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)
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
float length(VecOp< float, D >) RET
real distPointSegment(const T &P, const T &A, const T &B)
VecMat::Vec2< double > Vec2d
VecMat::Vec2< real > Vec2r
VecMat::Vec3< real > Vec3r
static bool ViewEdgeComp(ViewVertex::directedViewEdge &dve1, ViewVertex::directedViewEdge &dve2)