0

我正在 Rails 应用程序中使用它编写一个 ruby​​ 代码,我必须从用户那里接受类似 excel 单元格的结构,并且我必须验证这些单元格结构。

例如:

用户应能够通过用冒号分隔来指定单元格块,例如 A1:B2 应覆盖表格中的 A1、A2、B1、B2 单元格。

同样,用户可以输入许多位置,例如

A1:B1 A2:C2 A1:F1

但是当用户输入重叠位置时问题就来了,例如:

A1:D5 和 A2:C3 还有 D1:E1 和 A1:F2。

在这种情况下,A2:C3 位于 A1:D5 块内,因此用户应该收到一些错误消息(验证错误),说明这些是重叠位置。

我正在考虑的一个逻辑是将每个位置转换为一个唯一的整数值并使用它来区分,但到目前为止我还没有得到任何逻辑来跟踪这种情况。

让我知道是否有人对如何解决这个问题有任何想法。

谢谢,院长

4

1 回答 1

0

您要做的是简单的框或矩形碰撞检测——这是游戏和图形编程中广为人知且长期解决的问题。

例如,请参阅此博客文章:

http://www.owenpellegrin.com/articles/vb-net/simple-collision-detection/

您需要将字母数字单元格名称(列 + 行)转换为整数 (x,y) 坐标,以便于计算。

因此,从A1:D5A2:C3它们变成坐标:(1,1):(4,5)(1,2):(3,3)

然后,一个简单的框碰撞检测算法将能够确定两个点(1,2)(3,3)位于矩形内(1,1):(4,5),因此第二个矩形完全包含在第一个矩形内 - 即,您有重叠。

在您的情况下,您还需要确保您的算法将“边缘”碰撞视为重叠。也就是说,A1:B2技术上重叠,B1:C2因为它们共享相同的“边缘”(即两个单元格B1:B2)。

注意:将每个矩形与其他矩形进行检查以查看它们是否相交的“朴素”算法具有 O(n^2) 复杂度。如果你只处理几十个矩形,那么你应该没问题。但是,如果您需要检查数千个矩形,那么您可能应该考虑动态构建两个区间树,每个轴一个。

于 2012-10-22T06:58:08.583 回答