Одновременное вращение нескольких объектов с разной скоростью в VPython

Я практикую кодирование для физики, и я немного застрял в следующей проблеме:

«Используя средства, предоставляемые визуальным пакетом, создайте анимацию солнечной системы, которая показывает… Солнце и планеты в виде сфер в соответствующих положениях и с размерами, пропорциональными их фактическим размерам… и движение планет по мере их движения. вокруг Солнца (заставляя сферы планет двигаться)».

Предоставляется таблица, в которой указаны радиусы 6 самых внутренних планет и Солнца, а также радиусы орбит планет и периоды орбит (приблизительно круговые).

Я смог нормально выполнить первую часть, создав несколько массивов со значениями, указанными в таблице (плюс выбрав константу, чтобы планеты были видны в заданном масштабе) и создав массив сфер.

Это часть движения, на которой я зациклен. Я могу заставить все планеты вращаться с одинаковой угловой скоростью одновременно. Или я могу заставить все планеты вращаться с разной скоростью (пропорционально заданным периодам), но только по одной. Есть ли способ сделать анимацию одновременной в VPython? Я использую VPython 6.11 и Python 2.7.13. Код ниже (это версия, которая запускает их последовательно с разной скоростью).

from visual import sphere,rate,color
from math import cos,sin,pi
from numpy import arange,array,empty

#Sun
s0 = sphere(radius=45e6,pos=[0,0,0],color=color.yellow)

#Given Data
r = array([57.9e6,108.2e6,149.6e6,227.9e6,778.5e6,1433.4e6],int)
r_plan = array([2440,6052,6371,3386,69173,57316],int)
r_plan = r_plan*3000 #adjusting scale
period = array([88.0,224.7,365.3,687.0,4331.6,10759.2],float)
period = (88.0/period)*.8 #adjusting scale
s = empty(6,sphere)

#Creating the planets
for n in range(6):
    s[n] = sphere(radius=r_plan[n],pos=[r[n],0])

#Prettifying the different planets
s[0].color = color.magenta
s[2].color = color.green
s[3].color = color.red
s[4].color = color.cyan
s[5].color = color.blue

#Orbital Motion
for n in range(6):
    m = period[n]
    for theta in arange(0,10*pi,m):
        rate(30)
        x = r[n]*cos(theta)
        y = r[n]*sin(theta)
        s[n].pos = [x,y]

Понятно! Для будущих читателей мой последний код теперь выглядит так:

#Orbital Motion
for frame in range(1000):
    for n in range(6):
        theta = period[n] * frame
        rate(60)
        x = r[n]*cos(theta)
        y = r[n]*sin(theta)
        s[n].pos = [x,y]

person Nora Bailey    schedule 25.07.2017    source источник


Ответы (1)


Что-то вроде этого:

for frame in range(1000):
    for n in range(6):
        theta = angular_speed[n] * frame
        ...
person Alex Hall    schedule 25.07.2017
comment
Спасибо, это сработало! Я закончил с:'for frame in range(1000): for n in range(6): theta = period[n] * frame rate(60) x = r[n]*cos(theta) y = r[n]*sin(theta) s[n].pos = [x,y] - person Nora Bailey; 25.07.2017