我正在尝试生成一个 2D 魔法六边形格子,(即我需要用 C 语言生成点的坐标)见附图,该图看起来像一个洋葱结构,其中较大的一个内有六边形,依此类推。
有人有想法吗?
注意:如果有人在其他语言中有答案,那没关系,我只需要看看,这样我就可以开始构建自己的代码了。提前致谢。
void generate_particles(void)
{/* Generates the particle - positions and charge
Here it indicated to use the hexagonal referential !!*/
int i,j;
int n=3; /*n represent the nth centered hex number given by the formula 3*n(n- )+1*/
double b;
b=(1.0/sqrt(sqrt(3)))*sqrt(2.0/par.NA);
/* b=1.0;*/
fprintf(stderr,"Distributing %d particles on the hexagonal lattice'...", par.N);
for (i=0;i<n-1;i++)
{
coo[i][0]= (sqrt(3)*i*b)/2.0;
for (j=0;j<(2*n-i-1);j++)
{
coo [i][1]= (-(2*n-i-2)*b)/2.0 + j*b;
fprintf(stderr," %lf %lf\n",coo[i][0],coo[i][1]);
/*plot the points with coordinate (x,y) here*/
if(coo[i][0]!=0)
{
fprintf(stderr," %lf %lf\n",-coo[i][0],coo[i][1]);
/*plot the points with coordinates (-x,y)*/
}
}
}fprintf(stderr," done\n\n");
}
void write_configuration_file(void)
{/* Writes the binary configuration file '<prefix>_config.<postfix>'
i.e velocities and coordinates. */
FILE *fp;
char filename[100];
char postfix_string[100];
int i;
fprintf(stderr,"Writing configuration file");
if (postfix >=0 ) {
if (postfix < 10) sprintf(postfix_string,"000%d",postfix);
else if (postfix < 100) sprintf(postfix_string, "00%d",postfix);
else if (postfix < 1000) sprintf(postfix_string, "0%d",postfix);
else if (postfix <10000) sprintf(postfix_string, "%d",postfix);
else sprintf(postfix_string, "_%d",postfix);
} else {
fprintf(stderr,"\nThe internal postfix is negative.\n\n");
exit(1);
}
sprintf(filename,"%s_config.%s",prefix,postfix_string);
fprintf(stderr," %s...", filename);
if ((fp = fopen(filename,"r")) != NULL) {
fprintf(stderr,"\nFile '%s' already exists. Don't want to overwrite it.\n\n",filename);
fclose(fp);
exit(1);
}
if ((fp = fopen(filename,"w")) == NULL) {
fprintf(stderr,"Could not create file '%s'.\n\n",filename);
exit(1);
}
/* postfix */
if (fwrite(&postfix,sizeof(int),1,fp) != 1)
{ fprintf(stderr,"fwrite error 1.\n\n"); exit(1); }
/* time */
if (fwrite(&ti,sizeof(int),1,fp) != 1)
{ fprintf(stderr,"fwrite error 2.\n\n"); exit(1); }
/* x,y coordinates of all particles/charges */
if (fwrite(coo,sizeof(double) ,2*par.N,fp) != 2*par.N)
{
fprintf(stderr,"fwrite error 4.\n\n"); exit(1); }
fclose(fp);
fprintf(stderr," done\n");
}
and the main program is:
int main()
{
int i;
printf("\n");
printf("\n");
printf("***************************************************************\n");
printf("* OK LETS GENERATE THE CONFIG FILE FOR MONTE CARLO SIMULATION *\n");
printf("***************************************************************\n\n");
read_wishlist();
init_ran1();
for (i=0; i<seed; i++) ran1_fast();
if (par.N > 0) generate_particles();
write_parameter_file();
write_configuration_file();
write_task_file();
/*final_test();*/
fprintf(stderr,"\n\nConfiguration successfully generated.\n\n");
}
好的,让我解释一下我的问题,实际上你之前给我的代码是完美的,我能够在 C 和 matlab 中绘制六边形中的粒子,但这只是在绘图;当我开始模拟时,每个粒子都有一个在我的代码中从 0 到 par.N 开始标记,但我写这个的方式只是读取第 13 层上的 13 个粒子,所以请你帮我找到一个解决方案,如何修改它,以便每个粒子都有一个提前协调谢谢。
@MohamedKALLEL 首先在函数 generate_particles
coo[i][0] 表示 x 坐标, coo iy 坐标,只看 generate_particles 部分,忘记其余部分,它与您之前给我的相似,但是当我执行此文件时,我用自己的语言和其他变量编写了它,屏幕上绘制的坐标正是我的那个想要开始初始配置,但我们所做的是将这些坐标写入配置二进制文件中,问题是当我读取这个二进制文件时,似乎打印的唯一坐标是从 0 到 n-1 n 是层顺序,有一个我无法解决的问题,可能是我编写代码的方式,因为我有 547 个粒子,但这段代码只给了我 13 个坐标我应该给每个粒子一个标签,即 547 个粒子应该每个人都有自己的坐标这么清楚吗??