为什么Pixmap会被1圈掉?

问题描述

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

我将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切断了右侧和底部的圆。例如:

enter image description here

如果我在宽度和高度上将pixmap的大小都增加1,那么看起来不错:

enter image description here

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

解决方法

要获得所需的结果,圆心的位置必须落在两个像素之间,以便该位置的任一侧都有相似数量的整个像素。我的猜测是,Pixmap代码定义了像素的位置以表示像素的中心。因此,点(radius,radius)比左边更靠近右侧,而(radius-1,radius-1)比右边更靠近左侧。使用此位置定义,圆心应位于位置(radius-.5,radius-.5)

如果必须将圆的中心放置在像素的中间,则有意义的是,将位置(radius,radius)用于圆,并且需要宽度和高度Pixmap为(2*radius + 1,2*radius+1)。这样,在圆心的两侧有相同数量的像素radius+.5像素。如果库将采用该半径,则此时您可能希望绘制一个半径为radius + .5的圆。

,

因为它绘制了一个以 像素为中心的圆,而不是 像素之间的圆。

因此绘制的圆的实际半径比传入的半径大一倍,绘制了一个半径为1的圆(在此示例中,数字为坐标):

 012
0 X
1XCX
2 X

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