帮助找到的算法由螺旋上六边形字段创建细胞。

看的图像:

“替代文字”

让我们想象一个无量纲的2D阵列。 X轴是蓝线,Y是水平的,螺旋是红色的。

我需要从中心点x0y0添加细胞通过螺旋

到N点

告诉我解决问题的办法,请。 谢谢!

有帮助吗?

解决方案

我建议改变细胞sligtly编号,使X是一样的,当你去向下和向右(或向上和左)。 然后简单的算法像以下应该工作:

  int x=0, y=0;   
  add(x, y); // add the first cell
  int N=1 
  for( int N=1; <some condition>; ++N ) {
    for(int i=0; i<N; ++i) add(++x, y);  // move right
    for(int i=0; i<N-1; ++i) add(x, ++y); // move down right. Note N-1
    for(int i=0; i<N; ++i) add(--x, ++y); // move down left
    for(int i=0; i<N; ++i) add(--x, y); // move left
    for(int i=0; i<N; ++i) add(x, --y); // move up left
    for(int i=0; i<N; ++i) add(++x, --y); // move up right
  }

此产生点如下:

“产生的点图”

在进行改造后,我们得到:

‘所产生的点转化到六角格’

其他提示

“在这里输入的图像描述” (圆的直径为1)

这里的一个函数来获取位置i

  void getHexPosition( int i, ref double x, ref double y )
  {
     if ( i == 0 ) { x = y = 0; return; }

     int layer = (int) Math.Round( Math.Sqrt( i/3.0 ) );

     int firstIdxInLayer = 3*layer*(layer-1) + 1;
     int side = (i - firstIdxInLayer) / layer; // note: this is integer division
     int idx  = (i - firstIdxInLayer) % layer;                  
     x =  layer * Math.Cos( (side - 1) * Math.PI/3 ) + (idx + 1) * Math.Cos( (side + 1) * Math.PI/3 );
     y = -layer * Math.Sin( (side - 1) * Math.PI/3 ) - (idx + 1) * Math.Sin( (side + 1) * Math.PI/3 );
  }

Math.Sqrt(.75)缩放结果给出

“在这里输入的图像描述”

如果你在修罗的回答为有志于在倾斜坐标如下:

  int[] h = { 1, 1, 0, -1, -1, 0, 1, 1, 0 };
  void getHexSkewedPosition( int i, ref int hx, ref int hy )
  {
     if ( i == 0 ) { hx = hy = 0; return; }

     int layer = (int) Math.Round( Math.Sqrt( i/3.0 ) );

     int firstIdxInLayer = 3*layer*(layer-1) + 1;
     int side = (i - firstIdxInLayer) / layer;
     int idx  = (i - firstIdxInLayer) % layer;

     hx = layer*h[side+0] + (idx+1) * h[side+2];
     hy = layer*h[side+1] + (idx+1) * h[side+3];
  }

  void getHexPosition( int i, ref double hx, ref double hy )
  {
     int x = 0, y = 0;
     getHexSkewedPosition( i, ref x, ref y );
     hx = x - y * .5;
     hy = y * Math.Sqrt( .75 );
  }

假设你曾与正方形的,而不是六边形组成的正常电网,使用网格中创建的螺旋,然后通过移动的发言权绘制它,每个奇数y以向左m个像素,那将给你的效果。

可以通过使用适当的得分函数来选择最佳的六个还未选择的相邻不吉利的东西的所选择的前一轮的六角挑吉利的东西一次一个。我认为一个得分函数作品是选择最接近(0,0),(军队一次选择在一个“壳”不吉利的东西),通过选择最接近于(1,0)(力量打破关系一致的螺旋方向在新的外壳)。在hex网格距离可以使用下列函数来计算:

double grid_distance(int dx, int dy) {
  double real_dx = dx + y/2.0;
  double real_dy = dy * sqrt(3)/2.0;
  return sqrt(real_dx * real_dx + real_dy * real_dy);
}

您可以通过模拟的方向做。如果你的方向是“0分”起来,然后加1,当您去顺时针,下面应该做的:

Pick a centre cell.
Pick the second cell (ideally in direction 0).
Set direction to 2.

While you have more cells to mark:
  if the cell in (direction+1)%6 is free:
    set direction = (direction+1)%6
  mark current cell as used
  go to cell in direction

我爱@接近问题的协商会议的方式,但无法获取确切的算法来工作。此外,我使用的2×1六边形间距(其中x细胞相隔2,和所有其他X项被隐藏)。

下面是我得到的(在JavaScript虽然)工作:

    //Hexagon spiral algorithm, modified from 
    for(var n=1; n<=rings; ++n) {
        x+=2; add(x, y);
        for(var i=0; i<n-1; ++i) add(++x,++y); // move down right. Note N-1
        for(var i=0; i<n; ++i) add(--x,++y); // move down left
        for(var i=0; i<n; ++i) { x-=2; add(x, y); } // move left
        for(var i=0; i<n; ++i) add(--x,--y); // move up left
        for(var i=0; i<n; ++i) add(++x, --y); // move up right
        for(var i=0; i<n; ++i) { x+=2; add(x, y); }  // move right
    }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top