围绕游戏循环中的另一个点旋转一个点(Java)

时间:2015-03-19 10:01:34

标签: java rotation geometry game-loop

我试图创建一个方法,围绕Java中的另一个点旋转一个点,用于我想制作的Asteroids克隆。现在我有2个点实例,称为点和中心。我的方法的代码是这样:

public void Rotate(double angle){
       double a; 
       int x,y,distance;
       distance=30;
       a=Math.atan2((int)(point.getX()-center.getX()),(int)(point.getY()-center.getY()));
       a=a+angle;
       x=(int)(Math.cos(a)*distance);
       y=(int)(Math.sin(a)*distance);
       point.setLocation(x,y);   
}

我的游戏循环代码是:

while (true){
      game.Rotate(10);
      game.repaint();
      Thread.sleep(10);
}

问题是点和中心之间的距离增加或减少,我不知道为什么。有人可以告诉我什么是错的?

编辑[已解决的问题]: 对于任何有兴趣的人,我是如何使用我从以下答案中获得的帮助解决问题的: 首先,旋转功能:

public void Rotate(double angle){
    double x,y;
    double distance=60;
    x=Math.round(center.getX() + (Math.cos(Math.toRadians(angle))*distance));
    y=Math.round(center.getY() + (Math.sin(Math.toRadians(angle))*distance));
    point.setLocation(x,y);
}

然后我做了一个名为move的方法:

public void move(){
    angle+=2;
    if(angle>360){
        angle=0;
    }
    Rotate(angle);
}

这是游戏循环代码:

while(true){
        main.move();
        main.repaint();
        Thread.sleep(10);
    }

再次感谢您的支持。

2 个答案:

答案 0 :(得分:0)

您需要实现2D空间的affine trnsformation。有example如何使用java AffineTransform类创建它。但是如果你不想通过java Graphics这样做,那么算法有三个步骤:

  1. 将对象放在旋转中心:

    X1 = X-的centerX;

    Y1 = Y-centerY;

  2. 以角度α(弧度)旋转对象:

    X2 = X1 * Math.cos(阿尔法)+ Y1 * Math.sin(阿尔法);

    Y2 = X1 * Math.sin(阿尔法)-y1.Math.cos(阿尔法);

  3. 在它的地方返回对象:

    X3 = X2 +的centerX;

    Y3 = Y2 + centerY;

  4. 此操作可以简单地转换为矩阵,然后您可以使用矩阵代数。

答案 1 :(得分:0)

围绕坐标原点旋转点。要围绕中心旋转,请使用

  x=center.getX() + (int)(Math.cos(a)*distance);
  y=center.getY() + (int)(Math.sin(a)*distance);