我有:检查是否在矩形的点
- 轴对齐矩形- [R;
- 非垂直线A(由两点指定);
- 垂直线B(由x坐标指定)。
以上所有物件由指定整数坐标。
我需要检查时,如果交叉甲和乙的结果是- [R。但我不能只计算穿越A和B的结果,因为它在整数坐标中可能是不可预测的。此外,我无法将其转换为双打,因为我需要得到绝对准确的结果而没有任何不准确。
那么,我该如何检查它?
我有:检查是否在矩形的点
以上所有物件由指定整数坐标。
我需要检查时,如果交叉甲和乙的结果是- [R。但我不能只计算穿越A和B的结果,因为它在整数坐标中可能是不可预测的。此外,我无法将其转换为双打,因为我需要得到绝对准确的结果而没有任何不准确。
那么,我该如何检查它?
如果直线由整数坐标指定,那么它们的交点具有合理的坐标,这可以与绝对精度进行比较。让我们通过点(ax0,ay0)和(ax1,ay1),并且B在X0坐标处。 (ay0 *(ax1-ax0)+(x0-ax0)*(ay1-ay0))/(ax1-ax0)= p/q,其中p和q是整数,q是积极的(如果需要,否定提名人)。
然后p可以与R.Top进行比较* q和R.Bottom * Q
[让我们忽略不感兴趣的情况下,当B不相交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)
(也就是说你的交叉点是关于其y坐标的区R)你的观点是在'r当且仅当了4个条件是真实的。 希望它有帮助。
为什么你认为使用'double'将比使用整数更精确? – Alnitak
交叉点的y坐标是一个有理数,所以你想要做什么。请注意,您只需检查y坐标,因为B是否与R相交足以检查x坐标。潜在的问题是整数溢出。 –