Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

ws2223:klasse_cubesector_vpython
class Cubesector:
    def __init__(self, center, length):
        self.center = center
        self.length = length
        self.balls = []
 
    def subdivide(self):
        '''
        Teilt den Würfel in 8 neue, gleich große Würfel auf und sammelt diese in einer Liste
        '''
        x, y, z = self.center
        l = self.length / 2
        subcubes_list = [
            Cubesector((x - l / 2, y - l / 2, z - l / 2), l),
            Cubesector((x + l / 2, y - l / 2, z - l / 2), l),
            Cubesector((x - l / 2, y + l / 2, z - l / 2), l),
            Cubesector((x + l / 2, y + l / 2, z - l / 2), l),
            Cubesector((x - l / 2, y - l / 2, z + l / 2), l),
            Cubesector((x + l / 2, y - l / 2, z + l / 2), l),
            Cubesector((x - l / 2, y + l / 2, z + l / 2), l),
            Cubesector((x + l / 2, y + l / 2, z + l / 2), l),
        ]
        return subcubes_list
 
    def clear(self):
        '''löscht die Zuordnung'''
        self.balls.clear()
 
    def get_subcube(self, ball):
        '''
        Vergleicht Position eines Punktes und des Mittelpunktes und gibt einen Integer von 0-7 aus,
        der den zugehörigen subcube repräsentiert
        '''
        x, y, z = ball.pos.value[0], ball.pos.value[1], ball.pos.value[2]
        cx, cy, cz = self.center
 
        # Position des Punktes relativ zum Mittelpunkt des Würfels
        dx, dy, dz = x - cx, y - cy, z - cz
 
        # schwarze Magie (bit-Manipulation) um sich sehr viele if-Abfragen zu sparen
        i = (dx > 0) << 2 | (dy > 0) << 1 | (dz > 0)
 
        return i
 
    def move_ball(self):
        ''' Bewegung und Kollision aller Teilchen'''
        for ball in self.balls:
            ball.handle_border_collision()
            for i in range(self.balls.index(ball) + 1, len(self.balls)):
                ball.handle_collision(self.balls[i])
            ball.move()
ws2223/klasse_cubesector_vpython.txt · Zuletzt geändert: 2023/03/28 17:46 von Jakob_Hoffmann