给定一个非自相交多边形作为点列表 (p1...pn),以及该多边形外部的点 (A):
我想计算多边形从该点覆盖的总视场角,以及从该点到该视场中间的方向(作为矢量或与水平面的角度)。
在视觉上,我想要绿色矢量的角度 θ 和方向:
我尝试找到从水平线到每个多边形点的最小和最大角度,但我不知道如何判断哪个是范围的开始,哪个是结束。假设较小的角度是从简单框左侧开始给出的错误结果。
我猜解决方案与多边形点是顺时针还是逆时针顺序有关。
多边形顺时针还是逆时针并不重要。重要的是,从该点看去,任何边的长度必须小于 π 弧度。这将告诉我们,从该点看,边缘是从 A 到 B,还是从 B 到 A 逆时针移动。
例如,假设从点到顶点的方位角(以弧度为单位)为{0, 2π/5, 4π/5, 6π/5, 8π/5}。如果边由(无序)对 (A,C)、(A,E)、(B,D)、(B,E)、(C,D) 表示。然后边缘运行:
0->4π/5
2π/5->6π/5
4π/5->6π/5
8π/5->0
8π/5->2π/5
所以多边形的范围是[8π/5, 6π/5]。
不确定这是到达那里最有效的方式,但在Python库pygeoops中有一个实现:pygeoops.view_angles
示例代码:
from matplotlib import pyplot as plt
import pygeoops
import shapely
import shapely.plotting as plotter
viewpoint = shapely.Point(0, 0)
visible_geom = shapely.box(1, 0, 2, 1)
start_angle, end_angle = pygeoops.view_angles(viewpoint, visible_geom)
print(f"{start_angle=}, {end_angle=}")
# start_angle=0.0, end_angle=45.0
plotter.plot_points(viewpoint, color="red")
plotter.plot_polygon(visible_geom)
plt.show()
免责声明:我是 pygeoops 的开发者。