延长线到屏幕边缘

Extend line to edge of screen

我在 (0, 0, w, h) 处有一个边界框,在其中某处有一个点 (x, y),还有一个指向某个随机方向的方向向量 (dx, dy),什么我正在尝试做的是从该点沿该方向到边界框边缘创建一条线。

看下图,黑点是点,箭头是方向向量,红线是我想要的结果线

我现在正在做的是简单地通过向量乘以一些随机大数来延长线,保证将它放在框外,然后使用线剪裁算法剪裁它。这完全可行,但感觉像是一个非常 hacky 的解决方案,有没有更好的方法来做到这一点?

首先,如何找到与垂直线的交点。

设 (x0,y0) 为框内的点,(dx,dy) 为它的斜率。并假设您正在尝试找到与垂直线 y=b.

的交点

x0+tdx和y0+tdy是直线上的点。所以该线在 y1 处与垂直线相交,使得 y1=y0+tdy=b (t>=0)。所以求解 t (t=(b-y0)/dy) 并使用相同的 t 得到 x1 = x0 + tdx.

同样也可以找水平线的交点

你应该找到直线与两条边相交的四个点。在大多数情况下,其中两个将具有负 t,丢弃它们。在另一个中,选择 t 最低的那个,这就是你的答案。

进一步优化:

根据dx 和dy 的符号,直线可能与两条边之一相交。例如,如果两者都是正数,则它可能与顶部或右侧相交,依此类推。您可以只计算这两条边的 t 并选择 t 最低的那条。