我试图创建一个方法,围绕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);
}
再次感谢您的支持。
答案 0 :(得分:0)
您需要实现2D空间的affine trnsformation。有example如何使用java AffineTransform类创建它。但是如果你不想通过java Graphics这样做,那么算法有三个步骤:
将对象放在旋转中心:
X1 = X-的centerX;
Y1 = Y-centerY;
以角度α(弧度)旋转对象:
X2 = X1 * Math.cos(阿尔法)+ Y1 * Math.sin(阿尔法);
Y2 = X1 * Math.sin(阿尔法)-y1.Math.cos(阿尔法);
在它的地方返回对象:
X3 = X2 +的centerX;
Y3 = Y2 + centerY;
此操作可以简单地转换为矩阵,然后您可以使用矩阵代数。
答案 1 :(得分:0)
围绕坐标原点旋转点。要围绕中心旋转,请使用
x=center.getX() + (int)(Math.cos(a)*distance);
y=center.getY() + (int)(Math.sin(a)*distance);