【问题标题】:Ambiguity between i, j indices and x, y coordinates when dealing with 2D arrays处理二维数组时 i、j 索引和 x、y 坐标之间的歧义
【发布时间】:2012-08-12 02:22:58
【问题描述】:

背景

我正在与一位朋友讨论在我正在设计的东西中引用二维数组中元素的正确方法。我不喜欢使用 XNA 的 PointVector2 结构作为数组引用,因为它们的属性标记为 XY

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

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

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

【问题讨论】:

    标签: c# xna indices cartesian


    【解决方案1】:

    听你朋友的!

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

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

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

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

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

    • “不是在这里发明的”对于程序员来说是一个非常非常非常的坏习惯。学习使用其他人的代码(只要它有效 - 在这种情况下,它确实有效)。

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

    • 不必要地复制东西会影响小性能。 (加上其他一些对性能有轻微影响的深奥的东西。)

    (另外:使用Vector2(浮点)索引到数组中有点奇怪。)

    【讨论】:

    • 我使用整数作为索引 =P 但是你说得很好,无论如何我所做的只是一个原型,我会在我完成时切换到 Point 和 Vector2 !
    【解决方案2】:

    这不取决于个人喜好,因为您将不得不在结构之间进行转换,以将数据传递给 XNA 库方法。您会产生转化成本,这无疑是非常小的,但如果在循环中重复执行,则可能加起来相当可观。

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

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

    【讨论】:

    • 但是使用 Point 而不是我自己的 ArrayPoint 会不会产生相同的会话成本?两者的唯一区别是x被引用为j,y被引用为i!在转换方面,我宁愿在绘图时交换我的 x 和 y,而不是每次引用网格中的对象位置时。
    • 在额外开销方面,对我来说,在处理数组时考虑 x、y(水平然后垂直)的要求更高,因为我习惯于考虑 i、j (行然后列)
    • 我所指的发生成本是,例如,从某个 XNA 库方法中获取 Vector2,将其转换为您自己的 Vector2 数据类型,然后必须将其转换回 Vector2 以将它传递给另一个 XNA 库方法。
    • 我想不出实际适用的情况。我只将对象位置存储在数组中。如果我使用 Point 代替,我仍然需要将其转换为用于绘图等的 x、y 屏幕坐标。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2020-03-20
      • 1970-01-01
      • 1970-01-01
      • 2020-12-16
      • 1970-01-01
      • 2023-04-01
      • 2023-04-05
      • 2015-04-11
      • 1970-01-01
      相关资源
      最近更新 更多