假设观察者在位置(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。这是垂直和水平视线,可能会导致在上述等式中除以零。解决办法:分别处理这些情况。