<p>你的问题是你想直接和x和y一起工作。您调用的插值函数假定x值是按顺序排列的,并且每个<code>x</code>值都有一个唯一的y值。</p>
<p>取而代之的是,你需要建立一个参数化的坐标系(例如顶点的索引)并使用它分别插值x和y。</p>
<p>首先,请考虑以下内容:</p>
<pre><code>import numpy as np
from scipy.interpolate import interp1d # Different interface to the same function
import matplotlib.pyplot as plt
#pts = np.array([...]) # Your points
x, y = pts.T
i = np.arange(len(pts))
# 5x the original number of points
interp_i = np.linspace(0, i.max(), 5 * i.max())
xi = interp1d(i, x, kind='cubic')(interp_i)
yi = interp1d(i, y, kind='cubic')(interp_i)
fig, ax = plt.subplots()
ax.plot(xi, yi)
ax.plot(x, y, 'ko')
plt.show()
</code></pre>
<p><img src="https://i.stack.imgur.com/oaOFN.png" alt="enter image description here"/></p>
<p>我没有关闭多边形。如果愿意,可以将第一个点添加到数组的末尾(例如<code>pts = np.vstack([pts, pts[0]])</code></p>
<p>如果你这样做,你会注意到在多边形闭合的地方有一个不连续点。</p>
<p><img src="https://i.stack.imgur.com/ZkzNL.png" alt="enter image description here"/></p>
<p>这是因为我们的参数化没有考虑到polgyon的关闭。一个快速的解决方法是用“反射”点填充阵列:</p>
<pre><code>import numpy as np
from scipy.interpolate import interp1d
import matplotlib.pyplot as plt
#pts = np.array([...]) # Your points
pad = 3
pts = np.pad(pts, [(pad,pad), (0,0)], mode='wrap')
x, y = pts.T
i = np.arange(0, len(pts))
interp_i = np.linspace(pad, i.max() - pad + 1, 5 * (i.size - 2*pad))
xi = interp1d(i, x, kind='cubic')(interp_i)
yi = interp1d(i, y, kind='cubic')(interp_i)
fig, ax = plt.subplots()
ax.plot(xi, yi)
ax.plot(x, y, 'ko')
plt.show()
</code></pre>
<p><img src="https://i.stack.imgur.com/DOXvx.png" alt="enter image description here"/></p>
<p>或者,可以使用特殊的曲线平滑算法,如峰值或切角算法。</p>