十六进制网格的计算

Gle*_*rse 1 delphi hexagonal-tiles delphi-xe2

我想做的是创建一个如下所示的十六进制网格.

六角网格

我可以绘制十六进制但不确定如何让他们错开.因此第一行应该是图像中的(0,0)(0,1)(0,2)(0,3),第二行应该是(1,0)(1,1)(1,2)( 1,3)等行中的偶数十六进制总是错开.

目前我知道要使用的行/列数 hexRows hexColumns

以及我如何绘制十六进制是这样的,i只是在绘制十六进制数时. DrawSolidHex(x,y,i);

当前代码看起来像这样

 begin
 hexcolumns := c;
 hexrows := r;
 i:=1;             //first cube
 x := 1;           //default x,y,z values
 y := 1;
 z := 0;
   while hexrows>0 do
    begin
      columnssave := hexcolumns ;
      while hexcolumns >0 do
        begin
          DrawSoildHex(X,Y,i);
          i:=i+1;
          x := x + 1; 
          hexcolumns := hexcolumns -1;
        end;
      y:=y+1;
      x:= 1;
      z:=0;
      hexcolumns := columnssave;
      hexrows:= hexrows-1;
    end;
    totalhex := i;
Run Code Online (Sandbox Code Playgroud)

目前使用此代码,它只会在直线上绘制十六进制x,y,(1,1)(2,1)(3,1)...等我不确定如何添加偏移,计算它们和代码所以它会错开行.

pax*_*blo 7

在如下六边形中,您需要了解构成边的三角形:

    B                   B
    *--*                *
   /|   \              /|
  / |    \            / |
A*--*C    *  ==>   c /  | a
  \      /          /   |
   \    /          /    |
    *--*         A*-----*C
                     b
Run Code Online (Sandbox Code Playgroud)

这些三角形被称为30-60-90三角形,因为这是角度弥补内眼角:C = 90,A = 60,B = 30.

这些三角形的边的比率是c = 2,b = 1a = sqrt(3).

因此,假设您知道c(它是六边形之一的长度),您可以计算该三角形的另外两边而不必求助于三角函数:

a = c * sqrt(3) / 2
b = c / 2
Run Code Online (Sandbox Code Playgroud)

一旦我们知道这些值,六角形偏移相对容易计算,只需通过观察网格并使用A每个六边形的最左角(在上图中)作为起点和终点.

从水平距离(0,0)(0,1)b + c + b - b(航向东北,华东,东南和西南).这是一行中所有"相邻"单元格之间的水平差异,它简化为b + c或者3 * c / 2如果您只是想使用它c.

从垂直距离(0,0),以(0,1)(半行)仅仅是a(东南则无关紧要东).这相当于sqrt(3) * c / 2或者可能足够接近c * 433 / 500(16,000中的一个部分的误差),因为不必涉及平方根.

虽然,如果你更喜欢更准确,你可以坚持使用平方根计算 - 只需记住sqrt(3) / 2在开始时计算一次,然后将其用作乘数.

行之间的垂直距离明显一倍,譬如说(0,0)(1,0).

因此,对于每一行,您只需向下移动c * 433 / 250单位.对于每一列,您可以跨c * 3 / 2单位和垂直c * 433 / 500单位移动(如果您从偶数索引移动到奇数索引,则向下移动,否则向上移动).

  • @Glen,那些计算可能会更容易但是它不是六角形,并且可能不会那么好:-) (2认同)