Я использую scipy для построения двумерного сплайна кривой (аналогично эллипсу) с splprep
и splev
.Цель состоит в том, чтобы сгладить точки.
Проблема в том, что точки, которые я пытаюсь сгладить, неравномерно распределены по траектории, и когда я пытаюсь оценить сплайн, я получу неравномерное распределение, но яхотел бы иметь равномерно распределенные точки на сплайне.
Вот пример, показывающий, как выглядят мои данные, и аналогичный результат (в моем случае этот эффект, на самом деле, гораздо более очевиден):
t = np.r_[0:2*np.pi:100.j, 0.142:np.pi+0.1:100j, 0.07+np.pi/2:0.23+np.pi:200j]
t = np.random.normal(t, 0.01)
t = np.unique(t)
# plt.plot(t)
r = np.asarray([1.0, 1.01] * (len(t) // 2)) # np.random.normal() # 1, 0.005, size=len(t))
xy = np.asarray([np.cos(t) * r, np.sin(t) * r]).T
# plt.plot(*xy.T, '.')
# plt.axis('equal')
tck, _ = splprep(xy.T, s=0, per=True)
xi, yi = splev(np.linspace(0, 1, 200), tck)
plt.subplots(figsize=(10, 10))
plt.plot(xi, yi, '.')
plt.axis('equal')
Как видно из графика ниже, есть одна область, которая является более плотной из точек: я хотел бы избежать этого эффекта и иметь равномерно распределенные точки (даже лучше, если они расположены с фиксированным углом относительнок центроиду, например, 1 балл каждые 0,5 градуса).
Я думаю, что причина этого заключается в том, что точки приводят к «зубчатому» шаблону вплотная область: см., например, этот график, показывающий, как точки меняются по частоте в верхней части круга.
Я думаю, что это связано счасау u
вычисляется в splprep
( см. документ) , и я думаю, что я мог бы решить эту проблему, настроив параметр u
, но я не знаю, как: способ вычисленияочевидно, сейчас все в порядке, и я не могу придумать лучшую стратегию:
v = [0]
for i in range(1, len(xy)):
vi = v[i - 1] + sum((xy[i] - xy[i - 1]) ** 2) ** 0.5
v.append(vi)
u = [v[i] / v[-1] for i in range(1, len(xy))]
Учитывая, что использование сплайна - это метод, который я пытаюсь использовать для удаления лишних точекиз набора данных (xy
) единственная идея, которая у меня была, - это каким-то образом пересчитать u
, чтобы получить желаемый эффект, но я не знаю, как.
Как мне сгладить процесс создания данныхВы уверены, что оцененные точки на сплайне находятся примерно на одном и том же расстоянии друг от друга?
Редактировать
Я понял, что мне нужно установить u
как угол каждой точки (разделенныйна 2pi, чтобы нормализовать в пределах 0 и 1).Я пробовал, и точки выглядят равномерно, но по некоторым причинам я получаю некоторые выбросы
uu = t / (2 * np.pi) # u1# 2
tck, _ = splprep(xy.T, u=uu, s=0, per=True)
xi, yi = splev(np.linspace(0, 1, 200), tck)
plt.subplots(figsize=(10, 10))
plt.plot(xi, yi)#, '.')
plt.axis('equal')
Проблема в том, что я не могу понять, гдеони приходятЯ подозреваю, что это зависит от того, как рассчитывается сплайн, но не могу понять, как решить эту проблему.Единственное решение, которое я могу использовать прямо сейчас, - это использовать сглаживание, но это очень метод проб и ошибок, который я бы предпочел не применять.