First Commit

This commit is contained in:
rxf
2025-09-20 10:50:33 +02:00
commit 799f798316
4 changed files with 368 additions and 0 deletions

131
mistral.py Normal file
View File

@@ -0,0 +1,131 @@
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()