image image


image

Simulation mit TigerJython: Brownsche Bewegung

Heute hatte ich große Lust, mal wieder irgend etwas mit TigerJython anzustellen. Meine Wahl fiel auf eine zweidimensionale Simulation der Brownschen Bewegung, wie sie Jarka Arnold, Tobias Kohn und Aegidius Plüss in ihrem Online-Tutorial »Programmierkonzepte mit Python und der Lernumgebung TigerJython« auf den Seite 355ff. vorgestellt haben. Herausgekommen ist dieses kleine Programm:

from gamegrid import *


# =========================== class Particle ===========================
class Particle(Actor):
    
    def __init__(self):
        Actor.__init__(self, "sprites/ball.gif", 2)
    
    # Called when actor is added to gamegrid
    def reset(self):
        self.oldPt = self.gameGrid.toPoint(self.getLocationStart())
    
    def advance(self, distance):
        pt = self.gameGrid.toPoint(self.getNextMoveLocation())
        dir = self.getDirection()
        # Left/right wall
        if pt.x < 5 or pt.x > WIDTH - 5:
            self.setDirection(180 - dir)
        # Top/bottom wall
        if pt.y < 5 or pt.y > HEIGHT - 5:
            self.setDirection(360 - dir)
        self.move(distance)
        
    def act(self):
        self.advance(3)
        if self.getIdVisible() == 1:
            pt = self.gameGrid.toPoint(self.getLocation())
            self.getBackground().drawLine(self.oldPt.x, self.oldPt.y, pt.x, pt.y)
            self.oldPt.x = pt.x
            self.oldPt.y = pt.y
 
# =========================== class CollisionListener ==================

class CollisionListener(GGActorCollisionListener):
    
    # Collision callback: just exchange direction and speed
    def collide(self, a, b):
        dir1 = a.getDirection()
        dir2 = b.getDirection()
        sd1 = a.getSlowDown()
        sd2 = b.getSlowDown()
        a.setDirection(dir2)
        a.setSlowDown(sd2)
        b.setDirection(dir1)
        b.setSlowDown(sd1)
        return(10)    # Wait a moment until collision is rearmed       

# =========================== Hauptprogramm ============================

def init():
    collisionListener = CollisionListener()
    for i in range(nbParticles):
        particles[i] = Particle()
        # Put them at random locations, but apart of each other
        ok = False
        while not ok:
            ok = True
            loc = getRandomLocation()
        for k in range(i):
            dx = particles[k].getLocation().x - loc.x
            dy = particles[k].getLocation().y - loc.y
            if dx*dx + dy*dy < 300:
                ok = False
        addActor(particles[i], loc, getRandomDirection())
        # Select collision area
        particles[i].setCollisionCircle(Point(0, 0), 8)
        # Select collision listener
        particles[i].addActorCollisionListener(collisionListener)
        # Set speed in groups of 10
        if i < 10:
            particles[i].setSlowDown(2)
        elif i < 20:
            particles[i].setSlowDown(3)
        elif i < 30:
            particles[i].setSlowDown(4)
        
    # Define collision partners
    for i in range(nbParticles):
        for k in range(i + 1, nbParticles):
            particles[i].addCollisionActor(particles[k])
    particles[0].show(1)

WIDTH = 400
HEIGHT = 400
nbParticles = 40
particles = [0]*nbParticles

makeGameGrid(WIDTH, HEIGHT, 1, False)
setSimulationPeriod(10)
setTitle("Brownsche Bewegung")

show()
init()
doRun()

Auch wenn Ihr das alles unter oben angegebenen Link nachlesen und nachvollziehen könnt, habe ich den Quellcode doch noch einmal hier und in meinem GitLab-Repositorium veröffentlicht, denn in der von mir ausgedruckten Fassung hatten sich die Autoren um das bei Python-Klassen übliche self herumgedrückt. Kann man zwar machen, ist aber nicht sehr pythonisch und verwirrte zumindest mich1.

Ansonsten habe ich festgestellt, daß ich mir das Modul gamegrid dringend mal (in der Java-Dokumentation) genauer anschauen muß. Denn das obige Skript verwendet Methoden, die in der TigerJython-Doku nicht aufgeführt sind, die mich aber glauben lassen, daß gamegrid noch mächtiger ist, als ich bisher gedacht hatte. Still digging!

  1. Die aktuelle Online-Version hat das mittlerweie korrigiert. Dort steht nun anstelle des verwirrenden p ein self. Habe ich aber erst bei der Abfassung dieses Beitrags bemerkt. 


(Kommentieren) 

image image



Über …

Der Schockwellenreiter ist seit dem 24. April 2000 das Weblog digitale Kritzelheft von Jörg Kantel (Neuköllner, EDV-Leiter Rentner, Autor, Netzaktivist und Hundesportler — Reihenfolge rein zufällig). Hier steht, was mir gefällt. Wem es nicht gefällt, der braucht ja nicht mitzulesen. Wer aber mitliest, ist herzlich willkommen und eingeladen, mitzudiskutieren!

Alle eigenen Inhalte des Schockwellenreiters stehen unter einer Creative-Commons-Lizenz, jedoch können fremde Inhalte (speziell Videos, Photos und sonstige Bilder) unter einer anderen Lizenz stehen.

Der Besuch dieser Webseite wird aktuell von der Piwik Webanalyse erfaßt. Hier können Sie der Erfassung widersprechen.

Diese Seite verwendet keine Cookies. Warum auch? Was allerdings die iframes von Amazon, YouTube und Co. machen, entzieht sich meiner Kenntnis.


Werbung

Diese Spalte wurde absichtlich leergelassen!


Werbung


image  image  image
image  image  image


image