gpt4 book ai didi

c++ - 生成二维魔法六边形格子的算法

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:59:57 27 4
gpt4 key购买 nike

我正在尝试生成一个 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 i y 坐标,只看 generate_particles 部分忘记其余部分它类似于你之前给我的那个但是我用我自己的语言和其他变量编写它当我执行这个文件时屏幕上绘制的坐标正是我想要开始初始配置,但是我们在这里做的是将这些坐标写入配置二进制文件,问题是当我读取这个二进制文件时,似乎唯一打印的坐标是从 0 到 n-1 n 是层顺序,有一个我无法解决的问题,可能是我编写代码的方式,因为我有 547 个粒子,但这段代码只给我 13 个坐标,我应该给每个粒子一个标签,即 547 个粒子应该每个都有自己的坐标是不是很清楚??

最佳答案

int i, j;
float y,x;
float d=1.0;// d is the distance between 2 points as indicated in your schema
for(i=0; i<=(n-1); i++) {
y = (sqrt(3)*i*d)/2.0;
for (j = 0; j < (2*n-1-i); j++) {
x = (-(2*n-i-2)*d)/2.0 + j*d;
//plot the point with coordinate (x,y) here
if (y!=0) {
// plot the point with coordinate (x,-y) here
}
}

}

架构说明:

enter image description here

如您的维基百科链接所示 http://en.wikipedia.org/wiki/Centered_hexagonal_number 第 n 中心六角数由公式给出

enter image description here

  • 所以当 n = 1 时,六边形中的点数为 1。
  • 对于 n = 2,六边形中的点数为 7。
  • 对于 n = 3,六边形中的点数为 19
  • ...

关于c++ - 生成二维魔法六边形格子的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14280831/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com