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),在这种情况下,我的意思是。但是,通过使用我上面显示的数学,它似乎将房间映射到一个二维数组,其中 (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 上的范围分别相同
- 不计算较大正方形中的中间点(插值)

于 2013-05-16T21:22:03.427 回答