[過去ログ] Delphiゲームプログラミング相談室 (976レス)
前次1-
抽出解除 レス栞

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
272
(4): 名前は開発中のものです。 [sage] 03/05/17 15:58 ID:LhaqdzNz(2/4) AAS
>>271
271(1): 名前は開発中のものです。 [sage] 03/05/17 15:57 ID:LhaqdzNz(1/4) AAS
>>270
ああ、HEXマップをいじっている時に私もつまづいたなぁ…。
とりあえず、私の使っている方法。

”HEXマップにおける距離”=”ユニット(コマ)が進む数”だから、
  0  1  2  3
 ┌─┬─┬─┬─┬
0│  │  │  │  │
 └┬┴┬┴┬┴┬┴
1  │  │  │  │
 ┌┴┬┴┬┴┬┴┬
2│  │  │  │  │
…のように、レンガ壁状のマップで考えます。
そして、この1コマを4分割。
 □□□□□□□□
 □□□□□□□□
   □□□□□□□□
   □□□□□□□□
 □□□□□□□□
 □□□□□□□□
あとは、直線の距離を出して、2で割ればOK。
の続き
(x0,y0)〜(y1,y0)の距離を出したかったら、

xq0 := (x0 * 2)+(x0 mod 2); yq0 := y0 * 2;
xq1 := (x1 * 2)+(x1 mod 2); yq1 := y1 * 2;
xlen := Abs(x1-x0)+1; ylen := Abs(y1-y0)+1;
hexlen := Sqrt( xlen*xlen + ylen*ylen ) / 2 + 1;

で、算出できるはずです。(メンドいから整数と実数の変換は略)
273: 名前は開発中のものです。 [sage] 03/05/17 16:01 ID:LhaqdzNz(3/4) AAS
>>272
ゴメン、間違えた。
× xlen := Abs(x1-x0)+1; ylen := Abs(y1-y0)+1;
じゃなくて
◎ xlen := Abs(xq1-xq0)+1; ylen := Abs(yq1-yq0)+1;
ね。
274
(1): 272 [sage] 03/05/17 16:16 ID:LhaqdzNz(4/4) AAS
>>272 また訂正。 何やってるんだ俺は……。(恥)
xq0 := (x0 * 2)+(y0 mod 2); yq0 := y0 * 2;
xq1 := (x1 * 2)+(y1 mod 2); yq1 := y1 * 2;
xlen := Abs(xq1-xq0)+1; ylen := Abs(yq1-yq0)+1;
hexlen := Sqrt( xlen*xlen + ylen*ylen ) / 2 + 1;
276: 272 [sage] 03/05/18 02:18 ID:MA7QNrHO(1) AAS
>>275
275(2): 268 [sage] 03/05/18 00:57 ID:RcPQLtqQ(1) AAS
4分割は新鮮でしたが、
(0,0)-(1,3) が 5 になるのですけど。

x0 = 0;
y0 = 0;
x1 = 1;
y1 = 3;
xq0 = 0;
yq0 = 0;
xq1 := (1 * 2) + (3 mod 2) = 3;
yq1 := 3 * 2 = 6;
xlen := Abs(3)+1 = 4;
ylen := Abs(6)+1 = 7;
hexlen := Sqrt(4*4 + 7*7) / 2 + 1 = 5.03;
ホンマや…。 ちょっと昔のソース探してみます。
283: 272 [sage] 03/05/19 00:13 ID:xetwIoTi(1) AAS
>>282
282(2): 名前は開発中のものです。 [sage] 03/05/18 23:17 ID:Vqiijavw(1) AAS
>>280
今度は(1,0)-(0,1)で2になります。

x0=1;
y0=0;
x1=0;
y1=1;
xlen = Abs(0-1) = 1;
ylen = Abs(1-0) = 1;

1 <= (1 div 2) が成立しないので、
hexlen := 1 + 1 - (1 div 2) = 2;

最終的にこれでいけました。
function GetHexLen(const P1, P2: TPoint): Integer;
var
 W, H: Integer;
begin
 W := Abs(P2.X - P1.X);
 H := Abs(P2.Y - P1.Y);
 if H <= W * 2 then
 begin
  if (Odd(P1.Y) and (P1.X >= P2.X)) or
   ((not Odd(P1.Y)) and (P1.X <= P2.X)) then
   Result := H + W - H div 2
  else
   Result := W + H div 2
 end else
  Result := H;
end;
あう。 何度も何度もすいませんでした。
(0,0)からしか検算していなかった私のミスです。
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.035s