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