Ball-Simulator
/
reflector.py
58 строк · 2.0 Кб
1import math
2
3from vector import Vector
4
5
6class Reflector:
7def __init__(self, ball):
8self.ball = ball
9
10def reflectionWall(self, wall):
11angle = self.convertToRadian(wall)
12
13Yfdop1 = self.ball.vector.x * math.sin(angle)
14# Projection sign
15Yfdop1 = - Yfdop1
16
17Xf = self.ball.vector.x * math.cos(angle) + self.ball.vector.y * math.sin(angle)
18Yf = Yfdop1 + self.ball.vector.y * math.cos(angle)
19
20# Reflection
21Yf = -Yf
22
23Xdop1 = Xf * math.cos(angle)
24Xdop2 = Yf * math.sin(angle)
25
26Ydop1 = Xf * math.sin(angle)
27Ydop2 = Yf * math.cos(angle)
28
29# Projection sign
30Xdop2 = -Xdop2
31self.ball.vector = Vector(Xdop1 + Xdop2, Ydop1 + Ydop2)
32
33def reflectionBall(self, ball):
34copyBall = ball.vector
35self.ball.vector = self.ball.vector - copyBall
36
37angleCollision = math.atan2(ball.coords[1] - self.ball.coords[1], ball.coords[0] - self.ball.coords[0])
38
39speedCollisionAlong = (self.ball.vector.x * math.cos(angleCollision)) \
40+ (self.ball.vector.y * math.sin(angleCollision))
41
42speedCollisionOrt = - self.ball.vector.x * math.sin(angleCollision) \
43+ self.ball.vector.y * math.cos(angleCollision)
44
45newSpeedSelf = (self.ball.mass() - ball.mass()) * speedCollisionAlong / (self.ball.mass() + ball.mass())
46newSpeedOther = 2 * self.ball.mass() * speedCollisionAlong / (self.ball.mass() + ball.mass())
47
48self.ball.vector = Vector(newSpeedSelf * math.cos(angleCollision) - speedCollisionOrt * math.sin(angleCollision),
49newSpeedSelf * math.sin(angleCollision) + speedCollisionOrt * math.cos(angleCollision))
50ball.vector = Vector(newSpeedOther * math.cos(angleCollision),
51newSpeedOther * math.sin(angleCollision))
52
53self.ball.vector = self.ball.vector + copyBall
54ball.vector = ball.vector + copyBall
55
56@staticmethod
57def convertToRadian(a):
58return (a * math.pi) / 180
59