2026. június 10., szerda

Naprendszer mojo nyelven

# 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