2015-05-07 2 views
0
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, 0 существо, когда ship.locY < planets.get (я) .locY & & ship.locX == (planets.get (я). locX - planets.get (i) .radi). (При относительном Х = 0 и относительных У < 0.)круговой орбиты Уравнение в Java

  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 бы помочь. Видимо, это было так. Я также сделал код более читаемым в этом разделе.

+0

@ asphere8 - есть очень хороший шанс, что 'atan' вызывает у вас горе. Я боролся с этим в нескольких приложениях. Внимательно прочитайте Javadoc, чтобы убедиться, что вы получаете то, что хотите. Есть два 'atan' метода: один с двумя аргументами, которые вы используете, один с одним. Он может заплатить за переключение. Я попытаюсь найти, что моя проблема, и поделиться им. Это было некоторое время назад. – DSlomer64

+0

Мое расстройство с 'atan' было на самом деле с« аргументом »(триггерным углом) комплексных чисел, но они не далеко от позиций в плоскости. Мне пришлось написать свою собственную функцию, чтобы делать то, что я не мог сделать с любой версией 'atan'. Вы можете найти [эту статью] (http://scipp.ucsc.edu/~haber/ph116A/arg_11.pdf) неуместной, учитывая ваше математическое самоописание, но она описывает результаты возврата типичных функций 'atan'. Обратите внимание на fudging с pi и pi/2 в тексте, и особенно в таблицах на страницах 2 и 3. – DSlomer64

+0

Обратите внимание, что я подпрыгнул до конца, но он основан на опыте, который, скорее всего, будет раздражать других. Я не изучил ваш код.Возможно, что другие аспекты уравнений прикручены. Однако, поскольку код обычно работает, это, по-видимому, гораздо более вероятно, является симптомом неправильного использования atan, чем загрязненное уравнение. – DSlomer64

ответ

0

Следующий код исправил мою проблему. Я смущал свои математические уравнения, как обычно. Взял меня три недели в Гуглинг, спросил людей со степенями по физике и математике и прочитал 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. 
     } 
Смежные вопросы