гладкая кривая, как excel python matplotlib [duplicate]

Я думаю, что этот действительный вопрос уже дан здесь. Я тоже попробовал. Моя проблема заключалась в простом редактировании изображений (от DevExpress). и вот как я его обошел:

  • Измените свойство PictureStoreMode в PictureEdit на ByteArray: в настоящее время он установлен на «по умолчанию» enter image description here [/g0]
  • преобразует значение редактирования элемента управления в bye: byte [] newImg = (byte []) pictureEdit1.EditValue;
  • сохранить изображение: this.tbSystemTableAdapter.qry_updateIMGtest (newImg);
]

Еще раз спасибо. Chagbert

6
задан iayork 25 December 2014 в 21:08
поделиться

3 ответа

Алгоритм углового резания Чайкина может быть идеальным для вас. Для заданного многоугольника с вершинами как P0, P1, ... P (N-1) алгоритм угловой резки будет генерировать две новые вершины для каждого отрезка, определенного P (i) и P (i + 1), как

Q (i) = (3/4) P (i) + (1/4) P (i + 1) R (i) = (1/4) P (i) + (3/4 ) P (i + 1)

Итак, ваш новый многоугольник будет иметь 2N вершин. Затем вы можете снова и снова наносить угловую резку на новый многоугольник до тех пор, пока не будет достигнуто требуемое разрешение. Результатом будет многоугольник со многими вершинами, но при отображении они будут выглядеть гладкими. Можно доказать, что полученная кривая, полученная в результате этого подхода к угловому разрезу, будет сходиться к квадратичной кривой B-сплайна. Преимущество такого подхода заключается в том, что результирующая кривая никогда не будет перевыпускать. Следующие снимки дадут вам лучшее представление об этом алгоритме (снимки, взятые из этой ссылки )

Оригинальный многоугольник Original Polygon [/g2]

Применить угловая резка один раз Apply corner cutting once [/g3]

Применить угловую резку еще раз enter image description here [/g4]

Подробнее см. ссылку для алгоритма углового резания Чайкина

11
ответ дан fang 16 August 2018 в 08:03
поделиться

На самом деле вы можете использовать scipy.interpolate.inter1d для этого.

В качестве быстрого примера с квадратом:

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

x = [0, 1, 1, 0, 0]
y = [0, 0, 1, 1, 0]

t = np.arange(len(x))
ti = np.linspace(0, t.max(), 10 * t.size)

xi = interp1d(t, x, kind='cubic')(ti)
yi = interp1d(t, y, kind='cubic')(ti)

fig, ax = plt.subplots()
ax.plot(xi, yi)
ax.plot(x, y)
ax.margins(0.05)
plt.show()

enter image description here [/g0] enter image description here enter image description here / g5]

Однако, как вы можете видеть, это приводит к некоторым проблемам на 0,0.

Это происходит потому, что сегмент сплайна зависит не только от двух точек. Первая и последняя точки не «связаны» в том, как мы интерполировали. Мы можем исправить это путем «заполнения» последовательностей x и y со вторыми и последними и вторыми точками, так что существуют граничные условия «обматывания» для сплайна на конечных точках.

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

x = [0, 1, 1, 0, 0]
y = [0, 0, 1, 1, 0]

# Pad the x and y series so it "wraps around".
# Note that if x and y are numpy arrays, you'll need to
# use np.r_ or np.concatenate instead of addition!
orig_len = len(x)
x = x[-3:-1] + x + x[1:3]
y = y[-3:-1] + y + y[1:3]

t = np.arange(len(x))
ti = np.linspace(2, orig_len + 1, 10 * orig_len)

xi = interp1d(t, x, kind='cubic')(ti)
yi = interp1d(t, y, kind='cubic')(ti)

fig, ax = plt.subplots()
ax.plot(xi, yi)
ax.plot(x, y)
ax.margins(0.05)
plt.show()

enter image description here [/g1]

И просто чтобы показать, как это выглядит с вашими данными:

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

x = [-0.25, -0.625, -0.125, -1.25, -1.125, -1.25,
     0.875, 1.0, 1.0, 0.5, 1.0, 0.625, -0.25]
y = [1.25, 1.375, 1.5, 1.625, 1.75, 1.875, 1.875,
     1.75, 1.625, 1.5, 1.375, 1.25, 1.25]

# Pad the x and y series so it "wraps around".
# Note that if x and y are numpy arrays, you'll need to
# use np.r_ or np.concatenate instead of addition!
orig_len = len(x)
x = x[-3:-1] + x + x[1:3]
y = y[-3:-1] + y + y[1:3]

t = np.arange(len(x))
ti = np.linspace(2, orig_len + 1, 10 * orig_len)

xi = interp1d(t, x, kind='cubic')(ti)
yi = interp1d(t, y, kind='cubic')(ti)

fig, ax = plt.subplots()
ax.plot(xi, yi)
ax.plot(x, y)
ax.margins(0.05)
plt.show()

enter image description here [/g2]

Обратите внимание, что вы получаете довольно «перерегулирование» с помощью этого метода. Это связано с кубической сплайновой интерполяцией. Предложение @ pythonstarter - еще один хороший способ справиться с этим, но кривые безье будут страдать от одной и той же проблемы (они в основном эквивалентны математически, это всего лишь вопрос о том, как определяются контрольные точки). Существует множество других способов обработки сглаживания, включая методы, которые предназначены для сглаживания многоугольника (например, полиномиальная аппроксимация с экспоненциальным ядром (PAEK)). Я никогда не пытался внедрить PAEK, поэтому я не уверен, как это связано. Если вам нужно сделать это более надежно, вы можете попробовать изучить PAEK или другой подобный метод.

7
ответ дан Joe Kington 16 August 2018 в 08:03
поделиться
  • 1
    Это работает и соответствует описанию, поскольку я изначально объяснил это. Оказалось, что то, что я действительно искал, несколько отличалось, и предложение @ fang о алгоритме резки угла Чайкина ближе к тому, что я хотел. – iayork 26 December 2014 в 02:38
  • 2
    Это решило мою проблему с кривой Безье! Я застрял целую ночь, пытаясь разобраться, как заставить циклические граничные условия работать безрезультатно ... – Flying_Banana 2 February 2016 в 05:39

Это скорее комментарий, чем ответ, но, возможно, вы можете попытаться определить этот многоугольник как кривую Безье. Код довольно прост, и я уверен, что вы знакомы с тем, как работают эти кривые. В этом случае эта кривая будет контрольным полигоном. Но это не все идеально: во-первых, это не «сглаженная версия» этого многоугольника, а кривая и другое; чем выше степень кривой, тем меньше она выглядит как контрольный полигон. Я хочу сказать, что, возможно, вам следует попытаться решить эту проблему с помощью математических инструментов вместо того, чтобы сглаживать, а не сглаживать полигон с навыками программирования

3
ответ дан python starter 16 August 2018 в 08:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: