7

私は等尺性タイル ゲームを書いています。各タイルの幅は高さの 2 倍です (w:h = 2:1)。マップ内のすべてのタイルは同じサイズで、幅と高さがわかっています (TileWidth と TileHeight)。

列 (>0) と行 (>0) の数に制限はありません。

完全に描画されたマップの幅と高さを計算する式を考え出すのに苦労しています。これは、一番上から一番下まで、そして左端から右端までの距離である必要があります。列と行の数は変化する可能性があるため (したがって、マップは常に完璧な菱形であるとは限りません)、非常に難しいことがわかります!

4

5 に答える 5

5

良い質問!あまり明白ではない答えがありますが、計算は簡単です。

行軸を「r」、列軸を「c」と呼び、r 軸に沿った範囲が 5、c 軸に沿った範囲が 3 である最初の図を考えてみましょう。

図平面に対する r 軸に沿った単位増分は、角度 +30 = (cos 30°, sin 30°) = (sqrt(3)/2, 0.5) であり、c 軸に沿った単位増分は次のとおりです。 -30 = (cos 30°、-sin 30°) = (sqrt(3)/2、-0.5)。

等角長方形の 2 つの対角線を考慮する必要があります。最初の図では、これらの対角線は D1 = [r 軸に沿って +5*U および c 軸に沿って +3*U] および D2 = [r 軸に沿って +5*U および c 軸に沿って -3*U ]、ここで、U は等角平面でのタイルの長さです。これを描画面に変換すると、 D1 = ((5+3)*sqrt(3)/2*U, (5-3)/2*U) = (4*sqrt(3)*U, 1* U) および D2 = ((5-3)*sqrt(3)/2*U, (5+3)/2*U) = (sqrt(3)*U, 4*U)。したがって、画面の幅と高さは 2 つのエクステントの最大値 = 4*sqrt(3)*U、4*U です。

これは一般化できます。Nr 行と Nc 列があり、タイルの長さが U の場合、描画平面の長方形の対角線の範囲は D1 = ((Nr+Nc)*sqrt(3)/2* U、(Nr-Nc)/2*U) および D2 = ((Nr-Nc)*sqrt(3)/2*U、(Nr+Nc)/2*U)、および画面の幅と高さ、したがって、 、 それは:

W = U*(Nr+Nc)*sqrt(3)/2
H = U*(Nr+Nc)/2
于 2011-01-06T14:46:38.777 に答える
2

下から始めて左側を上っていく場合、各列のタイルの高さの半分、次に各行の高さの半分を上に移動します。同様に、左から始めて下端に沿って歩く場合、各列のタイル幅の半分、次に各行の幅の半分を上に移動します。

したがって、マップの軸に沿った境界ボックスの幅は(rows+columns)*TileWidth/2で、高さは(rows+columns)*TileHeight/2

于 2011-01-06T18:14:01.790 に答える
2

等角投影の角度は 60 度と 30 度です。タイルの実際の幅と高さは次のようになります。

Wiso = TileWidth * Cos(30) + TileHeight * Cos(60)
Hiso = TileWidth * Sin(30) + TileHeight * Sin(60)

これで、これらの数値に行と列ごとのタイル数を掛けて、グリッドのサイズを取得できます。

編集:あなたの画像を見ると、投影は等角投影ではないようです(少なくとも私が学校で学んだことではありません)。角度は両側に60度ですCos(60)Cos(30)Sin(60)Sin(30)

それを見る別の方法:

Wgrid = TileWidth * Cos(30) * Ncols + TileHeight * Cos(30) * Nrows
Hgrid = TileWidth * Sin(30) * Ncols + TileHeight * Sin(30) * Nrows

于 2011-01-06T14:23:31.287 に答える
0

ピタゴラスの定理でこれを行うことができると思います:

halfWidth = tileWidth / 2;
halfHeight = tileHeight / 2;
h = Math.sqrt((halfWidth * halfWidth ) * (halfHeight * halfHeight));
rowLength = rowSize * h;
colLength = colSize * h;

私の数学はあまり得意ではありませんがh、タイルの 1 辺の長さである必要があるため、それにタイルの数を掛けることができます。

于 2011-01-06T13:29:31.383 に答える
0

次のように回転方程式を使用しない理由:

タイルが回転していないと仮定すると、四隅の座標は次のようになります。

(0, 0, 0)
(w, 0, 0)
(0, h, 0)
(w, h, 0)

どこ

w = Number of Columns * Tile Width
h = Number of Rows * Tile Height

射影行列があるとします。それを適用すると、4 つの 3D ポイントの 2D スクリーン座標が得られます。必要なことは次のとおりです。

  1. すべてのポイントの最小 x 座標を取得します (投影後)。
  2. すべてのポイントの最大 x 座標を取得します (投影後)。
  3. すべてのポイントの最小 y 座標を取得します (投影後)。
  4. すべてのポイントの最大 y 座標を取得します (投影後)。

2 から 1 を引くと幅が得られ、4 から 3 を引くと高さが得られます。

それは役に立ちますか?

于 2011-01-06T13:06:33.490 に答える