import pygame import math # Observatoriums-Simulation – Anzeige und Richtung harmonisiert WIDTH, HEIGHT = 700, 700 CENTER = (WIDTH // 2, HEIGHT // 2) RADIUS = 260 TAG_COUNT = 36 # oder 72 # Farben WHITE = (255, 255, 255) BLACK = (0, 0, 0) RED = (200, 50, 50) BLUE = (50, 50, 200) # Anfangswerte telescope_angle = 0.0 # Grad dome_angle = 0.0 # Grad (Mittelachse des Spalts) slot_width = 20.0 # Spaltbreite in Grad dome_speed = 2.5 # Grad pro Frame (maximal) tele_speed = 2.5 # Grad pro Frame (Teleskop-Schritt) pygame.init() screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("Kuppel-Simulation – Anzeige fix") 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 running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # Steuerung Teleskop (Pfeiltasten) - wie in Version 15 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 (wie Version 15 + Spaltlogik) --- half_slot = slot_width / 2.0 # Kuppel folgt dem NEGATIVEN Teleskop-Winkel (funktionierte in Version 15) target_dome = -telescope_angle diff = angle_diff(target_dome, dome_angle) move_dir = "STOP" used_step = 0.0 # NEU: Kuppel bewegt sich nur bei Erreichen des rechten (CW) Randes if diff < -half_slot - 1e-6: # Teleskop hat rechten Rand erreicht # Bewege Kuppel so, dass Teleskop exakt am linken Rand steht # target_dome für linken Rand = -telescope_angle + half_slot target_dome_new = -telescope_angle + half_slot movement_needed = angle_diff(target_dome_new, dome_angle) dome_angle = (dome_angle + movement_needed) % 360.0 if movement_needed > 0: move_dir = "+" else: move_dir = "-" used_step = abs(movement_needed) # --- Zeichnen --- screen.fill(WHITE) # Tags (Bildschirmkonvention: Winkel im Uhrzeigersinn positiv) 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 pygame.draw.circle(screen, BLACK, (int(x), int(y)), 4) # Spaltbogen (Mittelachse wie Teleskop mit -angle) 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 (ebenfalls -angle) 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"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()