使用JS数组表示大小不确定的2D空间 - 负索引?

3
我想用一个2d JS数组来表示2d笛卡尔坐标。这个2d空间大小不确定(可以扩展到负x和负y空间)。对于正的x和y值,这是没问题的,但由于JS数组的最小索引为0,我无法扩展到负x和负y空间。
我已经阅读了一些关于在JS中使用负索引的简短信息,据说这些技术上是可行的,但并没有得到很好的支持(例如,数组函数可能无法正常工作)。
我相信其他人也必须有类似的要求,所以我想问 - 在JS中建模这个问题的推荐方法是什么?负数数组索引是可行的解决方案吗?

嗯,首先想到的是一个对象,包含两个数组,一个用于正极,另一个用于负极。不确定如何处理两个零,或使它们连续。 - Joseph
@Joseph,是的,我也在考虑这些方面,但我觉得当处理那些与+/-边界重叠的事情时,可能会变得混乱。还有你提到的零问题... - UpTheCreek
1个回答

1

你确定需要负索引吗?通常,计算机图形的每个坐标系都从屏幕左上角的 (0/0) 开始,并在其他地方绘制它们的轴。

因此,有限大小的解决方案只是转换坐标。此外,您可以在数组上使用负指数,但最好称其为“数组对象上的键”。如果您了解它们的限制,可以使用它们:

  • Array.length 仅适用于正索引。
  • 因此,您无法从 0 到 a.length 循环 - 您将不得不找到另一种解决方案。(不要考虑 for-in)。
  • 因此,您将需要确定循环的负起点-让它成为一个常量,甚至是数组对象的另一个属性(没有自动更新功能!)。

但是,您说您的空间是不确定的。问题只是没有无限的数据结构-在任何编程语言中都是如此。当然,数组索引可能会变得非常大,但您真的需要它们吗?我非常确定,大小为 (2^32)^2 的二维数组仅仅是巨大的内存空间浪费-或者至少会使您的应用程序极其缓慢。

也许更好的想法是将对象表示为一维数组中的点。您可以轻松地循环遍历它,可以拥有任意数量的坐标值,并且不需要太多内存。


是的,不幸的是,空间不是一个“预先知道”的有限大小(它不是屏幕)- 所以我不能进行转换 :( 你提出了一些好观点- 我会仔细考虑。谢谢。 - UpTheCreek
它不需要预先知道,只需要始终是有限的。边界和转换函数可能会在运行时发生变化。 - Bergi
1
啊,我明白了。它不一定要是“无限的”,只要足够大就可以了。因此,某种动态转换函数可能是一个选项。然而,每次增加负边界时,你不需要将整个数组“移位”吗?这可能需要复制到新数组 - 听起来很昂贵! - UpTheCreek
另一个想法:你知道从ℕ→ℤ的投影吗?(示例) :-)循环会很糟糕... - Bergi
不需要在JS中复制数组。您可以同时使用unshift()和push() - 它实际上是一个列表。此外,如果您有一个智能转换函数,您可以利用负索引 - 只需将下限存储在某个地方即可。 - Bergi
没错 - 我还在想我不能使用数组支持函数,谢谢。关于投影的事情我得回头再和你联系! - UpTheCreek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接