and in the setup with single list
from visual import * # I HATE this
myuniv = display(range=vector(7*10**12,7*10**12,7*10**12))
G = 6.674*10**-11 #Gravitational constant
# define objects
cosmic_objects = (('sun', {'r':9.9*10**10, 'mass':1.989*10**30, 'pos':vector(0,0,0), 'vel':vector(0,0,0), 'acc':vector(0,0,0), 'color':color.yellow}),
('mercury', {'r':2.44*10**6, 'mass':3.285*10**23,'pos':vector(5.791*10**10,0,0), 'vel': vector(0,4.87*10**4,0), 'acc':vector(0,0,0), 'color':color.red}),
('venus', {'r':6.052*10**6, 'mass':4.867*10**24, 'pos':vector(1.082*10**11,0,0), 'vel':vector(0,3.502*10**4,0), 'acc':vector(0,0,0), 'color':color.yellow}), # I added color here
('earth', {'r':6.371*10**6, 'mass':5.972*10**24, 'pos':vector(1.496*10**11,0,0), 'vel':vector(0,2.98*10**4,0), 'acc':vector(0,0,0), 'color':color.green}),
('mars', {'r':3.39*10**6, 'mass':6.39*10**23, 'pos':vector(2.279*10**11,0,0), 'vel':vector(0,2.401*10**4,0), 'acc':vector(0,0,0), 'color':color.red}),
('jupiter', {'r':6.99*10**7, 'mass':1.898*10**27, 'pos':vector(7.785*10**11,0,0), 'vel':vector(0,1.307*10**4,0), 'acc':vector(0,0,0), 'color':color.blue}),
('saturn', {'r':5.823*10**7, 'mass':5.68*10**26, 'pos':vector(1.429*10**12,0,0), 'vel':vector(0,9.69*10**3,0), 'acc':vector(0,0,0), 'color':color.yellow}),
('uranus', {'r':2.536*10**7, 'mass':8.68*10**25, 'pos':vector(2.871*10**12,0,0), 'vel':vector(0,6.81*10**3,0), 'acc':vector(0,0,0), 'color':color.cyan}),
('neptune', {'r':2.462*10**7, 'mass':1.024*10**26, 'pos':vector(4.498*10**12,0,00), 'vel':vector(0,5.43*10**3,0), 'acc':vector(0,0,0), 'color':color.blue})) # I added color here
objects_sorted_by_mass = sorted(cosmic_objects, key=lambda x:x[1]['mass'], reverse=True) # all objects, sorted by mass descending
#visualize objects
solar_system = {}
for name, obj in cosmic_objects:
solar_system[name] = sphere(pos=obj['pos'], radius=obj['r'], color=obj['color'], make_trail=True)
t = 0.0
dt = 150000
while True:
for i, obj_name, obj in enumerate(objects_sorted_by_mass): # loop over all objects, sorted by mass descending
Fnet = 0
for obj_name2, obj2 in objects_sorted_by_mass[:i]:
rate(1000000)
t=t+dt
r = obj2['pos'] - obj['pos'] # distance between obj2 and obj
Fnet += ((G*obj2['mass']*obj['mass'])/(mag(r)**2))* norm(r) #Calculating the force of gravity from obj2 to the obj
obj['acc'] = Fnet/obj['mass']
obj['vel'] += obj['acc']*dt
obj['pos'] += obj['vel']*dt
solar_system[obj_name].pos = obj['pos']