Java在2D数组中绘制像素圆

时间:2017-10-19 18:04:06

标签: java android arrays pixel geometry

我有这段代码:

void drawCircle(int x, int y, int r, int color) {
    double PI = 3.1415926535;
    double i, angle, x1, y1;

    for (i = 0; i < 360; i += 1) {
        angle = i;
        x1 = r * cos(angle * PI / 180);
        y1 = r * sin(angle * PI / 180);

        int ElX = (int) (x + x1);
        int ElY = (int) (y + y1);
        myPixelElements[ElX][ElY].setElementColor(color);
    }
}

它几乎可以工作,但由于某种原因它错误地画了2个点:

Circle it draws

2 个答案:

答案 0 :(得分:0)

你在这些行中进行整数除法:

x1 = r * cos(angle * PI / 180);
y1 = r * sin(angle * PI / 180);

这里有几件事情正在发生。首先,整数除法问题(将180更改为180.0以便快速修复)。其次,你每次通过循环进行整个PI / 180.0计算 - 尝试将其拉出到自己的变量中:

double degToRadFactor = 3.1415926535 / 180.0

// ...

x1 = r * cos(angle * degToRadFactor)
y1 = r * sin(angle * degToRadFactor)

答案 1 :(得分:0)

cossin函数会生成从double-1的{​​{1}}个值,当您将+1投射到double时像这样:int,一些数据将不可避免地丢失,因为这样的演员只会将小数部分删掉。相反,我建议使用int ElX = (int) (x + x1)舍入双倍,请查看以下示例:

Math.round

请注意,System.out.println((int) 0.99); // 0 System.out.println((int) -0.99); // 0 System.out.println(Math.round(0.99)); // 1 System.out.println(Math.round(-0.99)); // -1 会返回Math.round,因此仍需将其投放到long

int

输出

int ElX = (int) Math.round(x + x1);
int ElY = (int) Math.round(y + y1);