2011-04-19 3 views
0

두 시뮬레이션에서 모두 초보자이므로이 질문은 어리석은 일일 수 있습니다. 그렇다면 언제든지 편집하십시오. 파이썬에서 다음 시나리오를 시뮬레이션하려고합니다. 무작위로 2D 필드에 몇 개의 작은 입자를 고정 된 크기로 배치합니다. 각 입자의 반경은 r입니다. 첫 번째 파티클이 효과 반경 내에서 두 번째 파티클을 가지고 있다면, 두 파티클 모두에 힘을 가해 야합니다. (첫 번째 파티클은 두 번째 파티클에, 두 번째 파티클은 두 번째 파티클에 영향을줍니다) 내 힘 함수는 다음과 같이 정의됩니다.간단한 물리학 관련 시나리오 시뮬레이션

n 현재 시간 단계

f(i,j)_n = (r - |pi_n - pj_n|)((pj_n - pi_n)/|pi_n - pj_n|)

pi_nn|| 절대치 계산을 나타내고 (pj_n - pi_n) 벡터 뺄셈을 나타내는 시간 스텝 i의 위치를 ​​나타낸다.

저에게이 물건을 단순화시키는 도서관이 있는지 궁금합니다. 필요한 것은 기본적으로 다음과 같습니다.

time-step particle position(x,y) 

나에게 어떤 제안이 있으십니까? python library vector 2d 위해 인터넷 검색

+0

만약 당신이 시뮬레이션의 총 초보자라면, 나는 직접 작성하는 것이 좋습니다. 이러한 라이브러리는 초보자에게 다소 혼란 스러울 수 있습니다. 게다가, 당신은 물건을 배우게됩니다. – ktdrv

답변

1

나는 정말로 pymunk 물리학 라이브러리, chipmunk 물리학 라이브러리 용 래퍼를 좋아합니다. 모든

먼저, 라이브러리를 초기화 할 필요가있다 :

import pymunk 
pymunk.init_pymunk() 
space = pymunk.Space() 
space.gravity = (0.0, -100.0) 

는 당신이 Body하고 생성하고자하는 각 입자에 대한 Circle 모양을 만들 필요가 요청한 좋아하는 뭔가를 달성하기 위해. sensor 플래그 True로 설정 beacause를

mass = 1 
radius = 14 
inertia = pymunk.moment_for_circle(mass, 0, radius, (0,0)) 
body = pymunk.Body(mass, inertia) 
x, y = random.randint(0, 200), random.randint(0, 200) 
body.position = x, 550 
shape = pymunk.Circle(body, radius, (0,0)) 
shape.sensor = True 
space.add(body, shape) 

입자가 서로 충돌하지 않을 것이다. 반지름은 이제 다소 영향력있는 영역입니다.space가있다, 물론

space.set_default_collision_handler(near_callback, near_callback, None, None, None) 

:

def near_callback(space, arbiter, *args, **kwargs): 
    body_i = arbiter.shapes[0].body 
    body_j = arbiter.shapes[1].body 

    # calculate the forces force_i and force_j with your formula 
    ... 

    body_i.apply_force(force_i) 
    body_j.apply_force(force_j) 

이 콜백은 space에 설정됩니다

지금, 우리는 영향의 중복 영역이 입자에 대한 콜백 함수를 만들 각 시간 프레임에 대해 "단계별"로 표시하십시오.

space.step(dt) 

다소 이해할 수 있었고 도움이되기를 바랍니다.

+0

나는 이것이 아주 늦었다는 것을 알고 있지만이 질문을 다시 살펴보고 대답을 시도하고있다. 너는 pymunk를 둘러싼 유용한 자료를 가르쳐 주시겠습니까? 'dt = 1'을 설정하고'space.step (dt)'를 거의 100 번했지만 콜백은 호출되지 않았습니다. 나는 사소한 잘못을하고 있을지도 모른다. 내가 연주 할 수있는 실제 예제를 보여 주시겠습니까? – Legend

2

는 '만큼 입자 수가 외설로

(투영 앤 perpendicularization, 정규화, 회전, 스케일링, 등을 포함) 관할 라이브러리 같아 상부 히트로서 http://www.supereffective.org/pages/Vector-2d-Vector-Library 반환 너무 크면 통합 계획과 함께 잘 작동합니다. 예 : >F = m dv/dt

- ->dv/dt = F/m

따라서

dv ~= dt*F/m

F = m a

: 각 입자의 (POS, VEL)의 트랙과 아마 또한 가속 벡터, 사용 유지

->v' - v ~= dt*F/m

->ball.vel += timeStep*sum(ball.force(n) for n in ball.neighbors())/ball.mass

이 아주 나쁜 특성을 가지고 오일러 통합이지만, 게임을 좋아합니다.

관련 문제