查找从某个点以某个角度行走时,您将在什么点到达图像边界

Find at what point you will reach image border while walking from a certain point at a certain angle

我正在做一些图像处理,假设我有一个点(例如 (1000, 1000))和一个角(例如 30 度),我需要弄清楚我将在哪个点触摸图像的边界 (0, y) 或 (0, x) 如果我从该点以给定角度行走。我可以迭代地完成它,只需通过一个迭代器并一次走一步,通过在这个例子中做:

for i in range:
    x = 1000 - i * cos(30)
    y = 1000 - i * sin(30)

但也许有更好的方法可以直接找到我将在哪个点触及图像边界? 为了清楚起见,我添加了图片。

是时候学习一些三角函数了,考虑如下三角形

+
|\
| \
|  \
|   \
|   a\
+-----+

它的高度是已知的1000,它的宽度是未知的,所以用x表示它并且角度值a是已知的。 tan 函数值定义为相对和相邻之间的比率,在这种情况下 tan(a) = 1000/x 相当于 tan(a)*x = 1000 相当于 x = 1000/tan(a).

找到x后记得要从1000中减去它,作为你相对于(1000,1000)

的计算位置

让我们将 (x0, y0) = (1000, 1000) 称为您的起点。

假设您已经知道交点将在框的上侧,那么您正在寻找一个点 (x, 0) 使得 cotan(alpha) = (x - x0) * y0.

所以你可以选择x = x0 + cotan(alpha) / y0

三角函数 cotan 不直接属于 python 的标准库,但是 cotan(alpha) = tan(pi/2 - alpha),所以你可以写:

import math

x = x0 + math.tan(math.pi / 2 - alpha) / y0  # angle alpha in radians

或者:

import math

x = x0 + math.tan((90 - alpha_in_degrees) * math.pi / 180) / y0

如果您的框是由坐标 (left, right, top, bottom) = (0, ?, 0, ?) 定义的,那么您可以通过检查 x 的计算值是否在范围内来检查该点是否确实位于框的顶部, alpha 在 0 到 180° 之间:

assert(left <= x <= right and 0 <= alpha_in_degrees <= 180)