0

经过与 的长期斗争Graphics2D,我终于能够在小程序中绘制、旋转和移动一个小三角形。现在我想做的是找到三角形指向的角度,然后将它朝那个方向移动。有没有一种方法或算法可以做到这一点?我试过这个:

public double calcAngleMoveX(double angle)
    {
        return (double)(Math.cos(angle*Math.PI/180));
    }
public double calcAngleMoveY(double angle)
    {
        return (double)(Math.sin(angle*Math.PI/180));
    }


ship.incY(ship.calcAngleMoveY(ship.getFaceAngle()-90));
ship.incX(ship.calcAngleMoveX(ship.getFaceAngle()-90));

但它确实做了一些奇怪的事情。谁能帮我解决这个问题?

编辑:这是我的代码paint()

        g2d = (Graphics2D)g;
        AffineTransform identity = new AffineTransform();
        g2d.drawString(Double.toString(ship.getX()),100,100);
        g2d.drawString(Double.toString(ship.getY()),100,120);
        int width = getSize().width;
        int height = getSize().height;
        g2d.setColor(Color.BLACK);
        g2d.fillRect(0,0,width,height);
        g2d.translate(ship.getX(),ship.getY());
        g2d.rotate(Math.toRadians(ship.getFaceAngle()));
        g2d.setColor(Color.RED);
        g2d.fill(shape);

这是我的 keyPressed 方法:

int ke = e.getKeyCode();
        switch(ke)
        {
        case KeyEvent.VK_LEFT:
            ship.setFaceAngle(ship.getFaceAngle()-5);
            break;
        case KeyEvent.VK_RIGHT:
            ship.setFaceAngle(ship.getFaceAngle()+5);
            break;
        case KeyEvent.VK_UP:
            ship.incX(ship.calcAngleMoveX(ship.getFaceAngle())*ship.velocity);
            break;
        case KeyEvent.VK_DOWN:
            ship.incY(ship.calcAngleMoveY(ship.getFaceAngle())*ship.velocity);
            break;
        }
        repaint();

这些是计算方法:

public double calcAngleMoveX(double angle)
    {
        return (double)(Math.sin(angle * Math.PI / 180.0));
    }
    public double calcAngleMoveY(double angle)
    {
        return (double)(-Math.cos(angle * Math.PI / 180.0));
    }
4

1 回答 1

1

船舶运动取决于图形中使用的坐标系。

既然您说 90 度是“正确的”,我将假设您使用的是顺时针轴承,0 度为“向上”。

与其操纵角度以从 0 度正确然后顺时针旋转的笛卡尔约定转换,更容易简单地翻转您为每个轴调用的三角函数。

Graphics2D与大多数其他图形系统一样,在您向右移动时使用增加的 X 坐标,因此:

delta_x = Math.sin(angle * Math.PI / 180.0)

您应该能够很容易地看到这给出delta_x = 1.0了 90 度和delta_x = -1.0270 度。

Graphics2DY 坐标中,您向下移动时会增加(即[0, 0]在左上角),所以使用:

delta_y = -Math.cos(angle * Math.PI / 180.0)

给予delta_y = -1.00 度和delta_y = 1.0180 度。

如果您使用的是[0, 0]左下角的系统,您只需从公式中删除一元减号 ( -) 。delta_y

于 2013-06-06T20:49:22.593 回答