2012-11-29 7 views
0

탄성 충돌에서 두 개의 입자가 충돌하는 부분이 코드에 있습니다. 나는 두 입자의 질량과 반지름을 알고 있습니다. 충돌 할 때 두 입자의 중심점을 알고 있습니다. 나는 두 입자의 속도 (방향 포함)를 안다. 알아 내고 싶은 것은 충돌 후 두 입자의 속도 (방향 포함)입니다. 효율적인 방법으로 입자를 계산하려고합니다. 나는 이것이 컴퓨터 프로그래밍보다는 물리학 문제에 더 가깝다는 것을 알고 있지만, 프로그래머는 항상 가장 효율적인 방법으로 뭔가를 찾는 것이 낫다. 저는 C++로 프로그래밍하고 있습니다. 내가 얻을 수있는 도움을 주시면 감사하겠습니다. 올바른 방향으로 나를 가리키고 있습니다. 도와 주셔서 감사합니다!3D 입자 충돌 프로그래밍

+0

I 읽기 [이 (http://www.gamasutra.com/view/feature/131424/pool_hall_lessons_fast_accurate_.php?page=1) 방식 처음으로 나왔을 때, IIRC는 정확하고 유용했습니다. 그러나 오프 주제로 닫습니다. – GManNickG

답변

0

나는 당신에게 이것을 paper Pixar에 의해 게시 할 것을 권합니다. 그것은 강체의 시뮬레이션에 관한 것이며, 몇 가지 코드를 포함하고 있습니다. :-)

Here 3D로 동작하는 C++ 코드도 다운로드 할 수 있습니다.

1

정확한 솔루션은 수학 소프트웨어 (Mathematica, sagemath..etc)로 해결할 수 있습니다. 여기 파이썬 패키지 sympy를 사용했습니다. 이 알고리즘은 Gröbner 기반과 Buchberger 알고리즘을 사용하여 다항식 방정식을 풀 수 있습니다.

탄성 충돌에 대한 방정식은 1) 운동량 보존, 각 1 차원 2) 에너지 보존입니다. 3) 충돌 후 제 입자의 속도가

방정식 이렇게 모양 지정된 단위 벡터의 방향이다

uij : 콜리 전 i 번째의 입자 속도의 j 번째 구성 요소.
vij : 충돌 후 i 번째 입자의 속도 j 번째 성분.
N : 충돌
t 펼쳐진 입자의 속도의 방향의 단위 벡터 포인팅 :
m 충돌 후에 제 입자의 속도의 크기 :

from sympy import * 

u11,u12,u13 = symbols('u11 u12 u13') 
u21,u22,u23 = symbols('u21 u22 u23') 
v11,v12,v13 = symbols('v11 v12 v13') 
v21,v22,v23 = symbols('v21 v22 v23') 
n1,n2,n3,t= symbols('n1 n2 n3 t') 
m1,m2 = symbols('m1 m2') 


p1 = m1*u11 +m2*u21 - m1*v11 -m2*v21 
p2 = m1*u12 +m2*u22 - m1*v12 -m2*v22 
p3 = m1*u13 +m2*u23 - m1*v13 -m2*v23 

e = m1*(u11**2+ u12**2 +u13**2) + m2*(u21**2+ u22**2+ u23**2) \ 
-(m1*(v11**2+ v12**2 +v13**2) + m2*(v21**2+ v22**2+ v23**2)) 

d1 =v11 - t*n1 
d2 =v12 - t*n2 
d3 =v13 - t*n3 


s = solve([p1,p2,p3,e,d1,d2,d3], v11,v12,v13,v21,v22,v23,t, set=True) 

질량 용액이다 : t , V11, V12, V13, V21, V22, V23]

2*sqrt(-m1**2*n1**2*u12**2 - m1**2*n1**2*u13**2 + 2*m1**2*n1*n2*u11*u12 + 2*m1**2*n1*n3*u11*u13 - m1**2*n2**2*u11**2 - m1**2*n2**2*u13**2 + 2*m1**2*n2*n3*u12*u13 - m1**2*n3**2*u11**2 - m1**2*n3**2*u12**2 - 2*m1*m2*n1**2*u12*u22 - 2*m1*m2*n1**2*u13*u23 + 2*m1*m2*n1*n2*u11*u22 + 2*m1*m2*n1*n2*u12*u21 + 2*m1*m2*n1*n3*u11*u23 + 2*m1*m2*n1*n3*u13*u21 - 2*m1*m2*n2**2*u11*u21 - 2*m1*m2*n2**2*u13*u23 + 2*m1*m2*n2*n3*u12*u23 + 2*m1*m2*n2*n3*u13*u22 - 2*m1*m2*n3**2*u11*u21 - 2*m1*m2*n3**2*u12*u22 + m2**2*n1**2*u11**2 - 2*m2**2*n1**2*u11*u21 + m2**2*n1**2*u12**2 - 2*m2**2*n1**2*u12*u22 + m2**2*n1**2*u13**2 - 2*m2**2*n1**2*u13*u23 + m2**2*n1**2*u21**2 + 2*m2**2*n1*n2*u21*u22 + 2*m2**2*n1*n3*u21*u23 + m2**2*n2**2*u11**2 - 2*m2**2*n2**2*u11*u21 + m2**2*n2**2*u12**2 - 2*m2**2*n2**2*u12*u22 + m2**2*n2**2*u13**2 - 2*m2**2*n2**2*u13*u23 + m2**2*n2**2*u22**2 + 2*m2**2*n2*n3*u22*u23 + m2**2*n3**2*u11**2 - 2*m2**2*n3**2*u11*u21 + m2**2*n3**2*u12**2 - 2*m2**2*n3**2*u12*u22 + m2**2*n3**2*u13**2 - 2*m2**2*n3**2*u13*u23 + m2**2*n3**2*u23**2)/(2*m1*n1**2 + 2*m1*n2**2 + 2*m1*n3**2 + 2*m2*n1**2 + 2*m2*n2**2 + 2*m2*n3**2) + (m1*n1*u11 + m1*n2*u12 + m1*n3*u13 + m2*n1*u21 + m2*n2*u22 + m2*n3*u23)/((m1 + m2)*(n1**2 + n2**2 + n3**2)) 


n1*(m1*n1*u11 + m1*n2*u12 + m1*n3*u13 + m2*n1*u21 + m2*n2*u22 + m2*n3*u23 + sqrt(-m1**2*n1**2*u12**2 - m1**2*n1**2*u13**2 + 2*m1**2*n1*n2*u11*u12 + 2*m1**2*n1*n3*u11*u13 - m1**2*n2**2*u11**2 - m1**2*n2**2*u13**2 + 2*m1**2*n2*n3*u12*u13 - m1**2*n3**2*u11**2 - m1**2*n3**2*u12**2 - 2*m1*m2*n1**2*u12*u22 - 2*m1*m2*n1**2*u13*u23 + 2*m1*m2*n1*n2*u11*u22 + 2*m1*m2*n1*n2*u12*u21 + 2*m1*m2*n1*n3*u11*u23 + 2*m1*m2*n1*n3*u13*u21 - 2*m1*m2*n2**2*u11*u21 - 2*m1*m2*n2**2*u13*u23 + 2*m1*m2*n2*n3*u12*u23 + 2*m1*m2*n2*n3*u13*u22 - 2*m1*m2*n3**2*u11*u21 - 2*m1*m2*n3**2*u12*u22 + m2**2*n1**2*u11**2 - 2*m2**2*n1**2*u11*u21 + m2**2*n1**2*u12**2 - 2*m2**2*n1**2*u12*u22 + m2**2*n1**2*u13**2 - 2*m2**2*n1**2*u13*u23 + m2**2*n1**2*u21**2 + 2*m2**2*n1*n2*u21*u22 + 2*m2**2*n1*n3*u21*u23 + m2**2*n2**2*u11**2 - 2*m2**2*n2**2*u11*u21 + m2**2*n2**2*u12**2 - 2*m2**2*n2**2*u12*u22 + m2**2*n2**2*u13**2 - 2*m2**2*n2**2*u13*u23 + m2**2*n2**2*u22**2 + 2*m2**2*n2*n3*u22*u23 + m2**2*n3**2*u11**2 - 2*m2**2*n3**2*u11*u21 + m2**2*n3**2*u12**2 - 2*m2**2*n3**2*u12*u22 + m2**2*n3**2*u13**2 - 2*m2**2*n3**2*u13*u23 + m2**2*n3**2*u23**2))/(m1*n1**2 + m1*n2**2 + m1*n3**2 + m2*n1**2 + m2*n2**2 + m2*n3**2) 


n2*(m1*n1*u11 + m1*n2*u12 + m1*n3*u13 + m2*n1*u21 + m2*n2*u22 + m2*n3*u23 + sqrt(-m1**2*n1**2*u12**2 - m1**2*n1**2*u13**2 + 2*m1**2*n1*n2*u11*u12 + 2*m1**2*n1*n3*u11*u13 - m1**2*n2**2*u11**2 - m1**2*n2**2*u13**2 + 2*m1**2*n2*n3*u12*u13 - m1**2*n3**2*u11**2 - m1**2*n3**2*u12**2 - 2*m1*m2*n1**2*u12*u22 - 2*m1*m2*n1**2*u13*u23 + 2*m1*m2*n1*n2*u11*u22 + 2*m1*m2*n1*n2*u12*u21 + 2*m1*m2*n1*n3*u11*u23 + 2*m1*m2*n1*n3*u13*u21 - 2*m1*m2*n2**2*u11*u21 - 2*m1*m2*n2**2*u13*u23 + 2*m1*m2*n2*n3*u12*u23 + 2*m1*m2*n2*n3*u13*u22 - 2*m1*m2*n3**2*u11*u21 - 2*m1*m2*n3**2*u12*u22 + m2**2*n1**2*u11**2 - 2*m2**2*n1**2*u11*u21 + m2**2*n1**2*u12**2 - 2*m2**2*n1**2*u12*u22 + m2**2*n1**2*u13**2 - 2*m2**2*n1**2*u13*u23 + m2**2*n1**2*u21**2 + 2*m2**2*n1*n2*u21*u22 + 2*m2**2*n1*n3*u21*u23 + m2**2*n2**2*u11**2 - 2*m2**2*n2**2*u11*u21 + m2**2*n2**2*u12**2 - 2*m2**2*n2**2*u12*u22 + m2**2*n2**2*u13**2 - 2*m2**2*n2**2*u13*u23 + m2**2*n2**2*u22**2 + 2*m2**2*n2*n3*u22*u23 + m2**2*n3**2*u11**2 - 2*m2**2*n3**2*u11*u21 + m2**2*n3**2*u12**2 - 2*m2**2*n3**2*u12*u22 + m2**2*n3**2*u13**2 - 2*m2**2*n3**2*u13*u23 + m2**2*n3**2*u23**2))/(m1*n1**2 + m1*n2**2 + m1*n3**2 + m2*n1**2 + m2*n2**2 + m2*n3**2) 


n3*(m1*n1*u11 + m1*n2*u12 + m1*n3*u13 + m2*n1*u21 + m2*n2*u22 + m2*n3*u23 + sqrt(-m1**2*n1**2*u12**2 - m1**2*n1**2*u13**2 + 2*m1**2*n1*n2*u11*u12 + 2*m1**2*n1*n3*u11*u13 - m1**2*n2**2*u11**2 - m1**2*n2**2*u13**2 + 2*m1**2*n2*n3*u12*u13 - m1**2*n3**2*u11**2 - m1**2*n3**2*u12**2 - 2*m1*m2*n1**2*u12*u22 - 2*m1*m2*n1**2*u13*u23 + 2*m1*m2*n1*n2*u11*u22 + 2*m1*m2*n1*n2*u12*u21 + 2*m1*m2*n1*n3*u11*u23 + 2*m1*m2*n1*n3*u13*u21 - 2*m1*m2*n2**2*u11*u21 - 2*m1*m2*n2**2*u13*u23 + 2*m1*m2*n2*n3*u12*u23 + 2*m1*m2*n2*n3*u13*u22 - 2*m1*m2*n3**2*u11*u21 - 2*m1*m2*n3**2*u12*u22 + m2**2*n1**2*u11**2 - 2*m2**2*n1**2*u11*u21 + m2**2*n1**2*u12**2 - 2*m2**2*n1**2*u12*u22 + m2**2*n1**2*u13**2 - 2*m2**2*n1**2*u13*u23 + m2**2*n1**2*u21**2 + 2*m2**2*n1*n2*u21*u22 + 2*m2**2*n1*n3*u21*u23 + m2**2*n2**2*u11**2 - 2*m2**2*n2**2*u11*u21 + m2**2*n2**2*u12**2 - 2*m2**2*n2**2*u12*u22 + m2**2*n2**2*u13**2 - 2*m2**2*n2**2*u13*u23 + m2**2*n2**2*u22**2 + 2*m2**2*n2*n3*u22*u23 + m2**2*n3**2*u11**2 - 2*m2**2*n3**2*u11*u21 + m2**2*n3**2*u12**2 - 2*m2**2*n3**2*u12*u22 + m2**2*n3**2*u13**2 - 2*m2**2*n3**2*u13*u23 + m2**2*n3**2*u23**2))/(m1*n1**2 + m1*n2**2 + m1*n3**2 + m2*n1**2 + m2*n2**2 + m2*n3**2) 


(-m1**2*n1*n2*u12 - m1**2*n1*n3*u13 + m1**2*n2**2*u11 + m1**2*n3**2*u11 + m1*m2*n1**2*u11 - m1*m2*n1*n2*u22 - m1*m2*n1*n3*u23 + m1*m2*n2**2*u11 + m1*m2*n2**2*u21 + m1*m2*n3**2*u11 + m1*m2*n3**2*u21 - m1*n1*sqrt(-m1**2*n1**2*u12**2 - m1**2*n1**2*u13**2 + 2*m1**2*n1*n2*u11*u12 + 2*m1**2*n1*n3*u11*u13 - m1**2*n2**2*u11**2 - m1**2*n2**2*u13**2 + 2*m1**2*n2*n3*u12*u13 - m1**2*n3**2*u11**2 - m1**2*n3**2*u12**2 - 2*m1*m2*n1**2*u12*u22 - 2*m1*m2*n1**2*u13*u23 + 2*m1*m2*n1*n2*u11*u22 + 2*m1*m2*n1*n2*u12*u21 + 2*m1*m2*n1*n3*u11*u23 + 2*m1*m2*n1*n3*u13*u21 - 2*m1*m2*n2**2*u11*u21 - 2*m1*m2*n2**2*u13*u23 + 2*m1*m2*n2*n3*u12*u23 + 2*m1*m2*n2*n3*u13*u22 - 2*m1*m2*n3**2*u11*u21 - 2*m1*m2*n3**2*u12*u22 + m2**2*n1**2*u11**2 - 2*m2**2*n1**2*u11*u21 + m2**2*n1**2*u12**2 - 2*m2**2*n1**2*u12*u22 + m2**2*n1**2*u13**2 - 2*m2**2*n1**2*u13*u23 + m2**2*n1**2*u21**2 + 2*m2**2*n1*n2*u21*u22 + 2*m2**2*n1*n3*u21*u23 + m2**2*n2**2*u11**2 - 2*m2**2*n2**2*u11*u21 + m2**2*n2**2*u12**2 - 2*m2**2*n2**2*u12*u22 + m2**2*n2**2*u13**2 - 2*m2**2*n2**2*u13*u23 + m2**2*n2**2*u22**2 + 2*m2**2*n2*n3*u22*u23 + m2**2*n3**2*u11**2 - 2*m2**2*n3**2*u11*u21 + m2**2*n3**2*u12**2 - 2*m2**2*n3**2*u12*u22 + m2**2*n3**2*u13**2 - 2*m2**2*n3**2*u13*u23 + m2**2*n3**2*u23**2) + m2**2*n1**2*u21 + m2**2*n2**2*u21 + m2**2*n3**2*u21)/(m2*(m1*n1**2 + m1*n2**2 + m1*n3**2 + m2*n1**2 + m2*n2**2 + m2*n3**2)) 


(m1**2*n1**2*u12 - m1**2*n1*n2*u11 - m1**2*n2*n3*u13 + m1**2*n3**2*u12 + m1*m2*n1**2*u12 + m1*m2*n1**2*u22 - m1*m2*n1*n2*u21 + m1*m2*n2**2*u12 - m1*m2*n2*n3*u23 + m1*m2*n3**2*u12 + m1*m2*n3**2*u22 - m1*n2*sqrt(-m1**2*n1**2*u12**2 - m1**2*n1**2*u13**2 + 2*m1**2*n1*n2*u11*u12 + 2*m1**2*n1*n3*u11*u13 - m1**2*n2**2*u11**2 - m1**2*n2**2*u13**2 + 2*m1**2*n2*n3*u12*u13 - m1**2*n3**2*u11**2 - m1**2*n3**2*u12**2 - 2*m1*m2*n1**2*u12*u22 - 2*m1*m2*n1**2*u13*u23 + 2*m1*m2*n1*n2*u11*u22 + 2*m1*m2*n1*n2*u12*u21 + 2*m1*m2*n1*n3*u11*u23 + 2*m1*m2*n1*n3*u13*u21 - 2*m1*m2*n2**2*u11*u21 - 2*m1*m2*n2**2*u13*u23 + 2*m1*m2*n2*n3*u12*u23 + 2*m1*m2*n2*n3*u13*u22 - 2*m1*m2*n3**2*u11*u21 - 2*m1*m2*n3**2*u12*u22 + m2**2*n1**2*u11**2 - 2*m2**2*n1**2*u11*u21 + m2**2*n1**2*u12**2 - 2*m2**2*n1**2*u12*u22 + m2**2*n1**2*u13**2 - 2*m2**2*n1**2*u13*u23 + m2**2*n1**2*u21**2 + 2*m2**2*n1*n2*u21*u22 + 2*m2**2*n1*n3*u21*u23 + m2**2*n2**2*u11**2 - 2*m2**2*n2**2*u11*u21 + m2**2*n2**2*u12**2 - 2*m2**2*n2**2*u12*u22 + m2**2*n2**2*u13**2 - 2*m2**2*n2**2*u13*u23 + m2**2*n2**2*u22**2 + 2*m2**2*n2*n3*u22*u23 + m2**2*n3**2*u11**2 - 2*m2**2*n3**2*u11*u21 + m2**2*n3**2*u12**2 - 2*m2**2*n3**2*u12*u22 + m2**2*n3**2*u13**2 - 2*m2**2*n3**2*u13*u23 + m2**2*n3**2*u23**2) + m2**2*n1**2*u22 + m2**2*n2**2*u22 + m2**2*n3**2*u22)/(m2*(m1*n1**2 + m1*n2**2 + m1*n3**2 + m2*n1**2 + m2*n2**2 + m2*n3**2)) 


(m1**2*n1**2*u13 - m1**2*n1*n3*u11 + m1**2*n2**2*u13 - m1**2*n2*n3*u12 + m1*m2*n1**2*u13 + m1*m2*n1**2*u23 - m1*m2*n1*n3*u21 + m1*m2*n2**2*u13 + m1*m2*n2**2*u23 - m1*m2*n2*n3*u22 + m1*m2*n3**2*u13 - m1*n3*sqrt(-m1**2*n1**2*u12**2 - m1**2*n1**2*u13**2 + 2*m1**2*n1*n2*u11*u12 + 2*m1**2*n1*n3*u11*u13 - m1**2*n2**2*u11**2 - m1**2*n2**2*u13**2 + 2*m1**2*n2*n3*u12*u13 - m1**2*n3**2*u11**2 - m1**2*n3**2*u12**2 - 2*m1*m2*n1**2*u12*u22 - 2*m1*m2*n1**2*u13*u23 + 2*m1*m2*n1*n2*u11*u22 + 2*m1*m2*n1*n2*u12*u21 + 2*m1*m2*n1*n3*u11*u23 + 2*m1*m2*n1*n3*u13*u21 - 2*m1*m2*n2**2*u11*u21 - 2*m1*m2*n2**2*u13*u23 + 2*m1*m2*n2*n3*u12*u23 + 2*m1*m2*n2*n3*u13*u22 - 2*m1*m2*n3**2*u11*u21 - 2*m1*m2*n3**2*u12*u22 + m2**2*n1**2*u11**2 - 2*m2**2*n1**2*u11*u21 + m2**2*n1**2*u12**2 - 2*m2**2*n1**2*u12*u22 + m2**2*n1**2*u13**2 - 2*m2**2*n1**2*u13*u23 + m2**2*n1**2*u21**2 + 2*m2**2*n1*n2*u21*u22 + 2*m2**2*n1*n3*u21*u23 + m2**2*n2**2*u11**2 - 2*m2**2*n2**2*u11*u21 + m2**2*n2**2*u12**2 - 2*m2**2*n2**2*u12*u22 + m2**2*n2**2*u13**2 - 2*m2**2*n2**2*u13*u23 + m2**2*n2**2*u22**2 + 2*m2**2*n2*n3*u22*u23 + m2**2*n3**2*u11**2 - 2*m2**2*n3**2*u11*u21 + m2**2*n3**2*u12**2 - 2*m2**2*n3**2*u12*u22 + m2**2*n3**2*u13**2 - 2*m2**2*n3**2*u13*u23 + m2**2*n3**2*u23**2) + m2**2*n1**2*u23 + m2**2*n2**2*u23 + m2**2*n3**2*u23)/(m2*(m1*n1**2 + m1*n2**2 + m1*n3**2 + m2*n1**2 + m2*n2**2 + m2*n3**2))