首页 > 解决方案 > 在直线的末端画一个四分之一圆

问题描述

我有一些点的坐标。我的任务是获取这些点的方向,并找到未来可能的点在计算方向上的位置。为此,我计划了以下内容-

  1. 将线拟合到点
  2. 在拟合线的末端画一个四分之一圆。按照常识,四分之一圈可能不是正确的选择。但是,它是另一个问题的一部分,必须以这种方式解决。

我正在使用以下代码来拟合一条线

from matplotlib import pyplot as plt
from scipy import stats

x = [1,2,3,2,5,6,7,8,9,10] 
y = [2,4,11,8,8,18,14,11,18,20]
slope, intercept, r_value, p_value, std_err = stats.linregress(x,y)
line = [slope*i+intercept for i in x]
plt.plot(x, line)

假设,拟合线上的两个点是(9,17)和(10,19)。如何在 (10,19) 处沿直线方向绘制半径为 5 的四分之一圆?

在此处输入图像描述

最终,我将有一个点位置,我必须检查该点是否落在四分之一圆内,我认为这可以通过匀称来完成。

标签: pythongeometrypointshapely

解决方案


您可以将其委托给 Shapely,而不是自己计算所有数学。

首先,借助以下工具在行尾创建一个圆圈buffer

from shapely.affinity import rotate
from shapely.geometry import LineString, Point
from shapely.ops import split

a = (10, 20)
b = (15, 30)
ab = LineString([a, b])  # the line you got from linear regression
circle = Point(b).buffer(5)

在此处输入图像描述

现在,让我们得到两条新线,它们将划定我们想要的扇区区域。我们将通过rotate在每个方向将直线使用旋转到 135º 来实现,这样扇形的中心角将为 360º - 135º * 2 = 90º,即圆的四分之一:

left_border = rotate(ab, -135, origin=b)
right_border = rotate(ab, 135, origin=b)

在此处输入图像描述

最后,用于split获取扇区:

splitter = LineString([*left_border.coords, *right_border.coords[::-1]])
sector = split(circle, splitter)[1]

在此处输入图像描述

从这里您可以使用方法轻松找出某个点是否位于扇区内contains。例如:

points_of_interest = [Point(16, 32), Point(12, 30)]
for point in points_of_interest:
    print(sector.contains(point))
# True
# False

在此处输入图像描述


推荐阅读