如何使用 Voro++ 库获取容器中所有单元格的顶点?
How can I get the vertices of all cells in a container with Voro++ Library?
我尝试用 Voro++ 实现一个简单的 3d voronoi 应用程序。我有一个装有颗粒的容器。将所有粒子放入容器后,如何获取Voro++计算出的所有voronoicells的顶点。
从文档来看应该是这样的:
http://math.lbl.gov/voro++/examples/polygons/
文档说:
在第 47 行,调用了 face_vertices 例程,其中 returns 有关哪些顶点构成每个面的信息。它是一个具有特定格式的整数向量:第一个条目是一个数字 k,对应于构成一个面的顶点数,接下来的 k 个附加条目描述了哪些顶点构成了这个面。例如,序列 (3, 16, 20, 13) 对应于将顶点 16、20 和 13 连接在一起的三角形面。在第 48 行,返回顶点位置:这对应于描述每个顶点位置的三元组向量 (x, y, z)。
我修改了示例脚本,以便它在向量中存储每个粒子单元连接和顶点位置。但请验证这一点!
希望这对您有所帮助!
#include "voro++.hh"
#include "container.hh"
#include <v_compute.hh>
#include <c_loops.hh>
#include <vector>
#include <iostream>
using namespace voro;
int main() {
// Set up constants for the container geometry
const double x_min=-5,x_max=5;
const double y_min=-5,y_max=5;
const double z_min=0,z_max=10;
unsigned int i,j;
int id,nx,ny,nz;
double x,y,z;
std::vector<int> neigh;
voronoicell_neighbor c;
// Set up the number of blocks that the container is divided into
const int n_x=6,n_y=6,n_z=6;
// Create a container with the geometry given above, and make it
// non-periodic in each of the three coordinates. Allocate space for
// eight particles within each computational block
container con(x_min,x_max,y_min,y_max,z_min,z_max,n_x,n_y,n_z,
false,false,false,8);
//Randomly add particles into the container
con.import("pack_six_cube");
// Save the Voronoi network of all the particles to text files
// in gnuplot and POV-Ray formats
con.draw_cells_gnuplot("pack_ten_cube.gnu");
con.draw_cells_pov("pack_ten_cube_v.pov");
// Output the particles in POV-Ray format
con.draw_particles_pov("pack_ten_cube_p.pov");
// Loop over all particles in the container and compute each Voronoi
// cell
c_loop_all cl(con);
int dimension = 0;
if(cl.start()) do if(con.compute_cell(c,cl)) {
dimension+=1;
} while (cl.inc());
std::vector<std::vector<int> > face_connections(dimension);
std::vector<std::vector<double> > vertex_positions(dimension);
int counter = 0;
if(cl.start()) do if(con.compute_cell(c,cl)) {
cl.pos(x,y,z);id=cl.pid();
std::vector<int> f_vert;
std::vector<double> v;
// Gather information about the computed Voronoi cell
c.neighbors(neigh);
c.face_vertices(f_vert);
c.vertices(x,y,z,v);
face_connections[counter] = f_vert;
vertex_positions[counter] = v;
std::cout << f_vert.size() << std::endl;
std::cout << v.size() << std::endl;
counter += 1;
} while (cl.inc());
}
此致,卢卡斯
我尝试用 Voro++ 实现一个简单的 3d voronoi 应用程序。我有一个装有颗粒的容器。将所有粒子放入容器后,如何获取Voro++计算出的所有voronoicells的顶点。
从文档来看应该是这样的: http://math.lbl.gov/voro++/examples/polygons/
文档说: 在第 47 行,调用了 face_vertices 例程,其中 returns 有关哪些顶点构成每个面的信息。它是一个具有特定格式的整数向量:第一个条目是一个数字 k,对应于构成一个面的顶点数,接下来的 k 个附加条目描述了哪些顶点构成了这个面。例如,序列 (3, 16, 20, 13) 对应于将顶点 16、20 和 13 连接在一起的三角形面。在第 48 行,返回顶点位置:这对应于描述每个顶点位置的三元组向量 (x, y, z)。
我修改了示例脚本,以便它在向量中存储每个粒子单元连接和顶点位置。但请验证这一点! 希望这对您有所帮助!
#include "voro++.hh"
#include "container.hh"
#include <v_compute.hh>
#include <c_loops.hh>
#include <vector>
#include <iostream>
using namespace voro;
int main() {
// Set up constants for the container geometry
const double x_min=-5,x_max=5;
const double y_min=-5,y_max=5;
const double z_min=0,z_max=10;
unsigned int i,j;
int id,nx,ny,nz;
double x,y,z;
std::vector<int> neigh;
voronoicell_neighbor c;
// Set up the number of blocks that the container is divided into
const int n_x=6,n_y=6,n_z=6;
// Create a container with the geometry given above, and make it
// non-periodic in each of the three coordinates. Allocate space for
// eight particles within each computational block
container con(x_min,x_max,y_min,y_max,z_min,z_max,n_x,n_y,n_z,
false,false,false,8);
//Randomly add particles into the container
con.import("pack_six_cube");
// Save the Voronoi network of all the particles to text files
// in gnuplot and POV-Ray formats
con.draw_cells_gnuplot("pack_ten_cube.gnu");
con.draw_cells_pov("pack_ten_cube_v.pov");
// Output the particles in POV-Ray format
con.draw_particles_pov("pack_ten_cube_p.pov");
// Loop over all particles in the container and compute each Voronoi
// cell
c_loop_all cl(con);
int dimension = 0;
if(cl.start()) do if(con.compute_cell(c,cl)) {
dimension+=1;
} while (cl.inc());
std::vector<std::vector<int> > face_connections(dimension);
std::vector<std::vector<double> > vertex_positions(dimension);
int counter = 0;
if(cl.start()) do if(con.compute_cell(c,cl)) {
cl.pos(x,y,z);id=cl.pid();
std::vector<int> f_vert;
std::vector<double> v;
// Gather information about the computed Voronoi cell
c.neighbors(neigh);
c.face_vertices(f_vert);
c.vertices(x,y,z,v);
face_connections[counter] = f_vert;
vertex_positions[counter] = v;
std::cout << f_vert.size() << std::endl;
std::cout << v.size() << std::endl;
counter += 1;
} while (cl.inc());
}
此致,卢卡斯