我需要创建一个任意半径的圆形渐变并将其映射到当前鼠标位置。该项目主要使用OpenGL& PySDL2,但由于遗留原因,还使用aggdraw(Pillow包装PIL)。从广义上讲,SDL2可以与OpenGL和OpenGL进行交互。大多数UI的东西,但是aggdraw确实可以说是绘图。
我已经写了非常基本功能。除了鼠标运动和渐变绘制之间的延迟随梯度半径显着增长(参见我的代码;它显而易见的原因)之外,它的工作原理很有效。
以下代码使用aggdraw; aggdraw对象在别处转换为带有numpy的字节数组,以传递给OpenGL。
我对使用SDL2绘图库的解决方案持开放态度,但我从来没有使用它,并希望被视为我用于此类解决方案的小块。 ;)
特定背景说明
由于我提供的代码非常稀疏,所以我应该提一下,这与我为#1yr(KLIBS)编写的大型模块接口。所述模块在这里主要做了很多不妥之处,但是,下面的函数 插入了很多内部代码。唉,我还没有为模块编写文档,因为它(当前)用于本地环境。
这个函数是,逐字,我的代码;图书馆的其他部分已经过充分测试;其他任何事情的开销都是<10毫秒。
我认为必须能够比屏幕刷新率更快地完成这项任务, 的延迟容忍度约为30ms(项目的背景是视觉认知科学的研究生工作)。我知道这也取决于硬件;一般来说,我们说iMacs的时间不超过3年。
我确信这可以做得更好,但我已经离开了我的深度;我通常使用网络语言(javascript / PHP / html / css)!
def mouse_gradient(radius):
mp = mouse_pos() # custom function, just wraps fetching mouse coords from sdl2
mouse_grad = None
mouse_grad = aggdraw.Draw('RGBA', (radius, radius), (0, 0, 0, 0))
for n in range(radius):
n = float(n)
r = float(radius - n)
opacity = int(( 0.25 * n / radius) * 100)
brush = aggdraw.Brush((255, 0, 0), int(opacity))
tl = (radius - r) // 2 # ie. top-left
br = (radius - r) // 2 + r # ie. bottom-right
mouse_grad.ellipse((tl, tl, br, br), brush)
return mouse_grad # where it is subsequently blit to the screen