중력 물리엔진 질문에 오류가 발생하는데 이유를 모르겠어요
조회수 196회
import pygame from pygame import * import math class orb: def init(self, mass=1, s0=[0,0], v0=[0,0], a=[0,0], r=10, color=(255, 255, 255), fix = False, F=0, Fx=0, Fy=0): self.a= a self.mass=mass self.r=r self.t = 0 self.v0=v0 self.v=[self.v0[0], self.v0[1]] self.s0=s0 self.s=[self.s0[0], self.s0[1]] self.color=color self.fix = fix self.F=F self.Fx = Fx self.Fy = Fy
def comPos(self, dt = 0.01):
if not self.fix:
self.v[0] = self.v0[0] + self.a[0] * dt
self.v[1] = self.v0[1] + self.a[1] * dt
ds_x = self.v0[0] * dt + (1/2) * self.a[0] * dt**2
ds_y = self.v0[1] * dt + (1/2) * self.a[1] * dt**2
self.s[0] = self.s0[0] + ds_x
self.s[1] = self.s0[1] + ds_y
self.v0[0] = self.v[0]
self.v0[1] = self.v[1]
self.s0[0] = self.s[0]
self.s0[1] = self.s[1]
def comForce(self, other, G = 10000.0, F = 0.0, dist_cr = 0.0, Fx = 0.0, Fy = 0.0):
self.F = G * self.mass * other.mass / ( (self.s[0]- other.s[0])**2 + (self.s[1] - other.s[1])**2 )
self.Fx = (self.F * math.fabs(math.cos(math.atan((other.s[1] - self.s[1]) / (other.s[0] - self.s[0])))))
self.Fy = (self.F * math.fabs(math.sin(math.atan((other.s[1] - self.s[1]) / (other.s[0] - self.s[0])))))
if ((other.s[0] - self.s[0])**2 + (other.s[1] - self.s[1])**2)**(1/2) >= dist_cr:
self.a[0] = (( (other.s[0] - self.s[0]) / math.fabs(other.s[0] - self.s[0])) * self.Fx / self.mass)
if other.s[1] - self.s[1] == 0:
self.a[1] = 0
else:
self.a[1] = (( (other.s[1] - self.s[1]) / math.fabs(other.s[1] - self.s[1])) * self.Fy / self.mass)
def a_reset(self):
self.a=[0, 0]
screen = pygame.display.set_mode((800, 600)) clock = pygame.time.Clock() earth = orb(s0=[150, 300], v0=[0,60], r=10, mass= 3) sun = orb(s0=[400, 300], r=70, color = [255, 0, 0], fix=True, mass=100) orb = [sun, earth]
running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False screen.fill((0, 0, 0)) pygame.draw.circle(screen, earth.color, earth.s, earth.r, 0) pygame.draw.circle(screen, sun.color, sun.s, sun.r, 0) earth.comForce(sun) earth.comPos()
pygame.display.update()
clock.tick(720)
이 파이썬 코드를 작동시키면 흰 공이 빨간 공 주위를 돌게 되는데 시간이 지날수록 점점 도는 궤도가 달라져요. 그런데 원래는 그러면 안 되는데 변하는 이유를 도저히 모르겠어요.
댓글 입력