1

我有:

  1. 轴对齐矩形R ;
  2. 非垂直线A(由两点指定);
  3. 垂直线B(由 x 坐标指定)。

上面的所有对象都由整数坐标指定。

我需要检查AB交叉的结果是否在R中。但我不能只计算交叉AB的结果,因为它在整数坐标中可能无法呈现。我也无法将其转换为双精度数,因为我需要获得绝对准确的结果而没有任何不准确之处。

那么,我该如何检查呢?

4

3 回答 3

1

如果线是用整数坐标指定的,那么它们的交叉点就有有理坐标,可以用绝对精度来比较。

让A经过点(ax0,ay0)和(ax1,ay1),B在X0坐标。那么交叉点Y坐标为(ay0*(ax1-ax0)+(X0-ax0)*(ay1-ay0))/(ax1-ax0) = p/q,其中p和q为整数,q为正(如果需要,否定提名人)。

然后 p 可以与 R.Top*q 和 R.Bottom*q 进行比较

于 2012-05-08T12:23:25.593 回答
0

[让我们忽略 B 不与 R 相交时不感兴趣的情况]

R 从 B 中切出一条线段,我们称其为 S。当且仅当 A 与 S 相交时,B 和 A 的交点位于 R 内部。

找到 S 的点是微不足道的。

要检查一条线是否穿过一条线段,您应该检查 S 的末端是否位于 A 的不同侧 - 这可以通过符号角来检查。

于 2012-05-08T13:05:56.263 回答
0

假设 A 上的 2 个点是(x0, y0)(x1, y1),其中 'x0 < x1'。

矩形由 x 坐标xR和 y 坐标确定yR

B线由x坐标确定xB

您要寻找的重点是,仅通过操纵整数来确定(xB, yB)何处:yB

所以首先,你需要检查

  1. if xB * xR >= 0(x 坐标的同一侧)
  2. if abs(xB) <= abs(xR)(B 线切割矩形)

如果没问题,那么你需要检查这个整数(等于(x1-x0)yB)

Y = (y1-y0)(xB-x0)+(x1-x0)y0

验证

  1. Y * yR >=0(y坐标的同一侧)
  2. abs(Y) <= (x1-x0) * abs(yR)(这意味着你的交点在 R 区域关于它的 y 坐标)

当且仅当 4 个条件为真时,您的观点在 R 之内。希望能帮助到你。

于 2012-05-10T20:28:52.700 回答