【问题标题】:Pygame draw behaviorPygame 绘制行为
【发布时间】:2016-02-09 21:57:01
【问题描述】:

我目前正在设计基本的 pygame 项目。实际上是随机项目,这些只是在普通白天出现在我脑海中的随机想法。其中之一是挂钟。我使用sincos 函数绘制时针、分针等。

作为这些函数的结果,我获得了浮点值。哪个pygame不允许。所以我roundint() 在绘图函数中使用它们之前的所有值。这是有道理的,因为像素不能被部分填充。但是,我认为这会导致画不好。

上图是pygame模块绘制的时钟。如您所见,手柄有些倾斜。不直。

我也在codeskulptor 中实现了这一点。这是一个用于基本游戏(或任何图形)编程的 python2 环境。具有漂亮而清晰的功能,确实非常易于使用。我使用的浮点值不需要转换并直接接受。我不知道它如何处理它,但它显然更好。显然不只是四舍五入和整数(这个词是否存在?)值。让我给你看一下codeskuptor中绘制的时钟:

如您所见,边缘更加平滑。线条的末端不是倾斜的,而是笔直的。这显然是比 pygame 更好的绘图。

但是问题是,codeskuptor 并没有实现比初级知识更难的许多模块和内置功能。它也不支持众所周知的编译器(基本上不是 python 模块)。所以不能在电脑上工作,不能用py2exe、pyinstaller等编译。

所以我不想在 pygame 中实现所有这些,并像在 codeskulptor 中一样获得平滑的结果。也许是处理浮点数以进行绘图的更好方法。非常感谢您在这方面的任何想法或知识。

My code for codeskuptor(Does not show realtime)

My code for pygame

代码没有提供适当的注释,因为它们只是深夜的乐趣而已。我会解释任何必要的部分。

【问题讨论】:

  • “整数”在“四舍五入”这个词中被准确捕捉到了 :) 你试过aaline 函数来绘制抗锯齿线吗?
  • 好吧,我的意思是 round(3.4) 给你 3.0 然后你需要 int() :) 让我检查 aaline
  • 画圆也有点不对劲。就像你画一个粗圆圈一样。图纸上有空点,使它看起来很糟糕。也许是所有 pygame 绘图的事情。
  • 根据the comments on draw_circle 判断,这是 pygame 的一个常见问题,并且它们没有内置的圆抗锯齿功能。 gfxdraw 模块确实有一个aacircle 方法,但它被标记为实验性的..
  • 我猜 aaline 不允许设置宽度(这是一个巨大的缺点)。浏览器的 Codeskulptor 绘图方法在 javascript 中定义。也许 pygame 源代码可以从中受益并实现更好的结果。

标签: python python-2.7 integer pygame


【解决方案1】:

总结上面的 cmets,您在这里注意到的问题是抗锯齿。对于线条,pygame 提供了aaline 函数,可以用来绘制单条线。不幸的是,这不支持变化的厚度。潜在的解决方法可能是绘制一条正确粗细的线并在其任一侧绘制aaline,或使用aapolygon(来自gfxdraw 模块)绘制线。

标准draw 模块不包含抗锯齿圆,但您可以使用gfxdraw 中的另一个函数来绘制抗锯齿圆aacircle

重要的是要注意gfxdraw 模块被标记为“实验性”,因此不能保证这些函数在 pygame 的版本之间保持不变。但是对于您的快速项目,这可能不是问题。

对于 CodeSkulptor,他们在 HTML5 <canvas> 元素上渲染线条,根据 this question,默认情况下已启用抗锯齿功能。

【讨论】:

  • 感谢您的回答。虽然我期待一个涵盖绘图基础知识的全面答案,但 pygame 不支持足够的功能并不是你的错。所以我接受你的回答。
  • 不确定基本面是什么意思?我关注的是您提出的具体问题,而不是一般的计算机图形学。在那里查找“抗锯齿”将是一个好的开始,如果您想了解更多关于具体如何绘制的信息,可能会查看 pygame 源代码。基本上,您必须将函数映射到像素,但不能在半个像素上绘制,因此最终会出现锯齿状边缘或“锯齿”。抗锯齿尝试通过计算边缘像素的一些中间颜色来消除这种情况。
  • 我想我可能会使用 aapolygon 来达到我的目的。
猜你喜欢
  • 1970-01-01
  • 2021-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多