如何在Java指向的方向上移动矢量图形

时间:2013-06-06 20:21:30

标签: java vector-graphics

经过与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));
    }

1 个答案:

答案 0 :(得分:1)

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

由于你说90度是“正确的”,我假设你正在使用顺时针轴承,0度为“向上”。

不是操纵角度从0度的笛卡尔惯例转换为正确然后顺时针旋转,而是简单地翻转你为每个轴调用的三角函数。

与大多数其他图形系统一样,

Graphics2D在向右移动时使用增加的X坐标,因此:

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

你应该能够轻易地看到这会给delta_x = 1.0 90度,delta_x = -1.0给270度。

Graphics2D Y坐标向下移动(即[0, 0]位于左上角),所以请使用:

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

delta_y = -1.0提供0度,将delta_y = 1.0提供180度。

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