如何使用aggdraw或PySDL2创建循环渐变?

时间:2015-03-05 06:27:30

标签: python sdl-2 pillow pysdl2 aggdraw

问题一般

我需要创建一个任意半径的圆形渐变并将其映射到当前鼠标位置。该项目主要使用OpenGL& PySDL2,但由于遗留原因,还使用aggdrawPillow包装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

0 个答案:

没有答案