Как компенсировать ошибку при расчете декартовых координат из полярных координат - PullRequest
1 голос
/ 18 января 2020

В настоящее время я пытаюсь разработать масштабную модель вселенной с использованием pygame. В настоящий момент, когда я вычисляю x, y положения планет относительно Солнца, планеты медленно падают к Солнцу, несмотря на то, что используются только уравнения для положения, основанные на расстоянии и угле pl anet (нет force).

Вот фрагмент кода для вычисления расстояния от данной звезды в настоящее время:

def d_obj(self, reference):

    x_diff_sq = pow(self.x - reference.pos[0], 2)
    y_diff_sq = pow(self.y - reference.pos[1], 2)
    return pow(x_diff_sq + y_diff_sq, 0.5)

И затем я передаю то, что эта функция возвращает в следующую функцию для вычисления положения

def move(self, d):
    self.theta += self.d_theta
    self.x = int(d * math.cos(self.theta)) + total_d/2
    self.y = int(d * math.sin(self.theta)) + total_d/2

total_d / 2 - это смещение координат, а self.d_theta - период вращения для заданного pl anet.

Каждый pl anet имеет жестко заданную начальную позицию и Я использую это, чтобы вычислить разницу между начальным расстоянием и текущим расстоянием для всех планет, для каждого тика очевидно, что pl anet движется примерно на 1 км к Солнцу. Можно ли как-то попытаться компенсировать это?

Я понимаю, что в масштабе вещей, где я рисую вещи в миллионах километров, мне просто любопытно, какая часть этих уравнений вызывает Ошибка. Я пытался использовать оператор «**» над pow и после некоторых онлайн-исследований обнаружил, что pow лучше использовать для операций с числами с плавающей точкой.

Следует также упомянуть, что все расчеты даны в километрах, затем перед рисованием радиус планет и x, y отображаются на экране с установленного расстояния, которое в настоящее время составляет около 4 а.е.

1 Ответ

2 голосов
/ 19 января 2020

Вы пытаетесь перемещать свои планеты по кругу, верно?

В своем коде вы

  1. Используйте x и y для вычисления расстояния,
  2. Используйте delta_theta для вычисления нового тета,
  3. Используйте новые тета и расстояние для вычисления новых х и у.

Вам не нужно делать все это. Вместо этого вы можете сохранить жестко запрограммированное расстояние и просто

  1. Использовать delta_theta для вычисления нового тета,
  2. Использовать новое тета и (известное) расстояние для вычисления x и y для рисования.

Тогда ваше расстояние совсем не сместится.


Примечание: если вы планируете поддерживать движение планет в течение длительного времени, убедитесь, что тета находится в диапазоне от 0 и 2 * пи, или ошибки округления начнут появляться, и ваша точность тета ухудшится.


Вы думаете, это затруднит добавление лун и астероидов.

Не совсем!

Вы можете сделать то же самое для лун, отметив, к какому pl anet они относятся, расстояние до этого pl anet, delta_theta и начальное theta (на основе их родительского pl anet).

Если вы хотите начать делать эллипсы вместо кругов, вы можете изменить свои вычисления (используйте удобные постоянные орбитальные элементы вместо расстояния и delta_theta, которые больше не будут постоянными) на применить Kepler's l aws.

Вы также можете добавить астероиды позже. Вы можете сохранять декартовы положения и скорости астероидов и рассчитывать их движение отдельно, после расчета движения всех «тривиально» движущихся объектов.

...