lee.lion Ответов: 3

Как я могу указать вершины всех граней ячейки Вороного, согласно 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"
за все ваше внимание

Какой великолепный сайт, какие открытые члены клуба

3 Ответов

Рейтинг:
28

Stefan_Lang

Похоже, что во внутреннем цикле for вектор v никогда не изменяется. Это объясняет, почему вы продолжаете получать несколько одинаковых выходов. Я понятия не имею, чего вы хотите достичь или что делает эта библиотека, но что бы вы ни хотели напечатать, вы должны убедиться, что действительно загружаете или обрабатываете эти значения.


Рейтинг:
12

Rick York

Как я уже упоминал выше, похоже, вы использовали код из Examples/Interface/Polygons.cc в пакете Voro++. В них есть две большие разницы. Это связано с тем, как вы получаете доступ к данным. Вот выдержка из примера кода :

void draw_polygon( FILE *fp, vector<int> &f_vert, vector<double> &v, int j )
{
    static char s[6][128];
    int k, l, n = f_vert[j];

    // Create POV-Ray vector strings for each of the vertices

    for( k = 0; k < n; k++ )
    {
        l = 3 * f_vert[ j + k + 1 ];  // <--- IMPORTANT !!!

        sprintf( s[k],"<%g,%g,%g>",v[l], v[l+1], v[l+2] );
    }
    // ...
}

int main()
{
    // ...
    if( neigh[i] > id )
    {
        switch( f_vert[j] )
        {
        case 4: draw_polygon( fp4, f_vert, v, j ); break;
        // other cases here
        }
    }
а вот и ваш код :
if(neigh[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;
    }
}
Я надеюсь, вы видите, что способ доступа к вектору значительно отличается. Вы используете индексы, начинающиеся с нуля. В этом примере используются индексы, основанные на переменной l, которая вычисляется как 3*fvert[j+k+1]. Это дает различный набор индексов для каждой вершины, и именно поэтому ваши результаты странные. Я добавил комментарий, чтобы подчеркнуть этот момент и где он происходит.


lee.lion

примерно через месяц моя первая проблема была решена с помощью щедрых людей.

-Рик Йорк, ты был совершенно прав. Я никогда не обращал внимания на вторую часть примера кода, хотя она играет решающую роль в решении этой проблемы. Я думал, что последняя часть просто относится к POV-Ray, но потом проигнорировал это. вы заставили меня осознать свою ошибку.

спасибо вам, дорогие "Рик-Йорке" СПАСИБО, дорогой "Stefan_Lang"
за все ваше внимание

Какой великолепный сайт, какие открытые члены клуба

Rick York

POV-Ray-это очень круто, если вам нравится компьютерная графика и трассировка лучей. Я довольно часто занимаюсь и тем, и другим. Я написал ридер для загрузки файлов POV-Ray в мое приложение OpenGL, которое может отображать их в режиме реального времени. Я никогда не видел этот сайт voro++, и мне нравится графика, поэтому теперь я импортирую файлы, сгенерированные примерами программ там. Они довольно крутые. Еще раз спасибо за ссылку. :)

Рейтинг:
0

OriginalGriff

Это не вопрос разработки программного обеспечения: или если это так, мы здесь не для того, чтобы делать все это для вас - мы более чем готовы помочь людям, но мы ожидаем, что сделаем эту работу, и мы поможем, когда вы застряли.

Просто разместив свою задачу и сказав: "Я пытался в течение месяца", вы не покажете нам, где вы застряли. Это все равно что сказать: "сделай это для меня", - и не беспокоиться.

Так что если вы пробовали в течение месяца, у вас будет код, чтобы показать нам. Покажите нам это, объясните, где вы застряли, что вы пытались сделать, чтобы продолжить, и какая помощь вам нужна.