私は単純な重力をシミュレートするためにpygameでコードを作成しようとしてきました。現時点では、太陽の周りを周回している物体(HOM)は1つしかありません。しかし、私が知らない理由から、コードを実行するたびに、HOMは最初の軌道で太陽の周りを回りますが、垂直から135度に達すると離れてを太陽から加速します。重力の問題
これがなぜ起こっているのか、どのように修正できるのか誰にも分かりますか?私はいくつかの変数を印刷して問題を解決しようとしていますが、これまでは運がありませんでした。
コード:
import pygame,sys,time
from math import *
screen=pygame.display.set_mode((800,600))
G = 5
class Object: #Just an object, like a moon or planet
def __init__(self,mass,init_cds,init_vel,orbit_obj='Sun'):
self.mass = mass
self.cds = init_cds
self.velocity = init_vel
self.accel = [0,0]
self.angle = 0
self.orb_obj = orbit_obj
def display(self):
int_cds = (round(self.cds[0]),round(self.cds[1]))#Stores its co-ordinates as floats, has to convert to integers for draw function
pygame.draw.circle(screen,(255,0,0),int_cds,10)
def calc_gravity(self):
if self.orb_obj == 'Sun':
c_x,c_y = 400,300
c_mass = 10000
else:
c_x,c_y = self.orb_obj.cds
c_mass = self.orb_obj.mass
d_x = self.cds[0]-c_x
d_y = self.cds[1]-c_y
dist = sqrt(d_x**2+d_y**2) #Find direct distance
angle = atan(d_x/d_y) #Find angle
print(d_x,d_y)
print(dist,degrees(angle))
if dist == 0:
acc = 0
else:
acc = G*c_mass/(dist**2) #F=G(Mm)/r^2, a=F/m -> a=GM/r^2
print(acc)
acc_x = acc*sin(angle) #Convert acceleration from magnitude+angle -> x and y components
acc_y = acc*cos(angle)
self.accel = [acc_x,acc_y]
print(self.accel)
self.velocity = [self.velocity[0]+self.accel[0],self.velocity[1]+self.accel[1]] #Add acceleration to velocity
print(self.velocity)
self.cds = (self.cds[0]+self.velocity[0],self.cds[1]+self.velocity[1]) #Change co-ordinates by velocity
print(self.cds)
print('-------------------') #For seperating each run of the function when printing variables
HOM = Object(1000000,(400,100),[10,0]) #The problem planet
clock = pygame.time.Clock()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
screen.fill((0,0,0))
pygame.draw.circle(screen,(255,255,0),(400,300),25)
HOM.display()
HOM.calc_gravity()
clock.tick(30)
pygame.display.flip()
出力値のスニペットを投稿できますか? – Petar
確かに、問題が発生している時間から値を隔離しました。 printステートメントは、変数の順序を表示します。 – Oliver
'------------------- 63.844549149787156 21.125165327178536 67.24878486813137 71.6914260165494 11.056078702397329 [10.496403191570936、3.4730960703071965] [-6.9922567082937785、29.012459884108917] (456.8522924414934、350.13762521128746) - ------------------ 56.852292441493375 50.13762521128746 48.59116240316936 8.701759117372143 75.80214124733293 [6.526398145958425、5.755583287313254] [-0.4658585623353533、34.76804317142217] (456.386433879158、384.9056683827096) ---- --------------- ' – Oliver