Python 中的曲线半径
Curve radius in Python
我有这条曲线,我想计算下面曲线的半径和中心:
这条曲线的数据https://pastebin.com/FZTi3bAf
到目前为止我的代码:
poly = np.polyfit(df['x'], df['y'],2)
p = np.poly1d(poly)
我需要有新的点 (x, y) 作为这个问题的输入。
由于非圆形曲线的半径显然是可变的,因此归结为计算所有点与选择的中心点的距离。
如果此中心点是您的原点,则距离仅为 sqrt(x**2 + y**2)
,其中 x, y
是数据集中的特定坐标。如果中心在某个点x0, y0
,那么这就变成了sqrt((x - x0)**2 + (y - y0)**2)
。
所有这些都可以通过将点视为 numpy 数组来非常方便地实现。
您可以从 2 个边缘点绘制直线并计算从这条直线的中间到曲线的距离 (dh
)。然后,如果 dl
是边缘点之间的距离,您可以编写 (dl/2)^2 = (2R - dh) * dh
并从该等式中得到 R
。
a = df.to_numpy()
x_middle = (a[0, 0] + a[-1, 0]) / 2
y_middle = (a[0, 1] + a[-1, 1]) / 2
dx = a[-1, 0] - a[0, 0]
dy = a[0, 1] - a[-1, 1]
dl = np.sqrt(dx ** 2 + dy ** 2)
cos = dx / dl
sin = dy / dl
dh = cos * (np.interp(x_middle, a[:, 0], a[:, 1]) - y_middle)
R = dl ** 2 / 8 / dh + dh / 2
x0 = x_middle - (R - dh) * sin
y0 = y_middle - (R - dh) * cos
plt.scatter(a[:, 0], a[:, 1])
circle = plt.Circle((x0, y0), R, fill=False)
plt.gca().add_artist(circle)
plt.show()
我有这条曲线,我想计算下面曲线的半径和中心:
这条曲线的数据https://pastebin.com/FZTi3bAf
到目前为止我的代码:
poly = np.polyfit(df['x'], df['y'],2)
p = np.poly1d(poly)
我需要有新的点 (x, y) 作为这个问题的输入。
由于非圆形曲线的半径显然是可变的,因此归结为计算所有点与选择的中心点的距离。
如果此中心点是您的原点,则距离仅为 sqrt(x**2 + y**2)
,其中 x, y
是数据集中的特定坐标。如果中心在某个点x0, y0
,那么这就变成了sqrt((x - x0)**2 + (y - y0)**2)
。
所有这些都可以通过将点视为 numpy 数组来非常方便地实现。
您可以从 2 个边缘点绘制直线并计算从这条直线的中间到曲线的距离 (dh
)。然后,如果 dl
是边缘点之间的距离,您可以编写 (dl/2)^2 = (2R - dh) * dh
并从该等式中得到 R
。
a = df.to_numpy()
x_middle = (a[0, 0] + a[-1, 0]) / 2
y_middle = (a[0, 1] + a[-1, 1]) / 2
dx = a[-1, 0] - a[0, 0]
dy = a[0, 1] - a[-1, 1]
dl = np.sqrt(dx ** 2 + dy ** 2)
cos = dx / dl
sin = dy / dl
dh = cos * (np.interp(x_middle, a[:, 0], a[:, 1]) - y_middle)
R = dl ** 2 / 8 / dh + dh / 2
x0 = x_middle - (R - dh) * sin
y0 = y_middle - (R - dh) * cos
plt.scatter(a[:, 0], a[:, 1])
circle = plt.Circle((x0, y0), R, fill=False)
plt.gca().add_artist(circle)
plt.show()