java

时间:2015-05-07 18:11:05

标签: java 2d game-physics gravity orbital-mechanics

public void move(){
    double angle;

    for(int i = 0; i < planets.size(); i++){
        if(Math.abs(Math.sqrt(Math.pow(ship.locX - (planets.get(i).locX + planets.get(i).radi), 2) + Math.pow(ship.locY - (planets.get(i).locY + planets.get(i).radi), 2))) < planets.get(i).gravrange){
            //Distance formula between spaceship and planets to determine whether the ship is within the influence of the planet.

            angle = ((Math.atan2((planets.get(i).locX + planets.get(i).radi) - ship.locX, (planets.get(i).locY + planets.get(i).radi) - ship.locY)) / Math.PI) + 1;
             //The problematic math equation.

从0到2生成一个double,0表示ship.locY&lt; planets.get(i).locY&amp;&amp; ship.locX ==(planets.get(i).locX - planets.get(i).radi)。 (当相对X = 0且相对Y <0时)

            if(ship.locX > (planets.get(i).locX + planets.get(i).radi)){xm += Math.cos(angle) * planets.get(i).gravrate;}
            else{xm -= Math.cos(angle) * planets.get(i).gravrate;}
            if(ship.locY > (planets.get(i).locY + planets.get(i).radi)){ym += Math.sin(angle) * planets.get(i).gravrate;}
            else{ym -= Math.sin(angle) * planets.get(i).gravrate;}                          
        }
    }

这使用数据来修改航天器的X和Y速度。

这个等式适用于大多数轨道,但在某些情况下存在一个问题,即航天器经历逆行,使其减速。不久之后它开始被行星体排斥,在短时间内开始再次吸引它。当航天器到达发生这种情况的原始位置时,它开始向与其原始轨道相反的方向移动。

这种情况一直持续到航天器开始波动为止。

有没有办法解决这个问题,或者我只是使用了错误的等式?我现在已经尝试解决这个问题大约两周了。我目前没有接受过物理教育和微积分教育,所以我的理解是有限的。

编辑:评论对我的数学有疑问,所以我试着在这里回答。根据我对atan2的了解,它会从-pi到pi生成一个数字。我将pi除以产生-1到1的数字,然后加1以产生0到2.然后我用这个数作为弧度测量。我对弧度(单位圆)的了解是圆的弧度是0到2pi。

编辑2:以下代码具有非常不同的数学但产生了所需的结果,除了在接近北极和南极时排斥而不是吸引的问题。这个星球。

public void move(){
    double angle;
    double x1, x2, y1, y2;

    for(int i = 0; i < planets.size(); i++){
        x1 = ship.locX;
        y1 = ship.locY;
        x2 = planets.get(i).locX + planets.get(i).radi;
        y2 = planets.get(i).locY + planets.get(i).radi;
        if(Math.abs(Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2))) < planets.get(i).gravrange){
            //Distance formula between spaceship and planets
            angle = (y2 - y1)/(x2 - x1); //Gets slope of line between points.

            if(angle > 0){
                if(y1 > y2){
                    xm += Math.cos(angle) * planets.get(i).gravrate;
                    ym += Math.sin(angle) * planets.get(i).gravrate;
                }else{
                    xm -= Math.cos(angle) * planets.get(i).gravrate;
                    ym -= Math.sin(angle) * planets.get(i).gravrate;
                }
            }
            else{
                if(y1 > y2){
                    xm -= Math.cos(angle) * planets.get(i).gravrate;
                    ym -= Math.sin(angle) * planets.get(i).gravrate;
                }else{
                    xm += Math.cos(angle) * planets.get(i).gravrate;
                    ym += Math.sin(angle) * planets.get(i).gravrate;}
            }   
        }
    }

我写得非常快,看看是否使用线的斜率而不是那个奇怪的atan2方程会有所帮助。显然它确实如此。我还在本节中使代码更具可读性。

1 个答案:

答案 0 :(得分:1)

以下代码修复了我的问题。我像往常一样过于复杂化我的数学方程式。花了我三个星期的谷歌搜索,询问有物理和数学学位的人,并在我找到那个之前阅读Javadocs。事实证明,atan2的工作方式与我认为的工作原理完全不同,而且我使用它的方式也不合适。 解决方案是事先简化atan2方程并删除不必要的添加。

        x1 = ship.locX;
        y1 = ship.locY;
        x2 = planets.get(i).locX + planets.get(i).radi;
        y2 = planets.get(i).locY + planets.get(i).radi;
        if(Math.abs(Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2))) < planets.get(i).gravrange){
            //Distance formula between spaceship and planets

            angle = Math.atan2((y2 - y1),(x2 - x1)); //Converts the difference to polar coordinates and returns theta.

            xm -= Math.cos(angle) * planets.get(i).gravrate; //Converts theta to X/Y
            ym -= Math.sin(angle) * planets.get(i).gravrate; //velocity values.
        }