在java中绘制圆圈手动方式返回奇怪的结果

时间:2016-11-29 19:37:30

标签: java trigonometry

我正在尝试在屏幕中间绘制一个原点的圆圈:

width = canvas.getWidth();
height = canvas.getHeight();

BufferStrategy bufferStrategy = canvas.getBufferStrategy();
if(bufferStrategy == null){//If bufferStrategy is not initialized yet
    canvas.createBufferStrategy(3);
    bufferStrategy = canvas.getBufferStrategy();
}
Graphics graphics = bufferStrategy.getDrawGraphics();

public int[] pixels = new int[width * height];

int radius = height / 6;
for(int theta = 0; theta < 360; theta++){
    double rads = Math.toRadians(theta);

    double x = (width / 2) + (Math.cos(rads) * radius);
    double y = (height / 2) + (Math.sin(rads) * radius);
    pixels[(int)(x + y * width)] = 0xFFFF00FF;
}

BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
image.setRGB(0, 0, width, height, pixels, 0, width);

graphics.drawImage(image, 0, 0, width, height, null);

但是我得到了一个奇怪的结果:

Result

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

在进行数学计算之前将x和y值转换为整数,以确定哪些像素可以更改颜色。

int x = (int) ((width / 2) + (Math.cos(rads) * radius));
int y = (int) ((height / 2) + (Math.sin(rads) * radius));
pixels[(x + y * width)] = 0xFFFF00FF;

内联执行会导致一些舍入错误。

答案 1 :(得分:0)

问题是索引到pixels数组的数学。 x + y * width的公式期望xy的离散值。但是,因为它代表y * width被计算为一个double值,导致像素部分偏离图像的左侧,即使x=0也是如此。

您需要确保将xy规范化为int值,然后才能将其用于索引到pixels的公式中:

pixels[(int)x + (int)y * width] = 0xFFFF00FF;

这给出了预期的结果。