为什么 Pixmap 的圆差为 1?

Why is a Pixmap circle off by 1?

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

我正在将 Pixmap 的 width/height 设置为圆半径大小的两倍。

然后我在 Pixmap 中间的 (radius, radius) 处画一个圆。

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 的宽度和高度都增加 1,那么它看起来不错:

我可以随意添加一个额外的像素,但我想了解为什么这是必要的。为什么将圆的半径设置为 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 的圆,如果图书馆愿意的话。

因为它画了一个以 on 像素为中心的圆,而不是 between 像素。

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

 012
0 X
1XCX
2 X

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