Initial commit: Moon project setup
This commit is contained in:
commit
a2b388ed54
8
.gitignore
vendored
Normal file
8
.gitignore
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
__pycache__/
|
||||||
|
.venv/
|
||||||
|
*.pyc
|
||||||
|
*.pyo
|
||||||
|
*.log
|
||||||
|
.vscode/
|
||||||
|
.idea/
|
||||||
|
|
||||||
40
Matrixmultiplikation.py
Normal file
40
Matrixmultiplikation.py
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
from typing import List
|
||||||
|
import math
|
||||||
|
|
||||||
|
def matmul(mat_a: List[List[float]], mat_b: List[List[float]]) -> List[List[float]]:
|
||||||
|
m, n = len(mat_a), len(mat_a[0])
|
||||||
|
n2, p = len(mat_b), len(mat_b[0])
|
||||||
|
|
||||||
|
# Dimension prüfen: Spaltenzahl von A == Zeilenzahl von B
|
||||||
|
if n != n2:
|
||||||
|
raise ValueError('Matrix dimensions do not match')
|
||||||
|
|
||||||
|
result = []
|
||||||
|
for i in range(m): # Zeilen von A
|
||||||
|
line = []
|
||||||
|
for j in range(p): # Spalten von B
|
||||||
|
s = 0.0
|
||||||
|
for k in range(n): # Spalten von A / Zeilen von B
|
||||||
|
s += mat_a[i][k] * mat_b[k][j] # <--- wichtig: b[k][j]
|
||||||
|
line.append(s)
|
||||||
|
result.append(line)
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
matrix_a = [
|
||||||
|
[3, 4, -1, 4],
|
||||||
|
[-2, 2, 5, 1]
|
||||||
|
]
|
||||||
|
|
||||||
|
matrix_b = [
|
||||||
|
[1, 3, -2],
|
||||||
|
[2, 5, 1],
|
||||||
|
[-1, 4, -4],
|
||||||
|
[2, 3, 6]
|
||||||
|
]
|
||||||
|
|
||||||
|
matrix_c = matmul(matrix_a, matrix_b)
|
||||||
|
print("Ergebnis C = A * B:")
|
||||||
|
for row in matrix_c:
|
||||||
|
print(row)
|
||||||
17
ProductÜA21.10.py
Normal file
17
ProductÜA21.10.py
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
from typing import List
|
||||||
|
import math
|
||||||
|
|
||||||
|
def product(numbers: list[float]) -> float:
|
||||||
|
|
||||||
|
if not numbers:
|
||||||
|
raise ValueError('Die Liste darf nicht leer sein ')
|
||||||
|
result= 1.0
|
||||||
|
for n in numbers:
|
||||||
|
if not isinstance(n, (float, int, str)):
|
||||||
|
raise ValueError('Ungültig')
|
||||||
|
result *= n
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
print(product([2, 3, 4]))
|
||||||
4
README.md
Normal file
4
README.md
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
# Moon – Animation der Mondumlaufbahn
|
||||||
|
Dieses Projekt zeigt eine einfache Pygame-Animation,
|
||||||
|
bei der der Mond die Erde umkreist.
|
||||||
|
Alle mathematischen Berechnungen erfolgen in compute.py.
|
||||||
17
SubstringÜA21.10.py
Normal file
17
SubstringÜA21.10.py
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
def subject(source:str, start_index:int, symbol_count:int=None)-> str:
|
||||||
|
if start_index > len(source):
|
||||||
|
raise ValueError('start_index must be smaller than the length of source')
|
||||||
|
if symbol_count is None:
|
||||||
|
symbol_count = len(source)-start_index
|
||||||
|
if start_index+symbol_count > len(source):
|
||||||
|
raise ValueError('start_index must be smaller than the length of source')
|
||||||
|
if start_index < 0:
|
||||||
|
raise ValueError('start_index must be positive')
|
||||||
|
|
||||||
|
return source[start_index:start_index+symbol_count]
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
original = 'GEEKSFORGEEKS'
|
||||||
|
print(subject(original, 0, 5))
|
||||||
|
print(subject(original, 5))
|
||||||
1
Transponieren einer Matrix.py
Normal file
1
Transponieren einer Matrix.py
Normal file
@ -0,0 +1 @@
|
|||||||
|
from typing import List
|
||||||
43
compute.py
Normal file
43
compute.py
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
from typing import List, Tuple
|
||||||
|
import math
|
||||||
|
|
||||||
|
Matrix = List[List[float]]
|
||||||
|
Vector = Tuple[float, float]
|
||||||
|
|
||||||
|
def transpose(m: Matrix) -> Matrix:
|
||||||
|
if not m or not m[0]:
|
||||||
|
raise ValueError("Matrix must be non-empty")
|
||||||
|
return [list(row) for row in zip(*m)]
|
||||||
|
|
||||||
|
def matmul(a: Matrix, b: Matrix) -> Matrix: #Matrixmultiplikation#
|
||||||
|
if not a or not b or not a[0] or not b[0]:
|
||||||
|
raise ValueError("Matrices must be non-empty")
|
||||||
|
m, n = len(a), len(a[0])
|
||||||
|
n2, p = len(b), len(b[0])
|
||||||
|
if n != n2:
|
||||||
|
raise ValueError("Incompatible shapes")
|
||||||
|
c: Matrix = [[0.0 for _ in range(p)] for _ in range(m)]
|
||||||
|
for i in range(m):
|
||||||
|
for k in range(n):
|
||||||
|
a_ik = float(a[i][k])
|
||||||
|
for j in range(p):
|
||||||
|
c[i][j] += a_ik * float(b[k][j])
|
||||||
|
def rotation_matrix(theta: float) -> Matrix:
|
||||||
|
"""2D-Rotationsmatrix R(theta)."""
|
||||||
|
c, s = math.cos(theta), math.sin(theta)
|
||||||
|
return [[c, -s],
|
||||||
|
[s, c]]
|
||||||
|
|
||||||
|
def apply_mat_to_vec(m: Matrix, v: Vector) -> Vector:
|
||||||
|
"""Wendet eine 2×2-Matrix auf einen 2D-Vektor (als Spaltenvektor) an."""
|
||||||
|
if len(m) != 2 or len(m[0]) != 2:
|
||||||
|
raise ValueError("Matrix must be 2x2 for 2D vector transform")
|
||||||
|
x, y = float(v[0]), float(v[1])
|
||||||
|
x2 = m[0][0]*x + m[0][1]*y
|
||||||
|
y2 = m[1][0]*x + m[1][1]*y
|
||||||
|
return (x2, y2)
|
||||||
|
|
||||||
|
def add(v1: Vector, v2: Vector) -> Vector:
|
||||||
|
"""Vektor-Addition v1 + v2."""
|
||||||
|
return (v1[0] + v2[0], v1[1] + v2[1])
|
||||||
|
|
||||||
39
game.py
Normal file
39
game.py
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
# game.py (nur als Notfall-Mock; bitte euer Original verwenden!)
|
||||||
|
import pygame, time
|
||||||
|
|
||||||
|
class Game:
|
||||||
|
def __init__(self, width=800, height=600, fps=60, title="Game"):
|
||||||
|
pygame.init()
|
||||||
|
self.width, self.height, self.fps = width, height, fps
|
||||||
|
self.screen = pygame.display.set_mode((width, height))
|
||||||
|
pygame.display.set_caption(title)
|
||||||
|
self.clock = pygame.time.Clock()
|
||||||
|
self.running = True
|
||||||
|
|
||||||
|
def update(self, dt: float) -> None:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def draw(self, screen: pygame.Surface) -> None:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
prev = time.perf_counter()
|
||||||
|
while self.running:
|
||||||
|
# Events
|
||||||
|
for event in pygame.event.get():
|
||||||
|
if event.type == pygame.QUIT:
|
||||||
|
self.running = False
|
||||||
|
|
||||||
|
# Delta-Zeit
|
||||||
|
now = time.perf_counter()
|
||||||
|
dt = now - prev
|
||||||
|
prev = now
|
||||||
|
|
||||||
|
# Update + Draw
|
||||||
|
self.update(dt)
|
||||||
|
self.draw(self.screen)
|
||||||
|
|
||||||
|
pygame.display.flip()
|
||||||
|
self.clock.tick(self.fps)
|
||||||
|
|
||||||
|
pygame.quit()
|
||||||
57
moon.py
Normal file
57
moon.py
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
# moon.py
|
||||||
|
import math
|
||||||
|
import pygame
|
||||||
|
from compute import rotation_matrix, apply_mat_to_vec, add
|
||||||
|
from game import Game # <- euer Framework aus Semester 1
|
||||||
|
|
||||||
|
class Moon(Game):
|
||||||
|
"""
|
||||||
|
Animation: Blauer Kreis (Erde) im Ursprung, weißer Kreis (Mond) kreist darum.
|
||||||
|
Mathe (Rotation etc.) liegt komplett in compute.py.
|
||||||
|
"""
|
||||||
|
def __init__(self, width: int = 800, height: int = 600, fps: int = 60):
|
||||||
|
super().__init__(width, height, fps, title="Moon – Orbit Demo")
|
||||||
|
|
||||||
|
# „Ursprung“ = Bildschirmmitte (damit Erde bei (0,0) in unserer Welt liegt)
|
||||||
|
self.center = (width // 2, height // 2)
|
||||||
|
|
||||||
|
# Darstellung
|
||||||
|
self.earth_radius = 32
|
||||||
|
self.moon_radius = 12
|
||||||
|
self.orbit_radius = 160 # Abstand Erde–Mond in Pixeln (optisch ansprechend)
|
||||||
|
|
||||||
|
# Bewegung
|
||||||
|
self.angular_speed = 0.8 # rad/s (Geschwindigkeit der Umlaufbahn)
|
||||||
|
self.angle = 0.0 # aktueller Winkel in rad
|
||||||
|
|
||||||
|
# Farben
|
||||||
|
self.bg_color = (10, 10, 25)
|
||||||
|
self.earth_color = (60, 120, 255) # blau
|
||||||
|
self.moon_color = (245, 245, 245) # weiß
|
||||||
|
|
||||||
|
def update(self, dt: float) -> None:
|
||||||
|
"""Zeitentwicklung: Winkel erhöhen (dt in Sekunden)."""
|
||||||
|
self.angle = (self.angle + self.angular_speed * dt) % (2 * math.pi)
|
||||||
|
|
||||||
|
def draw(self, screen: pygame.Surface) -> None:
|
||||||
|
"""Szene rendern."""
|
||||||
|
screen.fill(self.bg_color)
|
||||||
|
|
||||||
|
# Erde im „Ursprung“ (hier: Bildschirmmitte)
|
||||||
|
pygame.draw.circle(screen, self.earth_color, self.center, self.earth_radius)
|
||||||
|
|
||||||
|
# Startvektor des Mondes (auf x-Achse, Länge = orbit_radius)
|
||||||
|
v0 = (float(self.orbit_radius), 0.0)
|
||||||
|
|
||||||
|
# Rotierter Vektor: v = R(angle) * v0
|
||||||
|
R = rotation_matrix(self.angle)
|
||||||
|
v_rot = apply_mat_to_vec(R, v0)
|
||||||
|
|
||||||
|
# In Bildschirmkoordinaten verschieben: (0,0) Welt -> center Screen
|
||||||
|
pos = add(self.center, v_rot)
|
||||||
|
|
||||||
|
# Mond zeichnen
|
||||||
|
pygame.draw.circle(screen, self.moon_color, (int(pos[0]), int(pos[1])), self.moon_radius)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
Moon().run()
|
||||||
Loading…
x
Reference in New Issue
Block a user