我有:
- 轴对齐矩形R ;
- 非垂直线A(由两点指定);
- 垂直线B(由 x 坐标指定)。
上面的所有对象都由整数坐标指定。
我需要检查A和B交叉的结果是否在R中。但我不能只计算交叉A和B的结果,因为它在整数坐标中可能无法呈现。我也无法将其转换为双精度数,因为我需要获得绝对准确的结果而没有任何不准确之处。
那么,我该如何检查呢?
如果线是用整数坐标指定的,那么它们的交叉点就有有理坐标,可以用绝对精度来比较。
让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 进行比较
[让我们忽略 B 不与 R 相交时不感兴趣的情况]
R 从 B 中切出一条线段,我们称其为 S。当且仅当 A 与 S 相交时,B 和 A 的交点位于 R 内部。
找到 S 的点是微不足道的。
要检查一条线是否穿过一条线段,您应该检查 S 的末端是否位于 A 的不同侧 - 这可以通过符号角来检查。
假设 A 上的 2 个点是(x0, y0)
和(x1, y1)
,其中 'x0 < x1'。
矩形由 x 坐标xR
和 y 坐标确定yR
B线由x坐标确定xB
您要寻找的重点是,仅通过操纵整数来确定(xB, yB)
何处:yB
所以首先,你需要检查
xB * xR >= 0
(x 坐标的同一侧)abs(xB) <= abs(xR)
(B 线切割矩形)如果没问题,那么你需要检查这个整数(等于(x1-x0)yB)
Y = (y1-y0)(xB-x0)+(x1-x0)y0
验证
Y * yR >=0
(y坐标的同一侧)abs(Y) <= (x1-x0) * abs(yR)
(这意味着你的交点在 R 区域关于它的 y 坐标)当且仅当 4 个条件为真时,您的观点在 R 之内。希望能帮助到你。