Ball-Simulator

Форк
0
/
reflector.py 
58 строк · 2.0 Кб
1
import math
2

3
from vector import Vector
4

5

6
class Reflector:
7
    def __init__(self, ball):
8
        self.ball = ball
9

10
    def reflectionWall(self, wall):
11
        angle = self.convertToRadian(wall)
12

13
        Yfdop1 = self.ball.vector.x * math.sin(angle)
14
        # Projection sign
15
        Yfdop1 = - Yfdop1
16

17
        Xf = self.ball.vector.x * math.cos(angle) + self.ball.vector.y * math.sin(angle)
18
        Yf = Yfdop1 + self.ball.vector.y * math.cos(angle)
19

20
        # Reflection
21
        Yf = -Yf
22

23
        Xdop1 = Xf * math.cos(angle)
24
        Xdop2 = Yf * math.sin(angle)
25

26
        Ydop1 = Xf * math.sin(angle)
27
        Ydop2 = Yf * math.cos(angle)
28

29
        # Projection sign
30
        Xdop2 = -Xdop2
31
        self.ball.vector = Vector(Xdop1 + Xdop2, Ydop1 + Ydop2)
32

33
    def reflectionBall(self, ball):
34
        copyBall = ball.vector
35
        self.ball.vector = self.ball.vector - copyBall
36

37
        angleCollision = math.atan2(ball.coords[1] - self.ball.coords[1], ball.coords[0] - self.ball.coords[0])
38

39
        speedCollisionAlong = (self.ball.vector.x * math.cos(angleCollision)) \
40
                              + (self.ball.vector.y * math.sin(angleCollision))
41

42
        speedCollisionOrt = - self.ball.vector.x * math.sin(angleCollision) \
43
                            + self.ball.vector.y * math.cos(angleCollision)
44

45
        newSpeedSelf = (self.ball.mass() - ball.mass()) * speedCollisionAlong / (self.ball.mass() + ball.mass())
46
        newSpeedOther = 2 * self.ball.mass() * speedCollisionAlong / (self.ball.mass() + ball.mass())
47

48
        self.ball.vector = Vector(newSpeedSelf * math.cos(angleCollision) - speedCollisionOrt * math.sin(angleCollision),
49
                                  newSpeedSelf * math.sin(angleCollision) + speedCollisionOrt * math.cos(angleCollision))
50
        ball.vector = Vector(newSpeedOther * math.cos(angleCollision),
51
                             newSpeedOther * math.sin(angleCollision))
52

53
        self.ball.vector = self.ball.vector + copyBall
54
        ball.vector = ball.vector + copyBall
55

56
    @staticmethod
57
    def convertToRadian(a):
58
        return (a * math.pi) / 180
59

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.