-
Notifications
You must be signed in to change notification settings - Fork 0
/
collider.py
67 lines (52 loc) · 1.56 KB
/
collider.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# -*- coding: utf-8 -*-from Body import *
import numpy as np
from numpy.linalg import norm
import math
import copy, logging
from Body import Line, Point
def collide(line, point):
l = copy.copy(line)
p = copy.copy(point)
a = np.dot(l.n, l.r) /(norm(l.n) * norm(l.r))
angle = math.acos(a)
t = angle/l.om[2]
#check it!
# print(l.w())
lb = 2 * l.m * p.m * l.st(norm(l.r)) * \
(l.v - p.v) \
/ ((l.m + p.m) * l.st(norm(l.r)) + l.m * p.m * np.dot(np.cross(l.r, l.w()),
np.cross(l.r, l.w())))
l.v += lb/l.m
p.v -= lb/p.m
l.om += lb/l.st(l.r) * np.cross(l.r, l.w())
l.r += l.v * t
p.r += p.v * t
l.rotate(t * l.om[2])
return l, p
def switch_to_masspoint(p, l):
vx = (p.m * p.v[0] + l.m * l.v[0]) / (p.m + l.m)
vy = (p.m * p.v[1] + l.m * l.v[1]) / (p.m + l.m)
v = (p.v * p.m + l.v * l.m) / (p.m + l.m)
x = (p.m * p.r[0] + l.m * l.r[0]) / (p.m + l.m)
y = (p.m * p.r[1] + l.m * l.r[1]) / (p.m + l.m)
pos = (p.r * p.m + l.r * l.m) / (p.m + l.m)
for k in [p, l]:
k.v = k.v - v
k.r = k.r - pos
print('Momentum:', p.v * p.m + l.v * l.m)
print('Masspoint:', p.r * p.m + l.r * l.m)
def summary_momentum(bill, ring):
return bill.v * bill.m + ring.v * ring.m
def run_inertial(bill, ring, it=10):
pos_b = [bill.pos]
rad_b = [np.linalg.norm(bill.pos)]
b = copy.copy(bill)
r = copy.copy(ring)
switch_to_masspoint(b, r)
for i in range(it):
b, r = collide(b, r)
pos_b.append(b.pos)
# rad_b.append(np.linalg.norm(bill.pos))
# print(pos_b[-1])
# print('Radius:', bill.radius())
return pos_b