Как я могу указать вершины всех граней ячейки Вороного, согласно voro++?
Мой вопрос заключается в следующем: как я могу изменить код так, чтобы каждая строка показывала вершины грани, соответствующие этому идентификатору?
Я так благодарен за любую помощь и подсказку.
Что я уже пробовал:
согласно приведенной ниже ссылке:
http://math.lbl.gov/voro++/примеры/полигоны/
(объяснение о приведенной выше ссылке)
1 - на линии 41 имеется петля над всеми частицами,
2 - петля, идущая от линии 51 до 71, исследует все грани ячейки,
3 - для исследования всех граней, не рассматривая их дважды, параметр "если" в строке 59 делает это. например, для моего куба, который определен ниже, для первой частицы в выводе есть 6 строк, как мы можем видеть в приведенном ниже выводе.
Я определил куб с вершинами:
1 0 0 0 <br /> 2 0 2 0 <br /> 3 2 0 0 <br /> 4 2 2 0 <br /> 5 0 0 2 <br /> 6 0 2 2 <br /> 7 2 0 2 <br /> 8 2 2 2
затем пишем этот код:
#include <vector> using namespace std; #include "voro++.hh" using namespace voro; #include <fstream> #include <iostream> int main() { const double x_min=0,x_max=4.0000001; const double y_min=0,y_max=4.0000001; const double z_min=0,z_max=4.0000001; int nx,ny,nz; pre_container pcon(x_min,x_max,y_min,y_max,z_min,z_max,true,true,true); pcon.import("cube"); pcon.guess_optimal(nx,ny,nz); container con(x_min,x_max,y_min,y_max,z_min,z_max,nx,ny,nz,true,true,true,8); pcon.setup(con); unsigned int i,j; int id; double x,y,z; voronoicell_neighbor c; vector<int> neigh,f_vert; vector<double> v; FILE *fp5=safe_fopen("1.txt","w"); c_loop_all cl(con); if(cl.start()) do if(con.compute_cell(c,cl)) { cl.pos(x,y,z);id=cl.pid(); c.neighbors(neigh); c.face_vertices(f_vert); c.vertices(x,y,z,v); for(i=0,j=0;i<neigh.size();i++) { if(neigh.at(i)>id) { switch(f_vert.at(j)) { case 4:{ fprintf(fp5,"%i, (%g %g %g) (%g %g %g) (%g %g %g) (%g %g %g)\n",id,v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7],v[8],v[9],v[10],v[11]); }break; } } j+=f_vert[j]+1; } } while (cl.inc()); fclose(fp5); }
Я ожидал, что каждая строка вывода будет показывать вершины лица, соответствующие этому идентификатору. но все вершины граней для данного идентификатора были идентичны, вот так:
1, (-1 -1 -1) (1 -1 -1) (-1 1 -1) (1 1 -1) <br /> 1, (-1 -1 -1) (1 -1 -1) (-1 1 -1) (1 1 -1) <br /> 1, (-1 -1 -1) (1 -1 -1) (-1 1 -1) (1 1 -1) <br /> 1, (-1 -1 -1) (1 -1 -1) (-1 1 -1) (1 1 -1) <br /> 1, (-1 -1 -1) (1 -1 -1) (-1 1 -1) (1 1 -1) <br /> 1, (-1 -1 -1) (1 -1 -1) (-1 1 -1) (1 1 -1) <br /> 2, (-1 3 1) (1 3 -1) (-1 3 -1) (1 1 1) <br /> 2, (-1 3 1) (1 3 -1) (-1 3 -1) (1 1 1) <br /> 2, (-1 3 1) (1 3 -1) (-1 3 -1) (1 1 1) <br /> 2, (-1 3 1) (1 3 -1) (-1 3 -1) (1 1 1) <br /> 3, (1 1 -1) (1 -1 1) (1 -1 -1) (3 -1 -1) <br /> 3, (1 1 -1) (1 -1 1) (1 -1 -1) (3 -1 -1) <br /> 3, (1 1 -1) (1 -1 1) (1 -1 -1) (3 -1 -1) <br /> 3, (1 1 -1) (1 -1 1) (1 -1 -1) (3 -1 -1) <br /> 4, (1 3 1) (3 3 -1) (3 1 -1) (3 1 1) <br /> 4, (1 3 1) (3 3 -1) (3 1 -1) (3 1 1) <br /> 5, (-1 -1 3) (1 -1 3) (-1 -1 1) (1 1 3) <br /> 5, (-1 -1 3) (1 -1 3) (-1 -1 1) (1 1 3) <br /> 5, (-1 -1 3) (1 -1 3) (-1 -1 1) (1 1 3) <br /> 5, (-1 -1 3) (1 -1 3) (-1 -1 1) (1 1 3) <br /> 6, (1 1 3) (1 1 1) (-1 3 1) (1 3 1) <br /> 6, (1 1 3) (1 1 1) (-1 3 1) (1 3 1) <br /> 7, (1 1 3) (3 1 3) (1 -1 3) (3 -1 3) <br /> 7, (1 1 3) (3 1 3) (1 -1 3) (3 -1 3)
когда я заменил его
fprintf(fp5,"%i, (%g %g %g) (%g %g %g) (%g %g %g) (%g %g %g)\n",id,v[0],v[1],v[2],v[3],v[4],v[5],v[6], v[7],v[8],v[9],v[10],v[11]);
с
fprintf(fp5,"%i %i, (%g %g %g) (%g %g %g) (%g %g %g) (%g %g %g) (%g %g %g) (%g %g %g) (%g %g %g) (%g %g %g)\n",id,v.size(),v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7],v[8], v[9],v[10],v[11],v[12],v[13],v[14],v[15],v[16],v[17],v[18],v[19],v[20],v[21],v[22],v[23]);
Я обнаружил, что каждая строка показывает целые вершины ячейки с заданным идентификатором, в то время как это не должно быть так. я имею в виду, что это должно быть что-то вроде этого:
1, (1 -1 -1) (1 1 -1) (1 -1 1) (1 1 1)
это вершины грани между частицами 1 и 2
Rick York
Спасибо за ссылку. Там есть кое-что очень интересное.
Rick York
Вы смотрели на пример кода - polygons.cc в примерах/интерфейсе ?
lee.lion
так что большое спасибо за ваше внимание,
Я написал свой код в соответствии с этим образцом, упомянутым вами."Stefan_Lang", решение 2 ниже, говорит, что значения "v" не меняются. в то время как согласно образцу кода, я думаю, что в цикле "For", В середине моего кода, программа должна рассматривать грани данной ячейки по порядку. исходя из этого, я ожидаю, что "fprintf" показывает вершины грани, а увеличивая "i", демонстрирует вершины других граней данной ячейки.
Rick York
Я добавил Решение ниже, чтобы вы могли его рассмотреть.
Stefan_Lang
Решения 2 и 3 являются правильными. Ваш код всегда обращается к v через одни и те же значения индекса, тогда как, как указал Рик, пример кода использует переменную " l " для смещения этих значений индекса. Поэтому пример кода считывает разные значения с каждой итерацией цикла, а ваш-нет.
На боковой ноте. использование однобуквенных переменных почти всегда плохая идея, и, в частности, использование " l "вдвойне плохо: при первом чтении я принял его за" 1 " (то есть числовое значение один). Делайте свои собственные выводы... ;-)
lee.lion
примерно через месяц моя первая проблема была решена с помощью щедрых людей.
-Рик Йорк, ты был совершенно прав. Я никогда не обращал внимания на вторую часть примера кода, хотя она играет решающую роль в решении этой проблемы. Я думал, что последняя часть просто относится к POV-Ray, но потом проигнорировал это. вы заставили меня осознать свою ошибку.
спасибо вам, дорогие "Рик-Йорке" СПАСИБО, дорогой "Stefan_Lang"
за все ваше внимание
Какой великолепный сайт, какие открытые члены клуба