Android画布的drawCircle不是一个圆圈

时间:2014-09-22 06:33:02

标签: java android canvas geometry

我正试图在画布上画一个圆圈。我的算法的伪代码看起来像

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);

这就是我所拥有的:

That's what I've got

看起来不错,但有一个问题。当我增加半径时,只有角度为0,45和90的点位于圆上。

它看起来像72度:

That's how it looks: 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 );
}

0 个答案:

没有答案