132 lines
5.1 KiB
Python
132 lines
5.1 KiB
Python
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()
|