(我在理论计算机科学论坛上发布了同样的问题,但我怀疑它会得到很多关注,因为它更实用而不是理论)
我正在寻找一种算法,它可以让我生成一条线,就好像它是手工绘制的一样,给定一条样本线。
换句话说,我有一条线(一幅画)需要重新创建几次,就像人类在描图纸上描摹原始画作时所做的那样。
自然地,人类会将绘图与原件非常接近,但会出现一些小错误。所以我想知道是否存在会扭曲绘图的算法,以使结果看起来像一个人制作的追踪原件。
这是用于动画绘图的程序。
(我在理论计算机科学论坛上发布了同样的问题,但我怀疑它会得到很多关注,因为它更实用而不是理论)
我正在寻找一种算法,它可以让我生成一条线,就好像它是手工绘制的一样,给定一条样本线。
换句话说,我有一条线(一幅画)需要重新创建几次,就像人类在描图纸上描摹原始画作时所做的那样。
自然地,人类会将绘图与原件非常接近,但会出现一些小错误。所以我想知道是否存在会扭曲绘图的算法,以使结果看起来像一个人制作的追踪原件。
这是用于动画绘图的程序。
唔。这是一个有趣的问题。我不知道 Perlin 噪音看起来有多逼真,
但在这里我已经包含了布朗运动类型噪声的测试用例(例如,当给定点的直线扰动 = 先前扰动的总和 + 具有零中心和某个 sigma 的高斯随机数时:
图像从左到右显示作为 sigma 函数的绘图(从左到右递减)
这是代码:
import numpy as np, numpy.random
import matplotlib.pyplot as plt
np.random.seed(1)
N = 1000
xs = np.arange(N)
thi = 6
sig = 0.00045
def getrand():
return np.cumsum(np.random.normal(0, sig, size=len(xs)))
# returns the cumulative sum of the set of random
# normally distributed numbers
plt.figure(1)
plt.plot(xs, getrand() * N, linewidth=thi, color='black')
plt.plot(xs, N + getrand() * N, linewidth=thi, color='black')
plt.plot(N + getrand() * N, xs, linewidth=thi, color='black')
plt.plot(getrand() * N, xs, linewidth=thi, color='black')
一种方法是使用 Perlin Noise。您可以在此处的答案中找到有用的链接:Perlin Noise for 1D?