# A bolygó tulajdonságainak definiálása
struct Planet:
var name: String
var x: Float64
var y: Float64
var vx: Float64
var vy: Float64
var mass: Float64
var radius: Float64
fn __init__(inout self, name: String, x: Float64, y: Float64, vx: Float64, vy: Float64, mass: Float64, radius: Float64):
self.name = name
self.x = x
self.y = y
self.vx = vx
self.vy = vy
self.mass = mass
self.radius = radius
# Gravitációs erő számítása (G = 1 egyszerűsített értékkel)
fn update_positions(inout planets: List[Planet], dt: Float64):
let G: Float64 = 1.0
for i in range(len(planets)):
var p1 = planets[i]
var fx: Float64 = 0.0
var fy: Float64 = 0.0
for j in range(len(planets)):
if i == j:
continue
var p2 = planets[j]
let dx = p2.x - p1.x
let dy = p2.y - p1.y
let dist = (dx * dx + dy * dy).sqrt()
if dist > 0.0:
let force = (G * p1.mass * p2.mass) / (dist * dist)
fx += force * (dx / dist)
fy += force * (dy / dist)
# F = m * a alapján gyorsulás és sebesség frissítése
planets[i].vx += (fx / p1.mass) * dt
planets[i].vy += (fy / p1.mass) * dt
# Pozíciók frissítése sebesség alapján
for i in range(len(planets)):
planets[i].x += planets[i].vx * dt
planets[i].y += planets[i].vy * dt
fn main() raises:
# Python modulok importálása a vizualizációhoz
let plt = Python.import_module("matplotlib.pyplot")
let animation = Python.import_module("matplotlib.animation")
# Kezdőértékek megadása (Nap, Föld, Mars, Vénusz)
var planets = List[Planet]()
planets.append(Planet("Nap", 0.0, 0.0, 0.0, 0.0, 1000.0, 20.0))
planets.append(Planet("Föld", 100.0, 0.0, 0.0, 3.16, 10.0, 5.0))
planets.append(Planet("Mars", 150.0, 0.0, 0.0, 2.58, 6.0, 4.0))
planets.append(Planet("Vénusz", 70.0, 0.0, 0.0, 3.78, 8.0, 4.5))
let fig = plt.figure(figsize=(8, 8))
let ax = fig.add_subplot(1, 1, 1)
fn animate(frame: Int) raises:
update_positions(planets, 0.05)
ax.clear()
ax.set_xlim(-200, 200)
ax.set_ylim(-200, 200)
ax.grid(True)
# Bolygók kirajzolása
for i in range(len(planets)):
let p = planets[i]
let color = "y" if p.name == "Nap" else "b" if p.name == "Föld" else "r" if p.name == "Mars" else "orange"
ax.scatter(p.x, p.y, s=p.radius * 5, color=color)
ax.annotate(p.name, (p.x, p.y + 2))
let ani = animation.FuncAnimation(fig, animate, frames=200, interval=20)
plt.show()
-------------
matplotlib kell hozzá
Nincsenek megjegyzések:
Megjegyzés küldése