处理 2D 数组时 i, j 索引和 x、y 坐标之间的歧义



背景

我正在和一位朋友讨论如何正确引用我正在设计的 2D 数组中的元素。我对使用 XNA 的 PointVector2 结构作为数组引用不满意,因为它们的属性被标记为 XY

我为这些结构创建了结构,ArrayPointArrayVector2,并将我自己的属性称为IJ。我的朋友认为这是浪费时间,但是,我不喜欢交换XY引用,因为我的数学背景一直教我使用 i 和 j 作为矩阵,例如使用 myArray[i, j] 而不是 myArray[y, x]

处理这种情况的最佳方法是什么?

这仅仅是交换 x 和 y 的情况吗?或者创建自己的结构来按照自己喜欢的方式处理它?这完全取决于个人喜好,因为无论如何这几乎都是任意的吗?

听你的朋友说!

这是一个坏主意的原因有很多,这里有几个:

  • 你的数学背景可能会说ij。但是对于映射到 2D 空间的数组(例如:平铺映射,而不是矩阵),那么xy实际上是可取的,因为它们传达了语义含义,使您的代码更容易理解。(即:你有 X 轴和 Y 轴,而不是 I 和 J)。

  • (通常,在ij更具语义意义的情况下,您无论如何都不会将索引器存储在结构中 - 它们只是临时的局部变量。

  • 如果没有真正的原因,更少的代码总是比更多的代码更可取。编写和测试代码会占用宝贵的时间。使用别人的代码(如内置的 XNA 类型)可以节省您的时间。

  • 有一天,你可能会写一些需要Point的实用程序函数。如果您有两个版本的Point那么很可能最终会得到该函数的两个版本。更多的代码,更糟糕的是:重复的代码!

  • "不是在这里发明的"是一个非常,真的,非常糟糕的习惯,作为一个程序员。学会接受其他人的代码(只要它有效 - 在这种情况下,它确实有效)。

  • 没有其他人这样做。你的代码会让所有试图使用它的人感到困惑和恼火。

  • 小性能打击不必要地复制东西。(加上其他一些对性能影响不大的事情。

(另外:索引到具有Vector2(浮点)的数组有点奇怪。

这不是个人喜好,因为您必须与结构体相互转换才能将数据传递给 XNA 库方法。您将产生转换成本,诚然,转换成本非常小,但如果在循环中重复进行,可能会增加相当可观的成本。

当然,SpriteFont.MeasureString() 返回一个由 X 和 Y 成员组成的数据结构而不是 Width 和 Height 是愚蠢的,但处理这种奇怪比尝试对抗它更容易。

我的建议是尝试使用 x 和 y 作为索引,并避免额外的开销。

我认为你做的很好。我唯一建议不要这样做的时候是,如果你增加了很多复杂性。如您所知,XNA软件和其他必须处理许多计算和图形的软件如果效率低下,可能会因微小的变化而陷入困境。但是,您正在做的只是帮助您,不应该增加上述复杂性。我会说去吧。