Skip to content
Snippets Groups Projects
Commit f4b403a1 authored by Tristan Carrier Baudouin's avatar Tristan Carrier Baudouin
Browse files

hexahedra

parent 704d10d7
No related branches found
No related tags found
No related merge requests found
...@@ -74,18 +74,18 @@ class Node{ ...@@ -74,18 +74,18 @@ class Node{
class Wrapper{ class Wrapper{
private: private:
bool too_close; bool ok;
Node* spawn; Node* individual;
Node* parent; Node* parent;
public: public:
Wrapper(); Wrapper();
Wrapper(Node*,Node*); Wrapper(Node*,Node*);
~Wrapper(); ~Wrapper();
void set_too_close(bool); void set_ok(bool);
void set_spawn(Node*); void set_individual(Node*);
void set_parent(Node*); void set_parent(Node*);
bool get_too_close(); bool get_ok();
Node* get_spawn(); Node* get_individual();
Node* get_parent(); Node* get_parent();
}; };
...@@ -123,19 +123,19 @@ bool rtree_callback(Node* neighbour,void* w){ ...@@ -123,19 +123,19 @@ bool rtree_callback(Node* neighbour,void* w){
double h; double h;
double distance; double distance;
Metric m; Metric m;
Node *spawn,*parent; Node *individual,*parent;
Wrapper* wrapper; Wrapper* wrapper;
wrapper = static_cast<Wrapper*>(w); wrapper = static_cast<Wrapper*>(w);
spawn = wrapper->get_spawn(); individual = wrapper->get_individual();
parent = wrapper->get_parent(); parent = wrapper->get_parent();
h = spawn->get_size(); h = individual->get_size();
m = spawn->get_metric(); m = individual->get_metric();
if(neighbour!=parent){ if(neighbour!=parent){
distance = infinity_distance(spawn->get_point(),neighbour->get_point(),m); distance = infinity_distance(individual->get_point(),neighbour->get_point(),m);
if(distance<k1*h){ if(distance<k1*h){
wrapper->set_too_close(1); wrapper->set_ok(0);
return false; return false;
} }
} }
...@@ -268,35 +268,35 @@ SPoint3 Node::get_point(){ ...@@ -268,35 +268,35 @@ SPoint3 Node::get_point(){
/*********class Wrapper*********/ /*********class Wrapper*********/
Wrapper::Wrapper(){ Wrapper::Wrapper(){
too_close = 0; ok = 1;
} }
Wrapper::Wrapper(Node* new_spawn,Node* new_parent){ Wrapper::Wrapper(Node* new_individual,Node* new_parent){
too_close = 0; ok = 1;
spawn = new_spawn; individual = new_individual;
parent = new_parent; parent = new_parent;
} }
Wrapper::~Wrapper(){} Wrapper::~Wrapper(){}
void Wrapper::set_too_close(bool new_too_close){ void Wrapper::set_ok(bool new_ok){
too_close = new_too_close; ok = new_ok;
} }
void Wrapper::set_spawn(Node* new_spawn){ void Wrapper::set_individual(Node* new_individual){
spawn = new_spawn; individual = new_individual;
} }
void Wrapper::set_parent(Node* new_parent){ void Wrapper::set_parent(Node* new_parent){
parent = new_parent; parent = new_parent;
} }
bool Wrapper::get_too_close(){ bool Wrapper::get_ok(){
return too_close; return ok;
} }
Node* Wrapper::get_spawn(){ Node* Wrapper::get_individual(){
return spawn; return individual;
} }
Node* Wrapper::get_parent(){ Node* Wrapper::get_parent(){
...@@ -328,20 +328,20 @@ void Filler::treat_region(GRegion* gr){ ...@@ -328,20 +328,20 @@ void Filler::treat_region(GRegion* gr){
unsigned int i; unsigned int i;
int j; int j;
int count; int count;
bool ok; bool ok2;
double x,y,z; double x,y,z;
SPoint3 point; SPoint3 point;
Node *node,*spawn,*parent,*n1,*n2,*n3,*n4,*n5,*n6; Node *node,*individual,*parent;
MVertex* vertex; MVertex* vertex;
MElement* element; MElement* element;
MElementOctree* octree; MElementOctree* octree;
deMeshGRegion deleter; deMeshGRegion deleter;
Wrapper wrapper; Wrapper wrapper;
std::queue<Node*> fifo; std::queue<Node*> fifo;
std::vector<Node*> data; std::vector<Node*> spawns;
std::vector<Node*> garbage; std::vector<Node*> garbage;
std::vector<MVertex*> boundary_vertices; std::vector<MVertex*> boundary_vertices;
std::set<MVertex*> old_vertices; std::set<MVertex*> temp;
std::set<MVertex*>::iterator it; std::set<MVertex*>::iterator it;
RTree<Node*,double,3,double> rtree; RTree<Node*,double,3,double> rtree;
...@@ -349,16 +349,20 @@ void Filler::treat_region(GRegion* gr){ ...@@ -349,16 +349,20 @@ void Filler::treat_region(GRegion* gr){
Size_field::init_region(gr); Size_field::init_region(gr);
Size_field::solve(gr); Size_field::solve(gr);
octree = new MElementOctree(gr->model()); octree = new MElementOctree(gr->model());
garbage.clear();
boundary_vertices.clear();
temp.clear();
new_vertices.clear();
for(i=0;i<gr->getNumMeshElements();i++){ for(i=0;i<gr->getNumMeshElements();i++){
element = gr->getMeshElement(i); element = gr->getMeshElement(i);
for(j=0;j<element->getNumVertices();j++){ for(j=0;j<element->getNumVertices();j++){
vertex = element->getVertex(j); vertex = element->getVertex(j);
old_vertices.insert(vertex); temp.insert(vertex);
} }
} }
for(it=old_vertices.begin();it!=old_vertices.end();it++){ for(it=temp.begin();it!=temp.end();it++){
if((*it)->onWhat()->dim()<3){ if((*it)->onWhat()->dim()<3){
boundary_vertices.push_back(*it); boundary_vertices.push_back(*it);
} }
...@@ -370,7 +374,8 @@ void Filler::treat_region(GRegion* gr){ ...@@ -370,7 +374,8 @@ void Filler::treat_region(GRegion* gr){
x = boundary_vertices[i]->x(); x = boundary_vertices[i]->x();
y = boundary_vertices[i]->y(); y = boundary_vertices[i]->y();
z = boundary_vertices[i]->z(); z = boundary_vertices[i]->z();
node = new Node(SPoint3(x,y,z));
node = new Node(SPoint3(x,y,z));
compute_parameters(node,gr); compute_parameters(node,gr);
rtree.Insert(node->min,node->max,node); rtree.Insert(node->min,node->max,node);
fifo.push(node); fifo.push(node);
...@@ -384,47 +389,42 @@ void Filler::treat_region(GRegion* gr){ ...@@ -384,47 +389,42 @@ void Filler::treat_region(GRegion* gr){
fifo.pop(); fifo.pop();
garbage.push_back(parent); garbage.push_back(parent);
n1 = new Node(); spawns.clear();
n2 = new Node(); spawns.resize(6);
n3 = new Node();
n4 = new Node(); for(i=0;i<6;i++){
n5 = new Node(); spawns[i] = new Node();
n6 = new Node(); }
offsprings(gr,octree,parent,n1,n2,n3,n4,n5,n6);
data.clear(); create_spawns(gr,octree,parent,spawns);
data.push_back(n1);
data.push_back(n2);
data.push_back(n3);
data.push_back(n4);
data.push_back(n5);
data.push_back(n6);
for(i=0;i<6;i++){ for(i=0;i<6;i++){
ok = 0; ok2 = 0;
spawn = data[i]; individual = spawns[i];
point = spawn->get_point(); point = individual->get_point();
x = point.x(); x = point.x();
y = point.y(); y = point.y();
z = point.z(); z = point.z();
if(inside_domain(octree,x,y,z)){ if(inside_domain(octree,x,y,z)){
compute_parameters(spawn,gr); compute_parameters(individual,gr);
if(far_from_boundary(octree,spawn)){ if(far_from_boundary(octree,individual)){
wrapper.set_too_close(0); wrapper.set_ok(1);
wrapper.set_spawn(spawn); wrapper.set_individual(individual);
wrapper.set_parent(parent); wrapper.set_parent(parent);
rtree.Search(spawn->min,spawn->max,rtree_callback,&wrapper); rtree.Search(individual->min,individual->max,rtree_callback,&wrapper);
if(!wrapper.get_too_close()){
fifo.push(spawn); if(wrapper.get_ok()){
rtree.Insert(spawn->min,spawn->max,spawn); fifo.push(individual);
rtree.Insert(individual->min,individual->max,individual);
vertex = new MVertex(x,y,z,gr,0); vertex = new MVertex(x,y,z,gr,0);
new_vertices.push_back(vertex); new_vertices.push_back(vertex);
ok = 1; ok2 = 1;
} }
} }
} }
if(!ok) delete spawn;
if(!ok2) delete individual;
} }
printf("%d\n",count); printf("%d\n",count);
...@@ -438,10 +438,10 @@ void Filler::treat_region(GRegion* gr){ ...@@ -438,10 +438,10 @@ void Filler::treat_region(GRegion* gr){
mesher(gr); //? mesher(gr); //?
MeshDelaunayVolume(regions); MeshDelaunayVolume(regions);
delete octree;
for(i=0;i<garbage.size();i++) delete garbage[i]; for(i=0;i<garbage.size();i++) delete garbage[i];
for(i=0;i<new_vertices.size();i++) delete new_vertices[i]; for(i=0;i<new_vertices.size();i++) delete new_vertices[i];
new_vertices.clear(); new_vertices.clear();
delete octree;
Size_field::clear(); Size_field::clear();
Frame_field::clear(); Frame_field::clear();
#endif #endif
...@@ -477,7 +477,7 @@ double Filler::get_size(double x,double y,double z,GEntity* ge){ ...@@ -477,7 +477,7 @@ double Filler::get_size(double x,double y,double z,GEntity* ge){
Field* field; Field* field;
FieldManager* manager; FieldManager* manager;
h = 0.25; h = 1.0;
manager = ge->model()->getFields(); manager = ge->model()->getFields();
if(manager->getBackgroundField()>0){ if(manager->getBackgroundField()>0){
field = manager->get(manager->getBackgroundField()); field = manager->get(manager->getBackgroundField());
...@@ -542,7 +542,7 @@ void Filler::compute_parameters(Node* node,GEntity* ge){ ...@@ -542,7 +542,7 @@ void Filler::compute_parameters(Node* node,GEntity* ge){
node->max[2] = z + sqrt3*h; node->max[2] = z + sqrt3*h;
} }
void Filler::offsprings(GEntity* ge,MElementOctree* octree,Node* node,Node* n1,Node* n2,Node* n3,Node* n4,Node* n5,Node* n6){ void Filler::create_spawns(GEntity* ge,MElementOctree* octree,Node* node,std::vector<Node*>& spawns){
double x,y,z; double x,y,z;
double x1,y1,z1; double x1,y1,z1;
double x2,y2,z2; double x2,y2,z2;
...@@ -592,37 +592,37 @@ void Filler::offsprings(GEntity* ge,MElementOctree* octree,Node* node,Node* n1,N ...@@ -592,37 +592,37 @@ void Filler::offsprings(GEntity* ge,MElementOctree* octree,Node* node,Node* n1,N
y6 = y - h6*m.get_m23(); y6 = y - h6*m.get_m23();
z6 = z - h6*m.get_m33(); z6 = z - h6*m.get_m33();
*n1 = Node(SPoint3(x1,y1,z1)); *spawns[0] = Node(SPoint3(x1,y1,z1));
*n2 = Node(SPoint3(x2,y2,z2)); *spawns[1] = Node(SPoint3(x2,y2,z2));
*n3 = Node(SPoint3(x3,y3,z3)); *spawns[2] = Node(SPoint3(x3,y3,z3));
*n4 = Node(SPoint3(x4,y4,z4)); *spawns[3] = Node(SPoint3(x4,y4,z4));
*n5 = Node(SPoint3(x5,y5,z5)); *spawns[4] = Node(SPoint3(x5,y5,z5));
*n6 = Node(SPoint3(x6,y6,z6)); *spawns[5] = Node(SPoint3(x6,y6,z6));
} }
double Filler::improvement(GEntity* ge,MElementOctree* octree,SPoint3 point,double h_nearer,SVector3 direction){ double Filler::improvement(GEntity* ge,MElementOctree* octree,SPoint3 point,double h1,SVector3 direction){
double x,y,z; double x,y,z;
double average; double average;
double h_farther; double h2;
double coeffA,coeffB; double coeffA,coeffB;
x = point.x() + h_nearer*direction.x(); x = point.x() + h1*direction.x();
y = point.y() + h_nearer*direction.y(); y = point.y() + h1*direction.y();
z = point.z() + h_nearer*direction.z(); z = point.z() + h1*direction.z();
if(inside_domain(octree,x,y,z)){ if(inside_domain(octree,x,y,z)){
h_farther = get_size(x,y,z); h2 = get_size(x,y,z);
} }
else h_farther = h_nearer; else h2 = h1;
coeffA = 1.0; coeffA = 1.0;
coeffB = 0.16; coeffB = 0.16;
if(h_farther>h_nearer){ if(h2>h1){
average = coeffA*h_nearer + (1.0-coeffA)*h_farther; average = coeffA*h1 + (1.0-coeffA)*h2;
} }
else{ else{
average = coeffB*h_nearer + (1.0-coeffB)*h_farther; average = coeffB*h1 + (1.0-coeffB)*h2;
} }
return average; return average;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment