我有这段代码:
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个点:
答案 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)
cos
和sin
函数会生成从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);