C# 负指数数组的实现

C# 负指数数组的实现,c#,arrays,C#,Arrays,我正在做一个游戏,这个世界向各个方向无限延伸。这意味着您可以处于位置X:50,Y:50或X:-50,Y:-50。但是我真的不能用一个普通的C#List来做这件事 我提出的所有想法似乎都太复杂/效率太低,无法实现…实现无限网格的最简单方法是使用稀疏矩阵,使用字典,以x,y对作为键,并将要存储的数据作为值。如果你的网格是稀疏的,这是快速的,易于实现的,并且内存友好 另一种方法是链接网格(类似于链表,但有指向4个方向的指针),或基于分片的方法来减少链接网格的开销(分片是NxN数组的链接网格)。tile

我正在做一个游戏,这个世界向各个方向无限延伸。这意味着您可以处于位置
X:50
Y:50
X:-50
Y:-50
。但是我真的不能用一个普通的C#List来做这件事


我提出的所有想法似乎都太复杂/效率太低,无法实现…

实现无限网格的最简单方法是使用稀疏矩阵,使用字典,以x,y对作为键,并将要存储的数据作为值。如果你的网格是稀疏的,这是快速的,易于实现的,并且内存友好

另一种方法是链接网格(类似于链表,但有指向4个方向的指针),或基于分片的方法来减少链接网格的开销(分片是NxN数组的链接网格)。tile的实现相当复杂,但对于非常密集的网格来说,这是内存和性能之间的一个很好的折衷

但我个人最喜欢的方法是使用奇偶变换。所以奇数指数是正的,而偶数是负的。要从虚拟索引转换为物理索引,您可以使用公式
p=abs(v*2)-(v>0?1:0)
,并将物理索引转换为虚拟索引,您可以
v=(p%2==1?+1:-1)*((2*p+3)/4)
。这种关系之所以产生,是因为自然数和整数之间存在一对一的关系(双射)
(0),(1),(2-1),(3-2),(4-2),(5-3),(6-3),…
。这种方法快速、简单、优雅,但当您有非常稀疏的网格,其中的项目离中心线非常远时,就不会有太多的内存了。

除非您有一吨(是的,一吨位…)的单元格,否则您可以使用字典。结合
系统.Drawing.Point
作为键,您将获得一个好的结果:

Dictionary<Point,YourGridObject> myMap = new Dictionary<Point,YourGridObject>();
然后,如果您想获得
磁贴,您可以

var eastTile = myTile.East;
栅格对象还可以实现偏移方法,以便通过

var otherTile = myTile.Offset(-2, 5);

使用下面的两个列表进行两个不同方向的展开如何?

我不确定这是否比您想要处理的更复杂,但您是否考虑过使用极坐标而不是笛卡尔坐标?在那个坐标系中没有负数。我意识到转换一开始很困难,但一旦你对它有了足够的了解,它就成了你的第二天性。

你可以使用字典,它具有数组的所有功能,显然除了负索引。

计算机无法存储无限数组。 数组必须有一个边界,请注意,在初始化数组的过程中,在代码的某个地方声明了一个特定的大小。 也许您可以在某个地方调整它的大小,但这仍然会留下一个从0到..的数字范围。。马克斯

因此,您应该做的是,编写一个函数,允许在这样的地图中相对定位。因此,您将当前地图[x,y]存储为一个位置。 你可以上升,通过一个函数,相对地增加/减少你当前的位置。 这也使您的代码更容易理解

如果你不是在处理游戏地图,而是数字范围,让我们说矢量 可以创建n个点的列表或二维字典

我把它贴在这里,因为你的问题可能会导致人们编写错误的代码

另外,在地图周围有边界的情况下(通常在游戏场景和图像处理中),为其他人添加。 数据来自[-1..width+1],只需将其标注为[0,width+2]
然后通过它开始循环(int x=1;x通常它是用模运算符实现的,或者更详细一点?尽管我在上面发表了评论,我还是在想其他的事情。请看下面的答案。计算机无法存储无限数组,这是一种错误的代码编写模式。因此,假设我想找到
25
-25
…我会使用什么
。其中(…)
function?与向相邻单元格添加引用不同,存储对点对象的引用可能更容易,您可以通过向点坐标添加/减去点坐标来查找相邻单元格。根据程序的结构,这些反规范化可能非常有帮助,也可能会使不必要的操作复杂化。@TheAdamGaskins我补充道我的答案中有一些元素,但只是一些建议。我不知道您想对磁贴做什么,但实现它的最佳方式实际上取决于您将如何使用它。@在某些情况下,引用相邻单元格而不是存储坐标可能比查询字典更快。这确实取决于这取决于他有多少个磁贴。我认为不利的一面实际上是如果序列化/反序列化。在我的场景中,你必须在反序列化后重新创建所有关联。我认为奇偶方法对我所做的工作很有效。谢谢:)
var otherTile = myTile.Offset(-2, 5);