我有以下数据点:在这个数据列表中有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)
上面是我用这些数据创建的一些图。如你所见,第一个没有真正的弯曲,但最后两个有一个点,那里有一个大弯曲。我怎样才能确定这个区域?计算单个点的曲率是正确的,还是应该查看点的滑动窗口上的曲率?谢谢你
作为一个想法,您可以找到最小值
y
,它不是数组y维中的第一个或最后一个值。例如:如果我们假设“曲率”是指圆曲率,那么您需要在3个点上使用滑动窗口(因为3个点决定一个圆)
对于任意三个点
(a,b,c)
,曲率为2 * |(a-b) x (b-c)| / (|a-b| * |b-c| * |c-b|)
我们可以从中得到
a-b
和b-c
和
a-c
来自:则平方曲率为:
因为我们只是在寻找一个最大曲率,实际上我们不需要求它的平方根。我们可以找到最大曲率点的指数
相关问题 更多 >
编程相关推荐