1

私がやりたいのは、以下のような16進グリッドを作成することです。

16 進グリッド

ヘックスを描くことはできますが、それらをよろめかせる方法がわかりません。したがって、画像の最初の行は (0,0) (0,1) (0,2) (0,3) で、2 行目は (1,0) (1,1) (1,2) ( 1,3) ect 列の偶数ヘクスが常にずらして配置されている場合。

現在、使用する行/列の数を知っています 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;

現在、このコードでは、16 進数の x、y を直線で描画するだけです (1,1) (2,1) (3,1)..ect オフセットを追加し、計算し、コーディングする方法がわかりません行をずらします。

4

2 に答える 2

7

次のような六角形では、エッジを構成する三角形について知る必要があります。

    B                   B
    *--*                *
   /|   \              /|
  / |    \            / |
A*--*C    *  ==>   c /  | a
  \      /          /   |
   \    /          /    |
    *--*         A*-----*C
                     b

これらの三角形は 30-60-90 三角形として知られてC = 90A = 60ますB = 30

これらの三角形の辺の比率はc = 2b = 1およびa = sqrt(3)です。

cしたがって、 (六角形の辺の 1 つの長さ)がわかっていれば、三角関数に頼ることなく、その三角形の他の 2 つの辺を計算できます。

a = c * sqrt(3) / 2
b = c / 2

これらの値がわかれば、六角形のオフセットは、グリッドを目で見てA各六角形の左端 (上の図の) を始点と終点として使用するだけで、比較的簡単に計算できます。

(0,0)からまでの水平距離(0,1)b + c + b - b(北東、東、南東、南西) です。これは、行内のすべての「隣接する」セル間の水平方向の差であり、単純化するとb + c、または3 * c / 2単に使用したい場合はc.

(0,0)から(行の半分)までの垂直距離(0,1)は、単純にa(南東から無関係の東) です。これは、平方根を使用する必要がないという点で、(16,000 分の 1 の誤差) と同等sqrt(3) * c / 2か、おそらくそれに十分近い値です。c * 433 / 500

ただし、より正確に計算したい場合は、平方根の計算に固執することもできますsqrt(3) / 2。最初に 1 回計算して、それを乗数として使用することを忘れないでください。

行間の垂直距離は明らかにその 2 倍です。たとえば、(0,0)toの場合(1,0)です。

したがって、完全な行ごとに、c * 433 / 250ユニットを下に移動するだけです。すべての列について、c * 3 / 2ユニット間および垂直方向のc * 433 / 500ユニットを移動します (偶数インデックスから奇数インデックスに移動する場合は下に移動し、それ以外の場合は上に移動します)。

于 2014-06-25T04:53:56.090 に答える
0

16 進数のセルのサイズがわかっている (必要な) 場合は、簡単な計算でこれを解決できます。

   | | 小さい |
   | | 幅 |
    _______ ______
   /\h
  /\e
 / \ 私
 \ / g
  \ / 時間
| | \_______/ _|____t
| | | |
|--- 幅 ---|
uses
  System.Types,
  Vcl.Graphics;

type
  THexCellSize = record
    Width : Integer;
    Height : Integer;
    SmallWidth : Integer;
  end;

function GetHexDrawPoint( AHexCellSize : THexCellSize; ACol, ARow : Integer ) : TPoint;
begin
  Result.X := ( ( AHexCellSize.Width - AHexCellSize.SmallWidth ) div 2 + AHexCellSize.SmallWidth ) * ACol;
  Result.Y := AHexCellSize.Height * ARow + ( AHexCellSize.Height div 2 ) * ( ACol mod 2 );
end;

procedure DrawHexCell( ACanvas : TCanvas; AOffSet : TPoint; AHexCellSize : THexCellSize; ACol, ARow : Integer );
var
  LPoint : TPoint;
  LXOffset : Integer;
begin
  { *************
    *   1---2
    *  /     \
    * 6       3
    *  \     /
    *   5---4
    ************* }

  LXOffset := ( AHexCellSize.Width - AHexCellSize.SmallWidth ) div 2;

  // Move to point 1
  LPoint := GetHexDrawPoint( AHexCellSize, ACol, ARow );
  LPoint.Offset( AOffSet );
  ACanvas.MoveTo( LPoint.X, LPoint.Y );
  // Line to point 2
  LPoint.Offset( AHexCellSize.SmallWidth, 0 );
  ACanvas.LineTo( LPoint.X, LPoint.Y );
  // Line to point 3
  LPoint.Offset( LXOffset, AHexCellSize.Height div 2 );
  ACanvas.LineTo( LPoint.X, LPoint.Y );
  // Line to point 4
  LPoint.Offset( -LXOffset, AHexCellSize.Height div 2 );
  ACanvas.LineTo( LPoint.X, LPoint.Y );
  // Line to point 5
  LPoint.Offset( -AHexCellSize.SmallWidth, 0 );
  ACanvas.LineTo( LPoint.X, LPoint.Y );
  // Line to point 6
  LPoint.Offset( -LXOffset, -AHexCellSize.Height div 2 );
  ACanvas.LineTo( LPoint.X, LPoint.Y );
  // Line to point 1
  LPoint.Offset( LXOffset, -AHexCellSize.Height div 2 );
  ACanvas.LineTo( LPoint.X, LPoint.Y );
end;

procedure DrawHexCellGrid( ACanvas : TCanvas; AOffSet : TPoint; AHexCellSize : THexCellSize; ACols, ARows : Integer );
var
  LCol, LRow : Integer;
begin
  for LRow := 0 to ARows - 1 do
    for LCol := 0 to ACols - 1 do
      DrawHexCell( ACanvas, AOffSet, AHexCellSize, LCol, LRow );
end;
于 2014-06-26T09:42:17.550 に答える