【问题标题】:Why is a Pixmap circle off by 1?为什么 Pixmap 圆圈偏离 1?
【发布时间】:2020-09-07 03:21:02
【问题描述】:

我正在尝试使用 Pixmap 绘制一个圆圈。为了使问题更清楚,我将整个 Pixmap 区域填充为白色,然后用不同的颜色绘制圆圈。这是我认为应该可以工作的代码。

我将像素图的宽度/高度设置为圆半径的两倍。

然后我在像素图中间的(半径,半径)处画一个圆。

public static Texture circle(int radius, Color color) {
  Pixmap pixmap = new Pixmap(radius * 2, radius * 2, Pixmap.Format.RGBA4444);
  pixmap.setColor(Color.WHITE);
  pixmap.fill();
  pixmap.setColor(color);
  pixmap.fillCircle(radius, radius, radius);
  Texture texture = new Texture(pixmap);
  pixmap.dispose();
}

不幸的是,Pixmap 切断了右侧和底部的圆圈。例如:

如果我将 Pixmap 的宽度和高度都增加 1,那么它看起来很好:

我可以随意添加一个额外的像素,但我想了解为什么这是必要的。为什么将圆的半径设置为 X 会导致直径实际上是 X + 1?

【问题讨论】:

  • 半径为 0 的结果是什么?没有圆圈还是单点圆圈?
  • 这一像素可能是圆的中心。绘制圆的宽度时,绘制中心像素,左侧radius像素,右侧radius像素,​​共radius * 2 + 1
  • 我很想知道将圆心更改为(radius-0.5, radius-0.5) 是否可以解决您的问题。
  • @Yunnosch - 好问题。我本来期望没有圆圈,但实际上我得到了一个单点圆圈。我想这也回答了这个问题。谢谢,这是一种很好的推理方式。
  • 好的。我希望这也适用于圆的半径,因此只需将宽度和高度加 1 是您能做的最好的事情,更重要的是,现在您明白为什么了!

标签: java libgdx


【解决方案1】:

要获得您想要的结果,圆心的位置必须位于两个像素之间,以便该位置两侧的整数像素数量相似。我的猜测是 Pixmap 代码将像素的位置定义为像素的中心。所以点(radius, radius)比左边更靠近右边,(radius-1, radius-1)比右边更靠近左边。使用此位置定义,您的圆心应位于位置(radius-.5, radius-.5)

如果您必须将圆的中心放在一个像素的中间,那么您可以将位置 (radius, radius) 用于圆并且您需要像素图的宽度和高度成为(2*radius + 1, 2*radius+1)。这样,在圆心的两侧都有相同数量的像素,radius+.5 像素。如果图书馆愿意的话,你可能想画一个半径为radius + .5 的圆。

【讨论】:

    【解决方案2】:

    因为它在一个像素上而不是个像素之间绘制了一个圆。

    所以绘制的圆的实际半径比传入的大一,半径为1的圆被绘制为(本例中数字为坐标):

     012
    0 X
    1XCX
    2 X
    

    从技术上讲,它的半径为 1.5,但现在它以像素 (C) 为中心。 我猜这是为了让你准确地放置它,就好像它实际上有一个半径为 2,你将无法将中心放置在一个像素上。

    【讨论】:

    • 是的。正如我在回答中试图说的那样,要计算出 2 的半径,您希望圆的位置为 (0.5, 0.5)。但是,我不知道图书馆是否会做正确的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-12
    相关资源
    最近更新 更多