【问题标题】:Curve radius in PythonPython中的曲线半径
【发布时间】:2020-05-22 00:09:08
【问题描述】:

我有这条曲线,我想计算下面曲线的半径和中心:

这条曲线的数据https://pastebin.com/FZTi3bAf

到目前为止我的代码:

poly = np.polyfit(df['x'], df['y'],2)
p = np.poly1d(poly)

我需要有新的点 (x, y) 作为这个问题的输入。

【问题讨论】:

  • 您希望计算半径的点是什么?此外,由于曲线不是圆弧(?),半径可能是可变的。这是你所期待的吗?
  • 我需要找到 frenet 框架中的点。首先我需要找到这个半径,即使它是一个变量。这个问题的目标是读取新点 (x,y) 并转换为 frenet 帧。
  • 您面临的实际问题是什么 - 如何计算所有点的“半径”?
  • 是的,计算这条轨迹的半径。

标签: python numpy numeric calculus


【解决方案1】:

您可以从 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()

【讨论】:

    【解决方案2】:

    由于非圆形曲线的半径显然是可变的,因此归结为计算所有点到选定中心点的距离。
    如果这个中心点是您的原点,那么距离就是sqrt(x**2 + y**2),其中x, y 是您数据集中的特定坐标。如果中心在某个点x0, y0,那么它就变成了sqrt((x - x0)**2 + (y - y0)**2)

    所有这些都可以通过将点视为 numpy 数组来非常方便地实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-25
      • 2018-01-15
      • 1970-01-01
      • 2020-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多