为什么 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,你将无法将中心放在一个像素上。
我正在尝试使用 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,你将无法将中心放在一个像素上。