python - 我如何才能找到数据中存在弯曲/切割的点?
问题描述
我有以下数据点: 此数据列表中有 5 个子列表。我想做的是找到曲率最大的点。
for i in range(len(smallest_5)):
x = [x for x,y in smallest_5[i]]
y = [y for x,y in smallest_5[i]]
plt.scatter(x,y)
plt.savefig('bend'+str(count)+'.png')
plt.show()
我已经使用此代码来绘制点。
sub_curvature = []
for i in range(len(smallest_5)):
a = np.array(smallest_5[i])
dx_dt = np.gradient(a[:,0])
dy_dt = np.gradient(a[:,1])
velocity = np.array([ [dx_dt[i], dy_dt[i]] for i in range(dx_dt.size)])
ds_dt = np.sqrt(dx_dt * dx_dt + dy_dt * dy_dt)
tangent = np.array([1/ds_dt] * 2).transpose() * velocity
tangent_x = tangent[:, 0]
tangent_y = tangent[:, 1]
deriv_tangent_x = np.gradient(tangent_x)
deriv_tangent_y = np.gradient(tangent_y)
dT_dt = np.array([ [deriv_tangent_x[i], deriv_tangent_y[i]] for i in range(deriv_tangent_x.size)])
length_dT_dt = np.sqrt(deriv_tangent_x * deriv_tangent_x + deriv_tangent_y * deriv_tangent_y)
normal = np.array([1/length_dT_dt] * 2).transpose() * dT_dt
d2s_dt2 = np.gradient(ds_dt)
d2x_dt2 = np.gradient(dx_dt)
d2y_dt2 = np.gradient(dy_dt)
curvature = np.abs(d2x_dt2 * dy_dt - dx_dt * d2y_dt2) / (dx_dt * dx_dt + dy_dt * dy_dt)**1.5
t_component = np.array([d2s_dt2] * 2).transpose()
n_component = np.array([curvature * ds_dt * ds_dt] * 2).transpose()
acceleration = t_component * tangent + n_component * normal
sub_curvature.append(curvature)
以上是我使用数据创建的一些图表。如您所见,第一个没有真正的弯曲,但后两个有一个大弯曲点。我该如何确定这个区域?计算单个点的曲率是否正确,或者我应该查看点滑动窗口上的曲率?谢谢!
解决方案
如果我们假设“曲率”是指圆形曲率,那么您将需要一个超过 3 个点的滑动窗口(因为 3 个点确定一个圆)。
对于任意三个点(a,b,c)
,曲率都是2 * |(a-b) x (b-c)| / (|a-b| * |b-c| * |c-b|)
。
我们可以得到a-b
和b-c
从
ab = smallest_5[1:] - smallest_5[:-1]
并a-c
来自:
ac = smallest_5[2:] - smallest_5[:-2]
那么平方曲率是:
curv_sq = 4 * (np.cross(ab[1:], ab[:-1])**2).sum() / ((ab[1:]**2).sum() * (ab[:-1]**2).sum() * (ac**2).sum())
由于我们只是在寻找最大曲率,因此我们实际上不必取其平方根。我们可以找到具有最大曲率的点的索引
max_curv_index = np.argmax(curv_sq)
推荐阅读
- html - 当使用 aqueduct 时,oauth 适合授权访问 html 页面
- ruby-on-rails - Rails 重定向 flash[:notice] 在不应该的情况下持续存在
- java - 在java中使用堆栈解决n-Queen问题
- typescript - 打字稿动态创建具有嵌套结构的接口
- c# - 释放按钮后重置浮点值
- laravel - 如何在 Laravel 中添加视频而不存储到数据库中
- python - 执行速度优化功能
- quasar - Quasar QTable 单击可单击行上的操作按钮
- amazon-web-services - Cloud Formation:S3 存储桶和 Lambda 的独立 cloudformation 模板
- c# - C# 将嵌套列表展平为不同对象的列表以在数据网格中显示