2012-05-08 35 views
1

我有:检查是否在矩形的点

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

以上所有物件由指定整数坐标

我需要检查时,如果交叉的结果是- [R但我不能只计算穿越AB的结果,因为它在整数坐标中可能是不可预测的。此外,我无法将其转换为双打,因为我需要得到绝对准确的结果而没有任何不准确。

那么,我该如何检查它?

+0

为什么你认为使用'double'将比使用整数更精确? – Alnitak

+1

交叉点的y坐标是一个有理数,所以你想要做什么。请注意,您只需检查y坐标,因为B是否与R相交足以检查x坐标。潜在的问题是整数溢出。 –

回答

1

如果直线由整数坐标指定,那么它们的交点具有合理的坐标,这可以与绝对精度进行比较。让我们通过点(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

0

[让我们忽略不感兴趣的情况下,当B不相交R]

ř切断从B中的段,让我们称它为S.当且仅当A穿过S时,B和A的交点位于R内。

S的查找点很简单。

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

0

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

该矩形由一个确定的x坐标和xR y坐标yR

在B线由确定x坐标xB

你正在寻找的点是(xB, yB),其中yB为以某种方式确定,仅操纵整数:所以第一

,您需要检查

  1. 如果xB * xR >= 0(的同一侧x坐标)
  2. 如果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)(也就是说你的交叉点是关于其y坐标的区R)

你的观点是在'r当且仅当了4个条件是真实的。 希望它有帮助。