import pygame import math class Kuppel: def __init__(self, radius, num_tags): self.radius = radius self.tags = [i for i in range(num_tags)] # NFC-Tag-IDs self.position = 0 # Aktuelle Drehposition in Grad def drehe(self, winkel): self.position = (self.position + winkel) % 360 def lies_tag(self): # Simuliert das Lesen des NFC-Tags an der aktuellen Position tag_index = int((self.position / 360) * len(self.tags)) % len(self.tags) return self.tags[tag_index] class Teleskop: def __init__(self): self.winkel = 0 # Aktuelle Ausrichtung in Grad def setze_winkel(self, winkel): self.winkel = winkel class Controller: def __init__(self, kuppel, teleskop, spalt_groesse, drehgeschwindigkeit=1.5): self.kuppel = kuppel self.teleskop = teleskop self.spalt_groesse = spalt_groesse # in Grad self.drehgeschwindigkeit = drehgeschwindigkeit # Grad pro Frame self.kuppel_dreht = False # Flag, ob die Kuppel gerade dreht self.drehrichtung = 0 # 1 für CW, -1 für CCW def aktualisiere_kuppel(self): # Berechne die aktuellen Ränder des Spalts linker_rand = (self.kuppel.position - self.spalt_groesse / 2) % 360 rechter_rand = (self.kuppel.position + self.spalt_groesse / 2) % 360 # Prüfe, ob das Teleskop einen der Ränder erreicht hat if not self.kuppel_dreht: # CW-Bewegung: Teleskop erreicht rechten Rand if (rechter_rand > linker_rand and self.teleskop.winkel >= rechter_rand) or \ (rechter_rand < linker_rand and (self.teleskop.winkel >= rechter_rand or self.teleskop.winkel <= linker_rand)): self.kuppel_dreht = True self.drehrichtung = 1 # CW # CCW-Bewegung: Teleskop erreicht linken Rand elif (rechter_rand > linker_rand and self.teleskop.winkel <= linker_rand) or \ (rechter_rand < linker_rand and self.teleskop.winkel <= linker_rand): self.kuppel_dreht = True self.drehrichtung = -1 # CCW # Wenn die Kuppel dreht: langsam in die Zielrichtung if self.kuppel_dreht: # Drehe die Kuppel in die gewünschte Richtung self.kuppel.position = (self.kuppel.position + self.drehrichtung * self.drehgeschwindigkeit) % 360 # Prüfe, ob das Teleskop jetzt am Zielrand steht linker_rand_aktuell = (self.kuppel.position - self.spalt_groesse / 2) % 360 rechter_rand_aktuell = (self.kuppel.position + self.spalt_groesse / 2) % 360 if self.drehrichtung == 1: # CW: Ziel ist linker Rand if abs((self.teleskop.winkel - linker_rand_aktuell) % 360) < 1: # Toleranz von 1° self.kuppel_dreht = False else: # CCW: Ziel ist rechter Rand if abs((self.teleskop.winkel - rechter_rand_aktuell) % 360) < 1: # Toleranz von 1° self.kuppel_dreht = False # Grafik mit Pygame pygame.init() screen = pygame.display.set_mode((800, 600)) clock = pygame.time.Clock() kuppel = Kuppel(200, 36) teleskop = Teleskop() spalt_groesse = 30 # Spaltbreite in Grad controller = Controller(kuppel, teleskop, spalt_groesse, drehgeschwindigkeit=1.5) # Spaltgröße in Grad spalt_dicke = 10 # Dicke des Bogens in Pixel running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: # CCW teleskop.setze_winkel((teleskop.winkel - 2) % 360) elif event.key == pygame.K_RIGHT: # CW teleskop.setze_winkel((teleskop.winkel + 2) % 360) controller.aktualisiere_kuppel() tag = kuppel.lies_tag() # Zeichnen screen.fill((0, 0, 0)) # Kuppel zeichnen pygame.draw.circle(screen, (50, 50, 50), (400, 300), kuppel.radius) # Kuppelspalt als roten Bogen zeichnen spalt_mitte = math.radians(kuppel.position) spalt_halb = math.radians(spalt_groesse / 2) # Bogen als Serie von kurzen Linien zeichnen for i in range(-spalt_groesse//2, spalt_groesse//2): winkel = spalt_mitte + math.radians(i) start_x = 400 + kuppel.radius * math.cos(winkel) start_y = 300 + kuppel.radius * math.sin(winkel) end_x = 400 + (kuppel.radius + spalt_dicke) * math.cos(winkel) end_y = 300 + (kuppel.radius + spalt_dicke) * math.sin(winkel) pygame.draw.line(screen, (255, 0, 0), (start_x, start_y), (end_x, end_y), 2) # Teleskoprichtung zeichnen teleskop_winkel = math.radians(teleskop.winkel) teleskop_x = 400 + kuppel.radius * 1.5 * math.cos(teleskop_winkel) teleskop_y = 300 + kuppel.radius * 1.5 * math.sin(teleskop_winkel) pygame.draw.line(screen, (0, 255, 0), (400, 300), (teleskop_x, teleskop_y), 3) # Tag-ID anzeigen font = pygame.font.SysFont(None, 36) text = font.render(f"Tag: {tag}", True, (255, 255, 255)) screen.blit(text, (10, 10)) pygame.display.flip() clock.tick(30) pygame.quit()