116 lines
3.7 KiB
Python
116 lines
3.7 KiB
Python
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() |