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)...等我不确定如何添加偏移,计算它们和代码所以它会错开行.
在如下六边形中,您需要了解构成边的三角形:
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 = 1和a = 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单位移动(如果您从偶数索引移动到奇数索引,则向下移动,否则向上移动).