Files
KuppelSimulation/chatgpt.py
2025-09-20 10:50:33 +02:00

118 lines
3.5 KiB
Python

import pygame
import math
# Observatoriums-Simulation — mit NFC-Tag-Logik
WIDTH, HEIGHT = 700, 700
CENTER = (WIDTH // 2, HEIGHT // 2)
RADIUS = 260
TAG_COUNT = 36 # oder 72
TAG_STEP = 360.0 / TAG_COUNT
# Farben
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (200, 50, 50)
BLUE = (50, 50, 200)
GREEN = (50, 200, 50)
# Anfangswerte
telescope_angle = 0.0 # Grad
dome_angle = 0.0 # Grad (Mittelachse des Spalts)
slot_width = 20.0 # Spaltbreite in Grad
dome_speed = TAG_STEP # maximal ein Tag-Schritt pro Frame
tele_speed = 2.5 # Grad pro Frame (Teleskop-Schritt)
pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Kuppel-Simulation — mit NFC-Tags")
clock = pygame.time.Clock()
font = pygame.font.SysFont(None, 22)
def angle_diff(target, source):
d = (target - source + 180.0) % 360.0 - 180.0
return d
def get_tag_index(angle):
return int(round(angle / TAG_STEP)) % TAG_COUNT
def tag_to_angle(tag_idx):
return (tag_idx % TAG_COUNT) * TAG_STEP
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# Steuerung Teleskop (Pfeiltasten)
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
telescope_angle = (telescope_angle - tele_speed) % 360.0
if keys[pygame.K_RIGHT]:
telescope_angle = (telescope_angle + tele_speed) % 360.0
# --- Kuppelsteuerung mit NFC-Tag-Quantisierung ---
diff = angle_diff(telescope_angle, dome_angle)
half_slot = slot_width / 2.0
move_dir = "STOP"
used_step = 0.0
active_tag = get_tag_index(dome_angle)
if abs(diff) > half_slot + 1e-6:
sign = math.copysign(1.0, diff)
# Schritt = 1 Tag weiter in jeweilige Richtung
new_angle = (dome_angle + sign * TAG_STEP) % 360.0
active_tag = get_tag_index(new_angle)
dome_angle = tag_to_angle(active_tag)
used_step = TAG_STEP
move_dir = "+" if sign > 0 else "-"
# --- Zeichnen ---
screen.fill(WHITE)
# Tags
for i in range(TAG_COUNT):
a = -2.0 * math.pi * i / TAG_COUNT
x = CENTER[0] + math.cos(a) * RADIUS
y = CENTER[1] + math.sin(a) * RADIUS
color = GREEN if i == active_tag else BLACK
pygame.draw.circle(screen, color, (int(x), int(y)), 5 if i == active_tag else 3)
# Spaltbogen
mid_angle = -math.radians(dome_angle)
half = math.radians(slot_width / 2.0)
rect = (CENTER[0] - RADIUS, CENTER[1] - RADIUS, 2 * RADIUS, 2 * RADIUS)
pygame.draw.arc(screen, BLUE, rect, mid_angle - half, mid_angle + half, 12)
# Teleskoplinie
tx = CENTER[0] + math.cos(math.radians(-telescope_angle)) * (RADIUS - 60)
ty = CENTER[1] + math.sin(math.radians(-telescope_angle)) * (RADIUS - 60)
pygame.draw.line(screen, RED, CENTER, (int(tx), int(ty)), 6)
pygame.draw.circle(screen, RED, (int(tx), int(ty)), 8)
# Mittelpunkt
pygame.draw.circle(screen, BLACK, CENTER, 6)
# Debug-Infos
diff_after = angle_diff(telescope_angle, dome_angle)
lines = [
f"Telescope: {telescope_angle:.1f}°",
f"Dome (Spaltmittel): {dome_angle:.1f}°",
f"Diff (tel - dome): {diff_after:.2f}°",
f"Slot width: {slot_width}°",
f"Tags: {TAG_COUNT}",
f"Active Tag: {active_tag}",
f"Move: {move_dir} step: {used_step:.2f}°"
]
for i, txt in enumerate(lines):
surf = font.render(txt, True, BLACK)
screen.blit(surf, (10, 10 + i * 20))
pygame.display.flip()
clock.tick(60)
pygame.quit()