计算简单多边形从一点开始的视场

问题描述 投票:0回答:2

给定一个非自相交多边形作为点列表 (p1...pn),以及该多边形外部的点 (A):

我想计算多边形从该点覆盖的总视场角,以及从该点到该视场中间的方向(作为矢量或与水平面的角度)。

在视觉上,我想要绿色矢量的角度 θ 和方向:

Diagram

我尝试找到从水平线到每个多边形点的最小和最大角度,但我不知道如何判断哪个是范围的开始,哪个是结束。假设较小的角度是从简单框左侧开始给出的错误结果。

我猜解决方案与多边形点是顺时针还是逆时针顺序有关。

math geometry polygon computational-geometry
2个回答
0
投票

多边形顺时针还是逆时针并不重要。重要的是,从该点看去,任何边的长度必须小于 π 弧度。这将告诉我们,从该点看,边缘是从 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]。


0
投票

不确定这是到达那里最有效的方式,但在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 的开发者。

© www.soinside.com 2019 - 2024. All rights reserved.