2011-01-06 14 views
7

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

任意の数の列(> 0)と行(> 0)があります。

完全に描画されたマップの幅と高さを計算するための計算式が必要です。これは、最上部から最下部までの距離であり、極端な左から極右への距離である必要があります。列と行の数が変わる可能性があるので(マップは必ずしも完璧なダイヤモンドではありません)、それは非常に難しいことです!

答えて

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 = [+ 5 * U、r軸に沿って - 3 * U、 ]ここで、Uは等角平面内のタイルの長さです。これは、D1 =((5 + 3)* sqrt(3)/ 2 * U、(5-3)/ 2 * U)=(4 * sqrt(3)* U、1 * 2 * U)=(sqrt(3)* U、4 * U)である。したがって、画面の幅と高さは、2エクステントの最大値= 4 * sqrt(3)* U、4 * Uとなります。

Nr行とNc列があり、タイル長がUの場合、描画面の矩形の対角線の長さは、D1 =((Nr + Nc)* sqrt(3) (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 
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 

Iが仮定投影行列があるので、それを適用した後、4つの3D点の2Dスクリーン座標を取得します。これは次のとおりです。

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

2から1を引いて幅を取得し、3から4を取得して高さを取得します。

これは役に立ちますか?私はあなたがPythagoras' theoremでこれを行うことができると思い

+1

等角図は、回転されません。 –

+0

Ops、申し訳ありませんが、それは解決策を実際に変更しません。回転行列を使用するのではなく、投影行列を使用して同じ計算を行うことができます。 – Rafid

+0

Blimey。これは難しいことです。私のアングルシータは45度だと思うが、私はWikipediaの記事に書かれている行列式を実際に理解していない。私はかなりばかげている(私の背景は数学やコンピュータ科学ではない!)。 – Garry

0

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

私の数学は素晴らしいではありませんが、あなたはその後、タイルの数を掛けできるようhは、タイルの1辺の長さでなければなりません。

+0

これは、矩形の幅と高さ(したがってマップを二分する三角形の斜辺)を計算するために機能しますが、マップの幅は計算しません。 – Garry

2

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

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

今、あなたは、グリッドのサイズを取得するには、行や列ごとのタイルの数でこれらの番号を掛ける追加することができます。

EDIT:あなたのイメージを見て投影がないアイソメトリック(少なくとも私は学校で学んだこと)であるように、それはそうです、との角度は、両側に60degであるため、Cos(30)Cos(60)Sin(30)Sin(60)を交換

それを見て別の方法:

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

+0

ありがとうございます。彼らは厳密に等尺性ではありません - 彼らはdimetric(背の高さの2倍の幅)です。 – Garry

0

あなたは下から始まり、左サイドを歩けば、あなたは行ごとに、その後、各列に対して半分の高さを半分のタイルの高さを上に移動します。同様に、左端から始めて下端に沿って歩くと、各列のタイル幅の半分、次に各行の幅の半分まで移動します。

だからマップの軸平行境界ボックスの幅が(rows+columns)*TileWidth/2あり、高さが(rows+columns)*TileHeight/2

関連する問題