假设观察者在位置(x1,y1)
,目标在(x2,y2)
。现在,我假设n
沿着x
和m
沿着有一组连续的瓷砖y
。第一个图块的左下角位于位置(x0,y0)
。瓷砖的大小是d
沿着x
和t
沿着y
。现在数学:
连接查看器和目标的线是
y = y1 + (y2 - y1) * (x - x1) / (x2 - x1)
瓷砖角在点p1 = (x0,y0)
;p2 = (x0 + n * d, y0)
; p3 = (x0 + n * d, y0 + m * t)
; p4 = (x0, y0 + m * t)
. 现在的工作是确定该线是否穿过连接两个连续角的 4 个线段中的任何一个。让我们采用由 定义的 p1 和 p2 之间的线段(水平线)y = y0
。如果将其设置为直线方程,您可以找到x
我命名的可能截取xi
:
y0 = (y2 - y1) * (xi - x1) / (x2 - x1) + y1
您可以反转这个等式并找到 possibx:
xi = x1 + (y0 - y1) * (x2 - x1) / (y2 - y1)
现在,如果xi > x0
你xi < x0 + n * d
有这个段的拦截。否则你有一个自由的视线。
对直线由p2 -> p3: x = x0 + n * d
;定义的其他三个线段执行相同的操作 p3 -> p4: y = y0 + m * d
; 和p4 -> p1: x = x0
。
请注意,当线段是水平的(y = const
)时,您必须将其放在y
视线直线上,计算x
并将其x
与截距进行比较。如果线段是垂直的(x = const
),那么您必须放入x
直线方程,计算y
并检查它是否落在区间内。
最后一点是,您必须特别注意x1 = x2
或的情况y1 = y2
。这是垂直和水平视线,可能会导致在上述等式中除以零。解决办法:分别处理这些情况。