python - 在直线的末端画一个四分之一圆
问题描述
我有一些点的坐标。我的任务是获取这些点的方向,并找到未来可能的点在计算方向上的位置。为此,我计划了以下内容-
- 将线拟合到点
- 在拟合线的末端画一个四分之一圆。按照常识,四分之一圈可能不是正确的选择。但是,它是另一个问题的一部分,必须以这种方式解决。
我正在使用以下代码来拟合一条线
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 的四分之一圆?
最终,我将有一个点位置,我必须检查该点是否落在四分之一圆内,我认为这可以通过匀称来完成。
解决方案
您可以将其委托给 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
推荐阅读
- laravel - 为 Laravel 中的用户和 Controller 中的 Passport 创建新的 Passport 客户端
- pandas - 将混合数据类型的 Pandas Dataframe 转换为 LibSVM 格式
- cypress - 赛普拉斯测试机构
- github - 如何将自定义字段添加到 GitHub 问题模板?
- sql - 使用while循环计算两行的差异并将结果插入临时表
- reactjs - 如果在 React.js 的回调中无法使用 UseEffect(),如何停止无限渲染循环?
- cassandra - 向 cassandra 表添加列会立即完成吗?
- python - 为什么我的 kde 图显示为垂直线而不是曲线?
- spring - 如何将运行时生成的 groovy 类提供给 Spring Boot 上下文配置过程
- c++ - 原语的 C++ 默认构造函数?