From 0a57d4f1de0a28e87860a9753e1a2cc18fd40ca5 Mon Sep 17 00:00:00 2001 From: Amaury Johnan <amjohnen@gmail.com> Date: Thu, 8 Mar 2012 19:12:32 +0000 Subject: [PATCH] draw solution of recombine(depth) --- Mesh/meshGFaceRecombine.cpp | 70 ++++++++++++++++++++++++++++++++++--- Mesh/meshGFaceRecombine.h | 14 +++++++- 2 files changed, 79 insertions(+), 5 deletions(-) diff --git a/Mesh/meshGFaceRecombine.cpp b/Mesh/meshGFaceRecombine.cpp index c3831f4b2e..2fef7100fe 100644 --- a/Mesh/meshGFaceRecombine.cpp +++ b/Mesh/meshGFaceRecombine.cpp @@ -217,7 +217,7 @@ bool Recombine2D::recombine() FlGui::instance()->check(); double time = Cpu(); nextAction->color(0, 0, 200); - CTX::instance()->mesh.changed = (ENT_ALL); + CTX::instance()->mesh.changed = ENT_ALL; drawContext::global()->draw(); #endif @@ -239,7 +239,7 @@ bool Recombine2D::recombine() #ifdef REC2D_DRAW _gf->triangles = _data->_tri; _gf->quadrangles = _data->_quad; - CTX::instance()->mesh.changed = (ENT_ALL); + CTX::instance()->mesh.changed = ENT_ALL; drawContext::global()->draw(); while (Cpu()-time < REC2D_WAIT_TIME) FlGui::instance()->check(); @@ -252,13 +252,14 @@ bool Recombine2D::recombine() #ifdef REC2D_SMOOTH laplaceSmoothing(_gf,100); #endif - CTX::instance()->mesh.changed = (ENT_ALL); + CTX::instance()->mesh.changed = ENT_ALL; drawContext::global()->draw(); return 1; } bool Recombine2D::recombine(int depth) { + Rec2DData::clearChanges(); double bestGlobalQuality; Rec2DNode *root = new Rec2DNode(NULL, NULL, bestGlobalQuality, depth); Rec2DNode *currentNode = root->selectBestNode(); @@ -316,6 +317,14 @@ void Recombine2D::nextTreeActions(std::vector<Rec2DAction*> &actions, rel->getActions(actions); } +void Recombine2D::drawState(double shiftx, double shifty) +{ + _data->drawTriangles(shiftx, shifty); + _data->drawChanges(shiftx, shifty); + CTX::instance()->mesh.changed = ENT_ALL; + drawContext::global()->draw(); +} + double Recombine2D::_geomAngle(MVertex *v, std::vector<GEdge*> &gEdge, std::vector<MElement*> &elem) //* @@ -689,6 +698,15 @@ bool Rec2DData::revertDataChange(Rec2DDataChange *rdc) return true; } +void Rec2DData::clearChanges() +{ + for (int i = (int) _current->_changes.size() - 1; i > -1; --i) { + _current->_changes[i]->revert(); + delete _current->_changes[i]; + } + _current->_changes.clear(); +} + void Rec2DData::removeParity(Rec2DVertex *rv, int p) { std::map<int, std::vector<Rec2DVertex*> >::iterator it; @@ -894,6 +912,25 @@ Rec2DAction* Rec2DData::getBestAction() return *std::max_element(_current->_actions.begin(), _current->_actions.end(), lessRec2DAction()); } +void Rec2DData::drawTriangles(double shiftx, double shifty) +{ + iter_rel it = firstElement(); + for (; it != lastElement(); ++it) { + if ((*it)->isTri()) + (*it)->createElement(shiftx, shifty); + } +} + +void Rec2DData::drawChanges(double shiftx, double shifty) +{ + std::map<int, std::vector<double> > data; + int k = 0; + for (unsigned int i = 0; i < _changes.size(); ++i) { + data[_changes[i]->getAction()->getNum(shiftx, shifty)].push_back(++k); + } + new PView("Changes", "ElementData", Recombine2D::getGFace()->model(), data); +} + void Rec2DData::drawEndNode(int num) { double dx = .0, dy = .0; @@ -1157,7 +1194,8 @@ void Rec2DTwoTri2Quad::apply(std::vector<Rec2DVertex*> &newPar) } void Rec2DTwoTri2Quad::apply(Rec2DDataChange *rdc) -{ +{ + rdc->setAction(this); std::vector<Rec2DAction*> actions; _triangles[0]->getUniqueActions(actions); _triangles[1]->getUniqueActions(actions); @@ -2147,6 +2185,30 @@ Rec2DVertex* Rec2DElement::getOtherVertex(Rec2DVertex *rv1, Rec2DVertex *rv2) co return NULL; } +void Rec2DElement::createElement(double shiftx, double shifty) const +{ + if (_numEdge != 3) { + Msg::Error("[Rec2DElement] Need definition"); + } + static int a = 0; + + std::vector<Rec2DVertex*> v; + getVertices(v); + + MVertex *v0 = new MVertex(v[0]->getMVertex()->x() + shiftx, + v[0]->getMVertex()->y() + shifty, + v[0]->getMVertex()->z() ); + MVertex *v1 = new MVertex(v[1]->getMVertex()->x() + shiftx, + v[1]->getMVertex()->y() + shifty, + v[1]->getMVertex()->z() ); + MVertex *v2 = new MVertex(v[2]->getMVertex()->x() + shiftx, + v[2]->getMVertex()->y() + shifty, + v[2]->getMVertex()->z() ); + + MTriangle *tri = new MTriangle(v0, v1, v2); + Recombine2D::add(tri); +} + MQuadrangle* Rec2DElement::_createQuad() const { if (_numEdge != 4) { diff --git a/Mesh/meshGFaceRecombine.h b/Mesh/meshGFaceRecombine.h index 103e1dadce..46f5eb8102 100644 --- a/Mesh/meshGFaceRecombine.h +++ b/Mesh/meshGFaceRecombine.h @@ -67,12 +67,14 @@ class Recombine2D { std::vector<Rec2DElement*> &neighbours); inline void setStrategy(int s) {_strategy = s;} + void drawState(double shiftx, double shifty); static inline GFace* getGFace() {return _current->_gf;} static inline int getNumChange() {return _current->_numChange;} static inline void incNumChange() {++_current->_numChange;} static inline backgroundMesh* bgm() {return _current->_bgm;} static void add(MQuadrangle *q) {_current->_gf->quadrangles.push_back(q);} + static void add(MTriangle *t) {_current->_gf->triangles.push_back(t);} private : double _geomAngle(MVertex*, @@ -105,6 +107,8 @@ class Rec2DData { ~Rec2DData(); void printState(); + void drawTriangles(double shiftx, double shifty); + void drawChanges(double shiftx, double shifty); #ifdef REC2D_DRAW std::vector<MTriangle*> _tri; std::vector<MQuadrangle*> _quad; @@ -116,6 +120,8 @@ class Rec2DData { static inline int getNumElement() {return _current->_elements.size();} static Rec2DDataChange* getNewDataChange(); static bool revertDataChange(Rec2DDataChange*); + static void clearChanges(); + static int getNumChanges() {return _current->_changes.size();} static double getGlobalQuality(); static double getGlobalQuality(int numEdge, double valEdge, @@ -193,6 +199,8 @@ class Rec2DDataChange { std::vector<Rec2DAction*> _hiddenAction, _newAction; std::vector<std::pair<Rec2DVertex*, SPoint2> > _oldCoordinate; + Rec2DAction *_ra; + public : void hide(Rec2DEdge*); void hide(Rec2DElement*); @@ -201,6 +209,9 @@ class Rec2DDataChange { void append(Rec2DElement*); void revert(); + + void setAction(Rec2DAction *action) {_ra = action;} + Rec2DAction* getAction() {return _ra;} }; class Rec2DAction { @@ -389,7 +400,7 @@ class Rec2DElement { public : Rec2DElement(MTriangle*, Rec2DEdge**, Rec2DVertex **rv = NULL); Rec2DElement(MQuadrangle*, Rec2DEdge**, Rec2DVertex **rv = NULL); - ~Rec2DElement() {hide();} + ~Rec2DElement() { hide();} void hide(); void reveal(); @@ -423,6 +434,7 @@ class Rec2DElement { return NULL; } #endif + void createElement(double shiftx, double shifty) const; double getAngle(Rec2DVertex*); -- GitLab