Zum Inhalt

Programmierung von physikalischen Umgebungen

Es gibt viele Möglichkeiten, CindyScript zu nutzen, um die Möglichkeiten von CindyLab zu erweitern. Wir werden hier einige davon präsentieren. Einerseits stellt CindyScript mehrere spezielle Operatoren bereit, die für die Verwendung mit CindyScript implementiert wurden (zum Beispiel ein Oszilloskop zur Visualisierung physikalischer Größen und eine Anweisung zur Darstellung von Kraftfeldern). Andererseits hat CindyScript direkten Zugriff auf die meisten Parameter, die für physikalische Simulationen relevant sind. Darüber hinaus kann CindyScript physikalische Funktionalitäten von CindyLab-Objekten aktivieren oder deaktivieren. Auf diese Weise können maschinelle Verhaltensweisen in CindyLab-Szenarien implementiert werden. Wir werden hier mehrere Beispiele geben, die CindyScript zusammen mit CindyLab nutzen.

Das Oszilloskop

Die Anweisung drawcurves(position,list_of_values) erzeugt einen Bereich in der geometrischen Ansicht, in dem die Entwicklung von Größen dargestellt werden kann. Dabei ist position die Position, an der das Oszilloskop gezeichnet wird, und list_of_values ist eine CindyScript-Liste, die mehrere graphisch darzustellende Größen enthält. Die einfachste Verwendung dieses Operators wird durch das folgende Programm gezeigt:

drawcurves((0,0),[B.x,B.y])

Hier werden die x- und y-Koordinaten des Punktes B angezeigt. Wenn B ein Punkt ist, der sich um eine Sonne bewegt, könnte das Bild wie das folgende aussehen.


Graphen von Planetenbewegung

Standardmäßig wird der Anzeigebereich der Kurve automatisch an den Wertebereich angepasst. Der Operator drawcurves(...) unterstützt viele verschiedene Modifizierer, die zum Festlegen von Hintergrundfarben, Kurvenfarben, Anzeigetexten sowie vielen zusätzlichen Zeichnungsparametern verwendet werden können. Eine detaillierte Beschreibung finden Sie im Referenzhandbuch für CindyScript. Das folgende Bild zeigt die Verwendung des drawcurves-Operators auf einen gekoppelten harmonischen Oszillator angewendet.


Bewegung eines gekoppelten Oszillators

Hier wurden viele Modifizierer verwendet, um das gewünschte Farbverhalten und die Textanzeige zu erhalten. Das Beispiel wurde mit dem folgenden CindyScript-Programm konstruiert:

linecolor((1,1,1));
drawcurves((-7,-3),
  (A.x,B.x,A.ke,B.ke,a.pe+b.pe+c.pe),
  height->50,
  color->(1,1,1),
  back->(0,0,0),
  backalpha->1,showranges->true,
  range->"peek",width->400,
  colors->[
    [1,0.5,0.5],
    [0.5,1,0.5],
    [1,0.5,0.5],
    [0.5,1,0.5],
    [0.5,0.5,1]],
  texts->[
    "PosA = "+ A.x,
    "PosB = "+B.x,
    "EnergyA = "+A.ke,
    "EnergyB = "+B.ke,
    "PotentialEnergy = "+(a.pe+b.pe+c.pe)
]);
textcolor((1,1,1));

Kraftfelder

Ein weiterer CindyScript-Operator, der zur Unterstützung von CindyLab entworfen wurde, ist der drawforces-Operator. Mit diesem Operator können die Richtung und Stärke von Kräften über die gesamte Zeichnungsfläche visualisiert werden. Um dies zu erreichen, bewegt sich ein virtuelles Probeteilchen über den Bildschirm und misst die Kräfte an verschiedenen Punkten. Wenn man in CindyScript einfach die Zeile

drawforces()

schreibt, werden alle Gravitationskräfte, Coulomb-Kräfte, Kugelwechselwirkungen usw. gemessen und der Fluss wird gezeichnet. Das Probeteilchen ist standardmäßig mit Masse = 1, Ladung = 1 und Radius = 1 normalisiert. Wenn zum Beispiel zwei geladene Teilchen mit entgegengesetzten Ladungen vorhanden sind, führt der drawforces()-Operator zum folgenden Flussbild:


Ein einfaches elektrostatisches Feld

Wie der drawcurves()-Operator unterstützt auch der drawforces()-Operator viele Modifizierer. Diese werden im Referenzhandbuch für CindyScript im Detail erläutert. Hier präsentieren wir nur ein etwas fortgeschritteneres Beispiel.

Der Code-Fragment, der dieses Flussbild erzeugt hat, verwendet mehrere Modifizierer.


Ein anderes einfaches elektrostatisches Feld
drawforces(stream->true,
              color->(1,1,1),
              factor->3,
              resolution->5)

Insbesondere ersetzt die Anweisung stream->true die übliche Darstellung von Kraftfeldern mit kleinen Nadeln durch kleine Stromlinien, die ein genaueres Bild des Flusses ermöglichen.

Programmierung von CindyLab-Szenarien

Da CindyScript alle Parameter von CindyLab beeinflussen kann, ist es auch einfach, kompliziertes Verhalten zu implementieren. Als Beispiel präsentieren wir hier eine Implementierung eines einfachen Tischtennis-Spiels. Zunächst werden ein paar Bouncer verwendet, um die Grenze des Tisches zu zeichnen. Ein weiterer Bouncer wird geometrisch konstruiert, der an einen Punkt gebunden ist, damit er wie ein Tischtennisschläger frei bewegt werden kann. Schließlich wird ein Tischtennisball als Teilchen mit Geschwindigkeit hinzugefügt. Bislang nutzt die Konstruktion nur CindyLab und Cinderella. Die Situation ist bereits ziemlich funktional. Man kann tatsächlich Tischtennis spielen. Wenn der Ball jedoch den Bildschirm verlässt, geht er für immer verloren.

Hier kommt CindyScript ins Spiel. Mit CindyScript kann man erkennen, ob der Ball den Bildschirm verlässt, und auf solch ein Ereignis reagieren. Das folgende Programm erkennt den Ball, der den Bildschirm mit der Codezeile if(H.x>D.x+9,... verlässt. Wenn dies passiert, wird ein neuer Punkt mit zufälliger Position, zufälliger Geschwindigkeit und zufälliger Farbe am Ende des Tisches eingefügt. Zusätzlich wird ein Zähler verwendet, um zu zählen, wie viele Bälle verloren gegangen sind.

if(H.x>D.x+9,
  H.x=F.x;
  r=random();
  H.y=(r*D.y+(1-r)*G.y);
  w=random()*pi/2+3*pi/4;
  H.vx=-cos(w)*.4;
  H.vy=sin(w)*.4;
  H.color=(hue(random()));
  count=count+1;
);
drawtext((-1,-3),"Missed balls: "+count,size->20);

Programmierung des Tischtennis-Spiels

Um den Zähler zu initialisieren, muss es auch eine zusätzliche Codezeile im Tag simulation start geben, die den Zähler auf Null setzt.

count=0;

Das folgende Bild zeigt einen während eines Spiels aufgenommenen Snapshot. Beobachten Sie, wie der gelbe Ball das Spiel verlässt und der blaue Ball hereingeworfen wird.


Programmierung des Tischtennis-Spiels

🤖 Diese Seite wurde automatisch mit KI (Claude) übersetzt und wartet noch auf Überprüfung. → Alle KI-übersetzten Seiten