Zugriff auf geometrische Elemente - Cinderella Dokumentation
Description: The user's guide to the Interactive Geometry Software Cinderella

Zum Inhalt

# Zugriff auf geometrische Elemente

Die Hauptkommunikation zwischen CindyScript und dem Geometrie-Teil von Cinderella wird durch den Zugriff auf die geometrischen Objekte einer Konstruktion erreicht. Geometrische Elemente können auf zwei verschiedene Arten zugegriffen werden: Entweder kann man auf ein Element über den Namen seines Labels zugreifen, oder man kann über spezielle CindyScript-Operatoren auf Listen von Elementen zugreifen. Die Interaktion zwischen Cinderella und CindyScript ermöglicht es CindyScript, im Wesentlichen alle Eigenschaften der Elemente einer geometrischen Konstruktion zu lesen. Die meisten Eigenschaften können auch von CindyScript aus gesetzt werden. In den folgenden Abschnitten werden zunächst die möglichen Wege zur Adressierung von geometrischen Objekten beschrieben, gefolgt von einer detaillierten Liste der unterstützten Eigenschaften.

### Zugriff auf Elemente über ihre Namen

Jedes Element in einer geometrischen Konstruktion hat einen eindeutigen Namen, sein Label. Dieser Name kann als Handle in CindyScript verwendet werden. Formal spielen Elemente in CindyScript die Rolle einer vordefinierten Variablen. Die verschiedenen Eigenschaften können über den . -Operator (Punkt-Operator) gelesen und gesetzt werden. Beispielsweise setzt die folgende Codezeile

    A.size=20

die Größe des Punktes A in einer Konstruktion auf den Wert 20. Wenn ein Punkt oder eine Linie in einem arithmetischen Operator ohne Punkt-Operator enthalten ist, wird sie automatisch in einen Vektor konvertiert, der ihre Position darstellt. Ein Punkt wird also in einen `[x,y]`-Vektor konvertiert, der seine zweidimensionalen Koordinaten darstellt. Eine Linie wird in einen `[x,y,z]`-Vektor konvertiert, der ihre homogenen Koordinaten darstellt. Wenn man allerdings die Koordinaten eines Punktes setzen möchte, muss man den Punkt-Operator explizit verwenden. Wenn ein Handle zu einem geometrischen Objekt nicht in einem arithmetischen Ausdruck verwendet wird, wird es trotzdem als geometrisches Objekt an die Berechnung übergeben. Da diese Konzepte etwas subtil sind, werden wir sie mit einigen Beispielen verdeutlichen.

Angenommen, A, B und C sind Punkte in einer Cinderella-Konstruktion. Die Zeile

    A.xy=(B+C)/2

setzt den Punkt A auf den Mittelpunkt von B und C. Diese zwei Punkte sind in einem arithmetischen Ausdruck enthalten, daher werden sie sofort in einen `[x,y]`-Vektor konvertiert. Das Setzen der Position von Punkt A muss durch explizite Verwendung der `.xy`-Eigenschaft erfolgen.

Das folgende Programm setzt die Farbe aller drei Punkte auf Grün:

    pts=[A,B,C];
    forall(pts,p,
      p.color=[0,1,0];
    )

In diesem Code werden die Punkt-Namen als Handles an die Liste `pts` übergeben. Beim Durchlaufen der Liste mit dem `forall`-Operator werden diese Handles nacheinander in die Variable `p` eingefügt, von der ihre Farb-Eigenschaft zugegriffen wird.

### Listen von Elementen

Manchmal ist es nicht notwendig, auf Punkte einzeln über ihre Namen zuzugreifen. Insbesondere passiert das, wenn man eine Operation auf alle Punkte in einer Konstruktion durchführen möchte. Das kann z.B. passieren, wenn man die konvexe Hülle einer Punktmenge berechnen möchte. Dafür stellt CindyScript mehrere Operatoren bereit, die Listen von Elementen zurückgeben. Beispielsweise gibt der Operator `allpoints()` eine Liste aller Punkte einer Konstruktion zurück. Wir werden dies mit einem sehr kleinen Beispiel demonstrieren. Das folgende Programm ändert die Farbe der Punkte je nach ihrer Position relativ zur y-Achse:

    pts=allpoints();
    forall(pts,p,
      if(p.x<0,
        p.color=[1,1,0],
        p.color=[0,1,0];
       )
    )

Das folgende Bild zeigt die Anwendung des Codes auf eine zufällige Sammlung von Punkten.

Arbeiten mit Listen von Punkten

### Eigenschaften von geometrischen Objekten

Wir beginnen nun mit einer vollständigen Beschreibung aller Eigenschaften, die derzeit über CindyScript zugänglich sind. Jede Eigenschaft ist mindestens lesbar. Für jede Eigenschaft listen wir den Typ des erwarteten Wertes, ob sie schreibgeschützt oder auch beschreibbar ist, und eine kurze Beschreibung ihres Zwecks auf. Die möglichen Eigenschaftstypen sind normalerweise wie folgt:

- real: eine reelle Zahl
- int: eine Ganzzahl
- bool: entweder `true` oder `false`
- string: eine Zeichenfolge
- 2-vector: ein zweidimensionaler Vektor
- 3-vector: ein dreidimensionaler Vektor
- 3x3-matrix: eine 3×3-Matrix

Einige Eigenschaften, wie die aktuelle Position, sind nur für freie Objekte beschreibbar. Wir kennzeichnen dies durch das Wort „free" in der entsprechenden Spalte.

##### Eigenschaften, die allen geometrischen Objekten gemeinsam sind

Name | Beschreibbar | Typ | Zweck
--- | --- | --- | ---
`color` | ja | 3-vector | Der (Rot-, Grün-, Blau-)Farbvektor des Objekts
`colorhsb` | ja | 3-vector | Der (Farbton, Sättigung, Schwarz-)Farbvektor des Objekts
`isshowing` | ja | bool | Ob das Objekt angezeigt wird (wird von allen abhängigen Elementen geerbt)
`visible` | ja | bool | Ob das Objekt angezeigt wird (wird nicht von abhängigen Objekten geerbt)
`alpha` | ja | real | Die Opazität des Objekts (zwischen 0,0 und 1,0)
`labelled` | ja | bool | Ob das Objekt sein Label zeigt
`name` | nein | string | Das Label des Objekts
`caption` | ja | string | Eine Beschriftung, die den Namen ersetzen kann
`trace` | ja | bool | Ob das Objekt eine Spur hinterlässt
`tracelength` | ja | int | Die Länge der Spur
`selected` | ja | bool | Ob das Objekt derzeit ausgewählt ist

Jedes geometrische Element hat einen eindeutigen Namen. Die Zeichenfolge, die diesen Namen darstellt, kann über `.name` zugegriffen werden. Beispielsweise gibt `A.name` die Zeichenfolge `"A"` zurück. Der Name kann nicht identisch mit der Beschriftung des Elements sein, die in der Konstruktion angezeigt wird. Wenn `A.caption` die leere Zeichenfolge ist, wird der Name angezeigt, ansonsten die Beschriftung.

##### Eigenschaften von Punkten

Name | Beschreibbar | Typ | Zweck
--- | --- | --- | ---
`x` | free | real | Die x-Koordinate des Punktes
`y` | free | real | Die y-Koordinate des Punktes
`xy` | free | 2-vector | Die xy-Koordinaten des Punktes
`coord` | free | 2-vector | Die xy-Koordinaten des Punktes
`homog` | free | 3-vector | Die homogenen Koordinaten des Punktes
`angle` | free | real | Gilt nur für PointOnCircle-Objekte. Der Winkel des Punktes auf dem Kreis
`size` | ja | int | Die Größe des Punktes (0..40)
`imagerot` | ja | real | Ein Rotationswinkel, wenn der Punkt mit einem Bild versehen ist

##### Eigenschaften von Linien

Name | Beschreibbar | Typ | Zweck
--- | --- | --- | ---
`homog` | free | 3-vector | Die homogenen Koordinaten der Linie
`angle` | free | real | Der Winkel der Linie
`slope` | free | real | Die Steigung der Linie
`size` | ja | int | Die Größe der Linie (0..10)

##### Eigenschaften von Kreisen und Kegelschnitten

Name | Beschreibbar | Typ | Zweck
--- | --- | --- | ---
`center` | nein | real | Der Mittelpunkt des Kreises
`radius` | free | real | Der Radius des Kreises
`matrix` | nein | real | Die Matrix, die die quadratische Form des Kreises oder des Kegelschnitts beschreibt
`size` | ja | int | Die Größe der Randlinie (0..10)

##### Eigenschaften von Texten

Name | Beschreibbar | Typ | Zweck
--- | --- | --- | ---
`text` | ja | string | Der Inhalt des Textes
`pressed` | ja | boolean | Der Status dieses Textes, wenn er ein Button ist
`xy` | ja | 2-vector | Die Position des Textes

##### Eigenschaften von Animationen

Name | Beschreibbar | Typ | Zweck
--- | --- | --- | ---
`run` | ja | bool | Ob die Animation läuft
`speed` | ja | real | Die relative Animationsgeschwindigkeit

##### Eigenschaften von Transformationen

Name | Beschreibbar | Typ | Zweck
--- | --- | --- | ---
`matrix` | nein | 3x3 matrix | Die homogene Matrix der Transformation
`inverse` | nein | 3x3 matrix | Die homogene Matrix der inversen Transformation

#### Eigenschaften von CindyLab-Objekten

Es sind nicht nur geometrische Eigenschaften, auf die über CindyScript zugegriffen werden kann. Die Simulationsparameter von CindyLab-Konstruktionen können auch über CindyScript gelesen und manchmal gesetzt werden.

##### Eigenschaften aller CindyLab-Elemente

Name | Beschreibbar | Typ | Zweck
--- | --- | --- | ---
`simulate` | ja | bool | Ob das Objekt an der Physik-Simulation teilnimmt oder vernachlässigt wird

##### Eigenschaften von Massen

Name | Beschreibbar | Typ | Zweck
--- | --- | --- | ---
`mass` | ja | real | Die Masse des Objekts
`charge` | ja | int | Die Ladung des Objekts
`friction` | ja | real | Die individuelle Reibung des Objekts
`radius` | ja | real | Der Radius, wenn die Masse als Kugel behandelt wird
`posx` | ja | real | Die x-Komponente der Position der Masse
`posy` | ja | real | Die y-Komponente der Position der Masse
`pos` | ja | 2-vector | Der Positionsvektor der Masse
`vx` | ja | real | Die x-Komponente der Geschwindigkeit
`vy` | ja | real | Die y-Komponente der Geschwindigkeit
`v` | ja | 2-vector | Der Geschwindigkeitsvektor
`fx` | nein | real | Die x-Komponente der auf das Partikel wirkenden Kraft
`fy` | nein | real | Die y-Komponente der auf das Partikel wirkenden Kraft
`f` | nein | 2-vector | Der Kraftvektor, der auf das Partikel wirkt
`kinetic` | nein | real | Die kinetische Energie des Partikels
`ke` | nein | real | Die kinetische Energie des Partikels

Manchmal ist man interessiert, ein benutzerdefiniertes Kraft-Potential zwischen Massen hinzuzufügen. Das kann durch die Programmierung eines geeigneten Code-Stücks im `Integeration Tick`-Event erfolgen. Da intern die Position von Massen eine feinere Zeitskala hat als die übliche geometrische Bewegung, ist es notwendig, auf ihre Position über die Accessoren `pos`, `posx` und `posy` zuzugreifen.

##### Eigenschaften von Federn und Coulomb-Kräften

Name | Beschreibbar | Typ | Zweck
--- | --- | --- | ---
`l` | nein | real | Die aktuelle Länge der Feder
`lrest` | nein | real | Die Ruhelänge der Feder
`ldiff` | nein | real | Der Abstand zur Ruhelänge der Feder
`strength` | ja | real | Die Federkonstante
`f` | nein | real | Der Kraftvektor, verursacht durch die Feder
`amplitude` | ja | real | Die Amplitude für die Betätigung
`speed` | ja | real | Die Geschwindigkeit für die Betätigung
`phase` | ja | real | Die Phase für die Betätigung (zwischen 0,0 und 1,0)
`potential` | nein | real | Die potenzielle Energie in der Feder
`pe` | nein | real | Die potenzielle Energie in der Feder

##### Eigenschaft für Geschwindigkeiten

Name | Beschreibbar | Typ | Zweck
--- | --- | --- | ---
`factor` | ja | real | Der Multiplikationsfaktor zwischen graphischer Darstellung und tatsächlicher Geschwindigkeit

##### Eigenschaften der Gravitation

Name | Beschreibbar | Typ | Zweck
--- | --- | --- | ---
`strength` | ja | real | Die Stärke des Gravitationsfeldes
`potential` | nein | real | Die potenzielle Energie aller Massen im Gravitationsfeld
`pe` | nein | real | Die potenzielle Energie aller Massen im Gravitationsfeld

##### Eigenschaften von Sonnen

Name | Beschreibbar | Typ | Zweck
--- | --- | --- | ---
`mass` | ja | real | Die Masse der Sonne
`potential` | nein | real | Die potenzielle Energie aller Massen im Sonnenfeld
`pe` | nein | real | Die potenzielle Energie aller Massen im Sonnenfeld

##### Eigenschaften von Magnetfeldern

Name | Beschreibbar | Typ | Zweck
--- | --- | --- | ---
`strength` | ja | real | Die Stärke des Magnetfeldes
`friction` | ja | real | Die Reibung im Magnetfeld

##### Eigenschaften von Prellern und Böden

Name | Beschreibbar | Typ | Zweck
--- | --- | --- | ---
`xdamp` | ja | real | Dämpfung in der x-Richtung
`ydamp` | ja | real | Dämpfung in der y-Richtung

##### Eigenschaften der Umgebung

Die Umgebung kann durch den integrierten Operator `simulation()` zugegriffen werden. Die folgenden Slots der Umgebung können zugegriffen werden:

Name | Beschreibbar | Typ | Zweck
--- | --- | --- | ---
`gravity` | ja | real | Die globale Gravitation
`friction` | ja | real | Die globale Reibung
`kinetic` | nein | real | Die Gesamtkinetische Energie
`ke` | nein | real | Die Gesamtkinetische Energie
`potential` | nein | real | Die Gesamtpotenzielle Energie
`pe` | nein | real | Die Gesamtpotenzielle Energie

### Inspizieren von Elementen

Sie können auch die generische CindyScript-Funktion `inspect(<element>)` verwenden, um auf alle Attribute zuzugreifen, die im Inspector verfügbar sind. Wenn beispielsweise ein Punkt A in der Konstruktion existiert, gibt die Funktion

    inspect(A)

das Array von Zeichenfolgen

    [name,definition,color,visibility,drawtrace,tracelength,
    traceskip,tracedim,render,isvisible,text.fontfamily,
    pinning,incidences,labeled,textsize,textbold,textitalics,
    ptsize,pointborder,printname,point.image,
    point.image.rotation,freept.pos]

zurück.

Mit der zweiparametrigen Form `inspect(<element>,<string>)` können Sie alle Attribute von A, die im obigen Array aufgelistet sind, lesen:

    inspect(A,"text.fontfamily")

gibt

    SansSerif

zurück.

Mit der dreiparametrigen Form `inspect(<element>,<string>,<expr>)` können Sie auch die Attribute setzen, die nicht schreibgeschützt sind (beispielsweise können Sie die Liste der Inzidenzen oder die Definition eines Elements nicht ändern). Die folgende Funktion setzt die Schriftart von A auf eine Serif-Schriftart:

    inspect(A,"text.fontfamily","Serif")

Der inspect-Befehl ist sehr leistungsstark, da Sie alle Aktionen, die Sie normalerweise mit der Maus im Inspector durchführen müssen, automatisieren können. Außerdem gibt er Ihnen feinkörnige Kontrolle über alle Eigenschaften.

#### Ein Benutzerattribut setzen: `attribute(<geo>,<string1>,<string2>)`

Beschreibung: Setzt das Benutzerattribut von , das durch identifiziert wird, auf den Wert .

#### Ein Benutzerattribut lesen: `attribute(<geo>,<string>)`

Beschreibung: Gibt das Benutzerattribut, das durch identifiziert wird, des geometrischen Elements zurück.

Beide Versionen der attribute-Funktion werden hauptsächlich für die Interaktion mit der Visage-Erweiterung verwendet.

### Elemente erstellen und löschen

Ab Cinderella Version 2.1 können Sie auch Punkte dynamisch aus CindyScript erstellen. Die Funktion

    p = createpoint("A",[4,6])

erstellt einen Punkt mit der Bezeichnung A bei den Koordinaten [4,6], sofern es nicht bereits ein Element A gibt. Wenn es existiert, wird es an die als zweites Argument angegebene Position verschoben. Der Wert der Funktion ist der Punkt oder das bereits vorhandene Element A. Dies bedeutet, dass wiederholte Ausführungen der Funktion für Ihren Code nicht schädlich sind - wenn Sie einen freien Punkt bei „A" benötigen, können Sie mit dem `createpoint`-Befehl sicherstellen, dass er existiert.

Mit der Funktion `removeelement` können Sie auch Elemente aus Ihrer Konstruktion entfernen. Beachten Sie, dass alle abhängigen Elemente ebenfalls entfernt werden. Die Funktion erwartet ein Element als Argument, daher können Sie entweder

    removeelement(A)

oder

    removeelement(element("A"))

verwenden, um das Element namens „A" zu entfernen.

Weitere Funktionen zum Erstellen beliebiger Elemente sind ebenfalls verfügbar und werden im Abschnitt über spezielle Operatoren diskutiert.

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