From c1f299cd34c1c887115c60db665ffb33f5b37280 Mon Sep 17 00:00:00 2001
From: Tristan Carrier Baudouin <tristan.carrier@uclouvain.be>
Date: Wed, 13 Feb 2013 11:30:45 +0000
Subject: [PATCH] periodic Voronoi

---
 Mesh/periodical.cpp | 78 ++++++++++++++++++++++++++++++---------------
 1 file changed, 53 insertions(+), 25 deletions(-)

diff --git a/Mesh/periodical.cpp b/Mesh/periodical.cpp
index e0a76b91b5..81ea8b151c 100644
--- a/Mesh/periodical.cpp
+++ b/Mesh/periodical.cpp
@@ -83,11 +83,17 @@ void voroMetal3D::execute(GRegion* gr,double h){
   MElement* element;
   MVertex* vertex;
   std::vector<SPoint3> vertices2;
+  std::vector<double> radii;
   std::set<MVertex*> vertices;
   std::set<MVertex*>::iterator it;
 
+  vertices2.clear();
+  radii.clear();
+  vertices.clear();
+	
   for(i=0;i<gr->getNumMeshElements();i++){
     element = gr->getMeshElement(i);
+	
 	for(j=0;j<element->getNumVertices();j++){
 	  vertex = element->getVertex(j);
 	  vertices.insert(vertex);
@@ -96,28 +102,29 @@ void voroMetal3D::execute(GRegion* gr,double h){
 
   for(it=vertices.begin();it!=vertices.end();it++){
     vertices2.push_back(SPoint3((*it)->x(),(*it)->y(),(*it)->z()));
+	radii.push_back(1.0);
   }
 
-  execute(vertices2,h);
+  execute(vertices2,radii,0,h);
 }
 
-void voroMetal3D::execute(std::vector<double>& vertices,double h){
+void voroMetal3D::execute(std::vector<double>& properties,int radical,double h){
   unsigned int i;
-  SPoint3 point;
-  std::vector<SPoint3> temp;
+  std::vector<SPoint3> vertices;
+  std::vector<double> radii;
   
-  temp.clear();	
+  vertices.clear();
+  radii.clear();
 	
-  for(i=0;i<vertices.size()/3;i++){
-	point = SPoint3(vertices[3*i],vertices[3*i+1],vertices[3*i+2]);
-    temp.push_back(point);
+  for(i=0;i<properties.size()/4;i++){	  
+	vertices.push_back(SPoint3(properties[4*i],properties[4*i+1],properties[4*i+2]));
+	radii.push_back(properties[4*i+3]);
   }
   
-  execute(temp,h);
+  execute(vertices,radii,radical,h);
 }
 
-void voroMetal3D::execute(std::vector<SPoint3>& vertices,double h)
-{
+void voroMetal3D::execute(std::vector<SPoint3>& vertices,std::vector<double>& radii,int radical,double h){
 #if defined(HAVE_VORO3D)
   unsigned int i;
   unsigned int j;
@@ -169,22 +176,43 @@ void voroMetal3D::execute(std::vector<SPoint3>& vertices,double h)
   max_x=max_y=max_z = 1;
   delta = 0;
 
-  container cont(min_x-delta,max_x+delta,min_y-delta,max_y+delta,min_z-delta,max_z+delta,6,6,6,true,true,true,vertices.size());
+  container contA(min_x-delta,max_x+delta,min_y-delta,max_y+delta,min_z-delta,max_z+delta,6,6,6,true,true,true,vertices.size());
+  container_poly contB(min_x-delta,max_x+delta,min_y-delta,max_y+delta,min_z-delta,max_z+delta,6,6,6,true,true,true,vertices.size());
 
   for(i=0;i<vertices.size();i++){
-    cont.put(i,vertices[i].x(),vertices[i].y(),vertices[i].z());
-  }
-
-  c_loop_all loop(cont);
-  loop.start();
-  do{
-    cont.compute_cell(cell,loop);
-	loop.pos(x,y,z);
-	pointer = new voronoicell_neighbor();
-	*pointer = cell;
-	pointers.push_back(pointer);
-	generators.push_back(SPoint3(x,y,z));
-  }while(loop.inc());
+    if(radical==0){
+      contA.put(i,vertices[i].x(),vertices[i].y(),vertices[i].z());
+	}
+	else{
+	  contB.put(i,vertices[i].x(),vertices[i].y(),vertices[i].z(),radii[i]);
+	}
+  }
+
+  c_loop_all loopA(contA);
+  c_loop_all loopB(contB);
+	
+  if(radical==0){
+    loopA.start();
+    do{
+	  contA.compute_cell(cell,loopA);
+	  loopA.pos(x,y,z);
+	  pointer = new voronoicell_neighbor();
+	  *pointer = cell;
+	  pointers.push_back(pointer);
+	  generators.push_back(SPoint3(x,y,z));
+    }while(loopA.inc());
+  }
+  else{
+    loopB.start();
+	do{
+	  contB.compute_cell(cell,loopB);
+	  loopB.pos(x,y,z);
+	  pointer = new voronoicell_neighbor();
+	  *pointer = cell;
+	  pointers.push_back(pointer);
+	  generators.push_back(SPoint3(x,y,z));
+	}while(loopB.inc());
+  }
 
   initialize_counter();
 
-- 
GitLab