1

環境のマップを作成したいと思います。私の部屋。2D Array を使用して自分の部屋を 2D で表現したいと考えています。

(5,5)、(10,5)、(5,10)、および (10,10) で始まる座標を持つ部屋をマッピングしようとしています。これは 5x5 のサイズの正方形です。これを 100x100 セルの 2D グリッドにマッピングしたいと思います。

私がマッピングに使用している数学は、

X' = (maxRangeX - minRangeX)*(X - minX)/(maxX - minX) + minRangeX
Y' = (maxRangeY - minRangeY)*(Y - minY)/(maxY - minY) + minRangeY

どこ

maxRangeX   100 maxX    10  maxRangeY   100 maxY    10

minRangeX   0   minX    5   minRangeY   0   minY    5

ご存じのように、Array の動作は、左上から (0,0) から始まり、右下から (100,100) から始まります。しかし、上に示した数学を使用すると、部屋は 2D 配列にマッピングされ、(0,0) は左下から始まり、(100,100) は右上、(0,100) は左上、(100, 0) 右下。

結果が配列構造のように構造で順序付けられるように、部屋をマップしたいと思います。

どんな助けでも大歓迎です。

アップデート:

アイデアは上記と同じですが、さらに説明するための図を次に示します。

http://i.stack.imgur.com/h4Mgm.png

4

1 に答える 1

0

あなたの表記を使用して:

X' = maxRangeY - ((maxRangeY - minRangeY)*(maxY-(Y - minY))/(maxY - minY) + minRangeY)
Y' = maxRangeX - ((maxRangeX - minRangeX)*(maxX-(X - minX))/(maxX - minX) + minRangeX)

x の「反転」は y の「反転」にマップされ、y の「反転」は x の「反転」にマップされます。

C# 関数:

static int Transform(int coord, int coordMin, int newCoordMin, double factor)
{
   return (newCoordMin + (int)((coord - coordMin) * factor));
}
static void Transform(int[,] arrIn, int minX, int minY, int maxX, int maxY,
                    out int[,] arrOut, int minRangeX, int minRangeY, int maxRangeX, int maxRangeY)
{

double factorX = (maxRangeX - minRangeX) / (maxX - minX);
double factorY = (maxRangeY - minRangeY) / (maxY - minY);

arrOut = new int[maxRangeX + 1, maxRangeY + 1];

for (int x = minX; x <= maxX; ++x)
    for (int y = minY; y <= maxY; ++y)
        arrOut[maxRangeY - Transform(y, minY, minRangeY, factorY), maxRangeX - Transform(x, minX, minRangeX, factorX)] = arrIn[maxX - (x - minX), maxY - (y - minY)];
}

これは、次の条件を想定して動作しています:
- x と y の範囲は、それぞれ最初の正方形と 2 番目の正方形で同じです
- 大きな正方形の中間点は計算されません (補間されます)。

于 2013-05-16T21:22:03.427 に答える