マウス座標を等尺性インデックスに変換する方法は?


21

タイル64x32で等尺性マップを描画します。

const Offset = 160;
int X, Y;

for (int a=0; a < 6; a++)
  for (int b=0; b < 6; b++) {
    X = a * 32 - b * 32 + Offset;
    Y = a * 16 + b * 16;
    DrawTile(X, Y, tile);
  }

このコードを示す画像:

このコードを示す画像:

親愛なる専門家は、セルの等尺性インデックスでのマウス座標の変換式を手伝ってください。例:(105; 100)-> [1; 4]。



サイドノート:増分する変数の以前の値に実際にアクセスしたくない場合、while(val = arr[i++])または同様の構成のように、それを使用しないください。代わりに++aand ++bを使用します。
マーティンソイカ

回答:


25

タイル空間座標からスクリーン空間座標への変換行列決定してから、この逆行列計算する必要があります。逆行列は、スクリーン空間座標に適用すると、タイル空間座標に変換されます。

ちなみに、オフセットは実際には任意の健全な座標系で(0.0、1.0)になる場所を指していますが、それは大きな問題ではなく、覚えておくべきことです。これは、変換された座標系の原点のオフセットが(オフセット+ 32、0)であることを意味します。


特定のケース

タイル空間(a、b)座標をスクリーン空間(x、y)座標に変換するために基本的に行うことは、次の変換マトリックスを実行することです。

ここに画像の説明を入力してください

定義:とBタイルの(0、0)の範囲である[0.0、1.0)、(0.0、0.0)の上部コーナー、(1.0、1.0である)下隅、(0.0、1.0)左隅(1.0、0.0)画面スペースの右隅。

座標変換を定数の3番目の座標(常に正確に1)だけ拡張して、変換をマトリックスに組み込むことができます。

これで、この変換の逆行列を作成できます。基本的な式は次のとおりです。

ここに画像の説明を入力してください

... CA の補因子行列です

あなたの場合、決定要因| A | オフセットに関係なく常に1024であるため、逆行列は次のようになります。

ここに画像の説明を入力してください


計算例

さて、あなたのサンプルデータのために...

数式にオフセットの数値を入力すると、次の結果が得られます。

ここに画像の説明を入力してください

(105、100、1)(画面座標)を行列で乗算すると、次のようになります。

ここに画像の説明を入力してください ここに画像の説明を入力してください

3番目の座標は常に1であるため、計算する必要はありません。最も近い整数に切り捨てると、予想どおり、タイル空間の座標として(1、4)が得られます。


一般的な二次元射影行列

このような視点で、各タイルが幅2 w(例では64、したがってw = 32)および高さ2 h(例では32、したがってh = 16)であり、原点のオフセットがある場合水平軸と垂直軸(それぞれこの例では192と0)のf xとf yである画面空間では、行列は次のようになります。

タイルスペースからスクリーンスペース

ここに画像の説明を入力してください

画面スペースからタイルスペース

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.