我正试图在画布上画一个圆圈。我的算法的伪代码看起来像
double R = 1.0;
// Draw 11 points, lying on the circle with the radius of 1
// and angle from 0 to 90 degrees
for(int i=0; i<=10; i++)
{
drawPoint( R*cos(PI*i/20), R*sin(PI*i/20) );
}
// Draw a circle with center at the (0; 0) and with the radius of 1
drawCircle(0, 0, R);
这就是我所拥有的:
看起来不错,但有一个问题。当我增加半径时,只有角度为0,45和90的点位于圆上。
它看起来像72度:
developer.android.com 上没有关于drawCircle方法准确性的任何信息。 我猜它是基于角度为0,45,90的点的值绘制的,并且非常近似地计算其他位置的线。
我知道,我可以按照我想要的方式绘制圆圈,如果我将它绘制成具有微小步长的折线,但它会很慢。
所以我想知道 - 有没有方法在Android中绘制精确的圆圈?
UPD 1:
如何绘制积分:
int x, y;
x = getPixelX(point.getX());
y = getPixelY(point.getY());
canvas.drawCircle(x, y, point.radius, paint);
getPixelX 和 getPixelY 在平面上对点进行协调,并根据比例和偏移量在屏幕上返回相同的坐标。
我认为我可以在这些方法中犯一些错误,但它们与线条完美配合。我可以放大线条并且没有错误,所有点都在线上。
UPD 2:
有评论,我可能在计算中犯了错误。我不争辩,也许你是对的。所以这是我的“计算”。
如何放大:
public void mouseWheelMoved(MouseWheelEvent e) {
// zoomQ is 0.9 or 1.1
double zoomQ = (e.getWheelRotation() + 10) / 10.0;
scaleX *= zoomQ;
scaleY *= zoomQ;
}
如何移动飞机:
public void mouseDragged(MouseEvent e) {
centerX -= (e.getX() - lastMouseX)/scaleX;
centerY -= (e.getY() - lastMouseY)/scaleY;
lastMouseX = e.getX();
lastMouseY = e.getY();
}
getPixelX / Y如何运作:
public int getPixelX(double planeX) {
return (int)Math.round( scaleX*(planeX - centerX) + ScreenWidth/2 );
}
public int getPixelY(double planeY) {
return (int)Math.round( scaleY*(planeY - centerY) + ScreenHeight/2 );
}