问题描述
我正在尝试使用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的大小都增加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
的圆。
因为它绘制了一个以 像素为中心的圆,而不是 像素之间的圆。
因此绘制的圆的实际半径比传入的半径大一倍,绘制了一个半径为1的圆(在此示例中,数字为坐标):
012
0 X
1XCX
2 X
从技术上讲,它的半径为1.5,但现在以像素(C)为中心。 我猜这是为了允许您准确地放置它,好像它实际上具有2的半径一样,您将无法在像素上放置中心。