查找从某个点以某个角度行走时,您将在什么点到达图像边界
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)
我正在做一些图像处理,假设我有一个点(例如 (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)