如何用平滑曲线将link个点近似分布成一个圆?

How to use a smooth curve to link points approximately distributing in a circle?

我有一组十二个点,它们以 (0, 0) 为中心并大致呈圆形分布,间隔为 30 度,如图所示。 The twelve points

我想使用平滑曲线link(通过)它们,如下图所示(我用手画了红线)。 a hand-drawn curve in red

我想在 python 或 matlab 中制作。我分别尝试了一些上半部分和下半部分的插值方法,想把它们组合成一条完整的曲线。然而,结果总是超调。

感谢您的任何建议!

我认为这里的关键是要注意,您必须将其视为 2d 中的参数化曲线,而不仅仅是 1d 到 2d 的函数。此外,由于它应该类似于圆,因此您需要一种支持周期性边界的插值方法。以下是适用于此的两种方法:

% set up toy data
t = linspace(0, 2*pi, 10);
t = t(1:end-1);
a = 0.08;
b = 0.08;
x = cos(t+a*randn(size(t))) + b*randn(size(t));
y = sin(t+a*randn(size(t))) + b*randn(size(t));
plot(x, y, 'ok');

% fourier interpolation
z = x+1i*y;
y = interpft(z, 200);
hold on
plot(real(y), imag(y), '-.r')

% periodic spline interpolation
z = [z, z(1)];
n = numel(z);
t = 1:n;
pp = csape(t, z, 'periodic');
ts = linspace(1, n, 200);
y = ppval(pp, ts);;
plot(real(y), imag(y), ':b');

感谢@flawr 的建议。根据@flawr的回答,我在python中实现了周期样条插值(仍在努力在python中实现傅立叶插值)。这是代码:

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

# set up toy data
t = np.linspace(0, 2*np.pi, 10)
t = t[0:-1]
a = 0.08
b = 0.08
x = np.cos(t + a * np.random.normal(size=len(t))) + b * np.random.normal(size=len(t))
y = np.sin(t + a * np.random.normal(size=len(t))) + b * np.random.normal(size=len(t))
plt.scatter(x, y)

# periodic spline interpolation
z = []
for idx in range(len(x)):
    z.append(complex(x[idx], y[idx]))
z.append(complex(x[0], y[0]))
len_z = len(z)
t = [i for i in range(len_z)]
cs = CubicSpline(t, z, bc_type='periodic')

xs = np.linspace(0, len_z, 200)
y_new = cs(xs)

plt.plot(y_new.real, y_new.imag)
plt.show()