【问题标题】:smooth the path of line with python用python平滑线的路径
【发布时间】:2018-11-16 10:18:52
【问题描述】:

我有一组点,它们共同构成一个轨道,其中顺序至关重要。我可以使用线条绘制轨迹,如何在获取新点之后或同时对其进行平滑处理?轨道可能看起来像 1 张图片:

图片一

图二

图三

2图是我最后想要的。我尝试使用scipy.interpolate 进行插值,但它不起作用,因为它需要排序序列(我最后只实现了 pic3)

【问题讨论】:

  • @quant 如我所见,这篇文章使用从左到右方向的线插值,但我的数据(轨道)可能是从左到右/从右到左等,并且有循环。因此,通过插值,它将与我帖子中的 pic2 相同。
  • 在这种情况下,我可能会使用贝塞尔曲线 - 你如何看待这样的事情:efg2.com/Lab/Graphics/Jean-YvesQueinecBezierCurves.htm
  • 是的,它接近答案,但仍然不是我想要的。因为平滑线将远离角落。在我的例子中,平滑线应该接近直线,并且应该尽可能靠近拐角。

标签: python matplotlib


【解决方案1】:

听起来不同的插值方法或方法可能会得到你想要的。三次样条曲线将使您在顶点处获得更直的曲线,正如 scipy 库和此循环点示例集所使用的那样:

import matplotlib.pyplot as plt
import numpy as np
from scipy import interpolate

arr = np.array([[0,0],[2,.5],[2.5, 1.25],[2.6,2.8],[1.3,1.1]])
x, y = zip(*arr)
#in this specific instance, append an endpoint to the starting point to create a closed shape
x = np.r_[x, x[0]]
y = np.r_[y, y[0]]
#create spline function
f, u = interpolate.splprep([x, y], s=0, per=True)
#create interpolated lists of points
xint, yint = interpolate.splev(np.linspace(0, 1, 100), f)
plt.scatter(x, y)
plt.plot(xint, yint)
plt.show()

原来的直线是这样的:

【讨论】:

  • 我们应该如何评估样条曲线是否适合特定值(而不是 100 个均匀间隔的距离值)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
  • 1970-01-01
  • 2015-04-29
  • 1970-01-01
相关资源
最近更新 更多