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()