我正在尝试生成一个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开始到参数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
        }
    }

}

模式说明:

如您的Wikipedia链接中所示http://en.wikipedia.org/wiki/Centered_hexagonal_numbernth居中的六边形数字由以下公式给出

  • 因此,对于n = 1,六边形中的点数为1。
  • ,对于n = 2,六边形中的点数为7。
  • ,对于n = 3,六边形中的点数为19
  • ...
  • 关于c++ - 生成二维魔术六边形晶格的算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14280831/

    10-13 00:04