将笛卡尔坐标中的点x,y映射为二维数组元素

本文关键字:数组元素 二维 映射 坐标 笛卡尔 | 更新日期: 2023-09-27 18:14:01

我想创建一个环境的地图,即。我的房间。我想用二维数组来表示我的房间。

我正在尝试映射一个房间,它的坐标开始于(5,5),(10,5),(5,10)和(10,10)。这是一个5x5的正方形,如果你想知道的话。我想把它映射成一个100x100单元格的二维网格。

我用来映射的数学是,

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)在右下角。

我想把房间映射过来,这样结果就会像数组结构那样排序。

感谢您的帮助。

更新:

这个想法还是和上面一样,这里有一张图来进一步说明。

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

将笛卡尔坐标中的点x,y映射为二维数组元素

使用你的符号:

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在第一个正方形和第二个正方形上的范围是相同的,分别
-较大正方形中的中间点不计算(插值)