如何在c#中生成坐标系
本文关键字:坐标系 | 更新日期: 2023-09-27 18:02:32
这是我的坐标系:http://rubidium-style.com/upload/naburus_primus/grid.png
尺寸为5*5。我想用c#生成你在图片上看到的所有坐标。我该怎么做呢?我把后面的单元格一直加25。这就是我的代码目前的样子,但它只在一个方向上工作。它必须是动态的,所以如果我把5*5增加到100*100,它应该能正常工作。
代码:int landSize = 5;
int landRegion = landSize * landSize;
int landDist = 25; // 25 cm, (1 cell size)
for (int i=0; i<landRegion; i++){
int[] x;
const int y = 0;
int[] z;
Debug.Log(x[i]);
Debug.Log(z[i]);
}
我不想让你看到我试图不让你混淆。我想把坐标数据加载到数组中
从0..24 ~ 0..在x和y方向上,你会这样做:
for (int i=0; i<landRegion; i++){
int y = i / landSize;
int x = i % landSize;
i / landSize
将y
每增加1个landSize
(5)值,这意味着从区域0到4它将为0,从区域5到9为1,从区域10到14为2,等等。
i % landSize
对于i
的每一个新值将上升1,然后在通常达到5时返回0,因此它将遵循x轴。
然后,得到-2…+2,你会减去landSize / 2
:
for (int i=0; i<landRegion; i++){
int y = (i / landSize) - landSize / 2;
int x = (i % landSize) - landSize / 2;
然后,从那到-50…+50(25次递增),乘以25(在本例中为landDist
):
for (int i=0; i<landRegion; i++){
int y = ((i / landSize) - landSize / 2) * landDist;
int x = ((i % landSize) - landSize / 2) * landDist;
这种计算方法的优点是,如果你只是用任何区域的索引替换i
,你可以直接计算它的坐标,而不必每次都从0开始做一个完整的循环。
注意,如果landSize
值能被2整除,那么这个计算将会有问题,因为它没有一个定义良好的中心。如果你把它减小到4以上,坐标将从-50到+25。您必须决定如何处理这种情况,并相应地更改代码。
看你的图片,好像你把坐标y称为z,并让它从+50下降到-50,所以这是最终的代码:
for (int i=0; i<landRegion; i++){
int z = -((i / landSize) - landSize / 2) * landDist;
int x = ((i % landSize) - landSize / 2) * landDist;
如果您需要将其塞进数组以供以后引用,可以这样做:
int[] z = new int[landRegion];
int[] x = new int[landRegion];
for (int i=0; i<landRegion; i++){
z[i] = -((i / landSize) - landSize / 2) * landDist;
x[i] = ((i % landSize) - landSize / 2) * landDist;
}
由于常量的关系,这有点过于啰嗦了,但这应该可以为您工作。
const Int32 xMin = -50;
const Int32 xMax = +50;
const Int32 xStep = 25;
const Int32 zMin = -50;
const Int32 zMax = +50;
const Int32 zStep = 25;
for (var z = zMin; z <= zMax; z += zStep)
{
for (var x = xMin; x <= xMax; x += xStep)
{
Console.WriteLine("x: {0} z: {1}", x, z);
}
}
注意,这颠倒了z
的顺序;for (var z = zMax; z >= zMin; z -= zStep)
将产生与描述相同的顺序。
您可以使用Point结构来保存坐标,并使用Point[]来存储多个坐标。
使用System.Drawing;使用System.Collections.Generic;
List<Point> arrPoint = new List<Point>();
arrPoint.Add(new Point(10, 20));
arrPoint.Add(new Point(15, 25));
arrPoint.Add(new Point(20, 30));