使用 python 高效绘制线条
Efficiently drawing lines using python
我正在尝试使用 python 找出一种在屏幕上绘制线条图案的有效方法。
不久前,我拼凑了一些可以驱动 LAser Spirograph 的代码。这基本上是 3 个圆圈,每个圆圈围绕彼此圆周的移动点旋转。这会产生一系列点,这些点根据每个圆圈旋转的相对速度描绘出各种模式。
所以现在我有一长串 x,y 线,我想将其绘制为一条线,python(目前正在使用 Pygames)中是否有一个函数需要一系列的点并用平滑的曲线将它们连接起来。
例如,假设我有几百点来描述这个 link 中的模式,Python 中是否有 "simple" 方式来将完整模式渲染到屏幕上。我假设这比尝试绘制几千个点中的每一个点以获得一条线的外观要快。
编辑
我一直假设有一种更快的方法可以通过将起点和终点加上半径传递给函数来在屏幕上绘制一个半圆。而不是计算曲线上的 2,000 个点并将它们分别绘制为点或短直线。我还假设绘制一条 100 点长的直线比将同一条线输出为单独的点更快?
免责声明这不是答案
扩展我上面的评论
You don't want the curve. You want to sample the curve with a frequency sufficient to fool perception
看看更密集和更粗糙的采样对屏幕上绘制内容的感知的影响
import numpy as np
import matplotlib.pyplot as plt
t = np.linspace(0, np.pi*3, 301)
x = np.sin(t)
每个点 (t[i], x[i])
代表一个点,这里是正弦曲线中的一个点,在你的应用程序中是更复杂的曲线,所以让我们使用不同的采样步骤绘制这些点,看看采样是否比率会影响您对绘制内容的看法...
for step in (1, 25, 50):
plt.plot(t[::step], x[::step], label='step=%d'%step)
# ^^^^ ^^^^
plt.ylim((-1.05, 1.05))
plt.legend(loc='best')
这给了我
我敢说,如果采样率足够高,绘制的内容 看起来 就像一条曲线,即使它是一系列直线段(当您看t
与 x
).
的另外两个距离
在其他评论中,您被告知可以使用哪个 pygames
函数来执行操作。
我正在尝试使用 python 找出一种在屏幕上绘制线条图案的有效方法。
不久前,我拼凑了一些可以驱动 LAser Spirograph 的代码。这基本上是 3 个圆圈,每个圆圈围绕彼此圆周的移动点旋转。这会产生一系列点,这些点根据每个圆圈旋转的相对速度描绘出各种模式。
所以现在我有一长串 x,y 线,我想将其绘制为一条线,python(目前正在使用 Pygames)中是否有一个函数需要一系列的点并用平滑的曲线将它们连接起来。
例如,假设我有几百点来描述这个 link 中的模式,Python 中是否有 "simple" 方式来将完整模式渲染到屏幕上。我假设这比尝试绘制几千个点中的每一个点以获得一条线的外观要快。
编辑
我一直假设有一种更快的方法可以通过将起点和终点加上半径传递给函数来在屏幕上绘制一个半圆。而不是计算曲线上的 2,000 个点并将它们分别绘制为点或短直线。我还假设绘制一条 100 点长的直线比将同一条线输出为单独的点更快?
免责声明这不是答案
扩展我上面的评论
You don't want the curve. You want to sample the curve with a frequency sufficient to fool perception
看看更密集和更粗糙的采样对屏幕上绘制内容的感知的影响
import numpy as np
import matplotlib.pyplot as plt
t = np.linspace(0, np.pi*3, 301)
x = np.sin(t)
每个点 (t[i], x[i])
代表一个点,这里是正弦曲线中的一个点,在你的应用程序中是更复杂的曲线,所以让我们使用不同的采样步骤绘制这些点,看看采样是否比率会影响您对绘制内容的看法...
for step in (1, 25, 50):
plt.plot(t[::step], x[::step], label='step=%d'%step)
# ^^^^ ^^^^
plt.ylim((-1.05, 1.05))
plt.legend(loc='best')
这给了我
我敢说,如果采样率足够高,绘制的内容 看起来 就像一条曲线,即使它是一系列直线段(当您看t
与 x
).
在其他评论中,您被告知可以使用哪个 pygames
函数来执行操作。