Lehrgang

Für allgemeine Informationen und Einzelheiten über die Programmiersprache GeoScript, siehe das GeoScript-Manual.

Inhalt:
Kapitel 1: Ein einfaches Dreieck
Kapitel 2: Einfache Zeichnungen mit Geraden
Kapitel 3: Objekte markieren
Kapitel 4: Kreise
Kapitel 5: Wichtige Linien im Dreieck; Textausgabe
Kapitel 6: Subroutine "CONSTRUCTION"
Kapitel 7: Bewegte Konstruktionen
Kapitel 8: Subroutine "INTERACTION"
Kapitel 9: Bewegungen einschränken in bewegten Konstruktionen und Interaktionen
Kapitel 10: Ein Menu
Kapitel 11: Vorgegebene Stile und Farben ändern

GeoScript-Website


Kapitel 1: Ein einfaches Dreieck
(Befehle POINT, LINE, WAIT, END)

Wir beginnen mit einer sehr grundlegenden Konstruktion: ein Dreieck. Dies ist das Programm dafür:

POINT A, 100,360                       'Dieser Punkt erhält die vorgegebenen Eigenschaften.
POINT B, 400,360, 2,(255,0,0)          'Stil 2, rot, vorgegebene Breite.
POINT C, 300,85, DEFAULT, DEFAULT, 40  'Breite 40.
a = LINE B,C                           'Diese Gerade erhält die vorgegebenen Eigenschaften.
b = LINE A,C, &HF0F, (0,0,255)         'Gestrichelte Linie, blau, vorgegebene Breite.
c = LINE A,B, &H101, DEFAULT, 5        'Gepunktete Linie, Breite 5.
WAIT                'Der Benutzer muss auf einen Knopf klicken, um das Programm zu beenden.
END

Alles, was nach einem Apostroph ' steht, ist Kommentar. Der ' gibt an, dass alles Folgende nicht als Programmbefehl interpretiert werden soll. GeoScript behandelt solche Kommentare, als ob sie gar nicht da stünden.

Zuerst initialisieren wir drei Punkte auf dem Bildschirm. Das tun wir mit dem Befehl POINT, der die folgende Syntax hat:

POINT Name, x, y [, Stil, Farbe, Breite]

Name kann irgendein von Dir gewählter Name sein, aber kein GeoScript-Schlüsselwort. Dein Punkt darf also z.B. nicht "Point" heissen. (Du darfst ihn auch nicht "Line" nennen; aber ich nehme an, das wirst Du sowieso nicht tun.) x und y sind die Koordinaten des Punktes auf dem Bildschirm.
Wenn Du schon einmal eine andere Programmiersprache benutzt hast, dann weisst Du, dass Programmiersprachen Variablen benutzen, um Daten zu speichern wie z.B. Zahlen, Textausdrücke, usw. Um einen Zahlwert in einer Variable zu speichern, würde man etwas wie a = 5 schreiben, wobei "a" der Name der Variable ist, die den Wert 5 erhält.
Genau das ist es, was der Befehl POINT tut. "A" (im Beispielprogramm) ist der Name einer Variablen - in diesem Fall eines Punktes -, und das Koordinatenpaar "100,360" ist der Wert, den wir A geben.
Aber GeoScript ist anders in dem Sinn, dass es hier keine numerischen Variablen gibt. Da es sich um eine Sprache für Geometrieprogramme handelt, stellen ihre Variabeln geometrische Objekte dar. Es gibt drei Datentypen (d.h. Arten von Variabeln) in GeoScript: Punkte, Geraden und Kreise.
(Für eine Übersicht über diese Datentypen und ihre Eigenschaften, siehe den entsprechenden Abschnitt im
GeoScript-Manual.)

Ein Name und ein Koordinatenpaar ist alles, was wir brauchen, um einen Punkt zu initialisieren. Beachte, dass Bildschirmkoordinaten "auf dem Kopf stehen": der y-Wert nimmt von oben nach unten zu. - Der Befehl POINT hat aber noch drei weitere Parameter, die wahlweise weggelassen werden können:

- Stil definiert, wie der Punkt auf dem Bildschirm erscheint. Wenn hier nichts angegeben wird, dann erscheint der Punkt als feines Kreuz. Punkt B in unserem Beispiel wird als ausgefüllter Kreis gezeichnet (Stil 2).
- Farbe ist ein RGB-Triplett (rot, grün, blau). Jede der drei Komponenten kann einen Wert von 0 (dunkel) bis 255 (grösste Helligkeit) annehmen. Wenn Farbe nicht angegeben ist, erscheint der Punkt schwarz. - Farbwerte sind übrigens die einzigen Ausdrücke in GeoScript, die Klammern verwenden.
- Breite ist die Grösse des Punktes auf dem Bildschirm. Für den vorgegebenen Stil gibt er die Länge der gekreuzten Linien an, in Pixeln. Für Stil 2 gibt er den Durchmesser des Kreises an.
(Für eine vollständige Erklärung von Stilen und graphischen Eigenschaften siehe den entsprechenden Abschnitt im GeoScript-Manual.)

Wenn Du nur Breite angeben möchtest, aber Stil und Farbe im vorgegebenen Zustand belassen möchtest, dann kannst Du anstelle dieser Parameter DEFAULT schreiben, wie in der dritten Linie des obigen Beispiels:

POINT C, 300,85, DEFAULT, DEFAULT, 40

Ein Wert von -1 hat dieselbe Bedeutung wie DEFAULT.

Wenn Du dieses Script ausführst, wirst Du feststellen, dass die Punkte einer nach dem andern auf dem Bildschirm erscheinen, mit einer Wartezeit von zwei Sekunden zwischen einem Punkt und dem nächsten. Du kannst diese Wartezeiten überspringen, indem Du irgendeine Taste drückst. (Später werden wir sehen, wie man eine ganze Konstruktion unmittelbar auf den Bildschirm bringen kann, wenn wir über die CONSTRUCTION-Subroutinen sprechen.)
(Für mehr Einzelheiten über die Benutzeroberfläche von GeoScript siehe den entsprechenden Abschnitt im GeoScript-Manual.)

- Als nächstes verbinden wir die Punkte mit Geraden. Das tut der Befehl LINE. Seine Syntax ist:

Gerade = LINE Punkt1, Punkt2 [, Muster, Farbe, Breite]

Du wirst einen Unterschied zwischen der Form dieses Befehls und des vorherigen feststellen. In "POINT Name ..." haben wir zuerst das Schlüsselwort und dann den Namen der Variable. Hier haben wir zuerst den Namen und dann das Schlüsselwort. (Das Gleichheitszeichen = ist nicht obligatorisch.) Die erste Form ist die Form eines Initialisierungsbefehls, wo wir den Datentyp einer Variable definieren und ihr numerische Werte geben (wie z.B. Koordinaten). Die Form, die wir hier haben, ist eine geometrische Operation (oder Konstruktion), wo wir ein oder mehrere existierende Objekte benutzen (in unserem Fall zwei Punkte), um ein oder mehrere neue Objekte zu erzeugen (in unserem Fall eine Gerade).
Den Befehl LINE gibt es auch als Initialisierungsbefehl, in der folgenden Form:

LINE Name, x1, y1, x2, y2 [, Muster, Farbe, Breite]

Hier sind x1,y1 und x2,y2 die Koordinaten von zwei Punkten, die die Gerade festlegen.
Statt es wie in unserem Beispiel zu tun, könnten wir also unser Dreieck auch so konstruieren, dass wir zuerst drei Geraden initialisieren und dann deren Schnittpunkte bestimmen. Aber es ist praktischer, es so wie im Beispiel zu machen.

Du wirst auch feststellen, dass wir Punkte mit den Namen A,B,C haben, und Geraden mit den Namen a,b,c. Das ist kein Problem, denn GeoScript unterscheidet zwischen Gross- und Kleinbuchstaben in den Namen von Variabeln; A ist also nicht dasselbe wie a. Aber das bedeutet, dass Du aufmerksam tippen must: wenn Du z.B. einen Punkt Spitze nennst und ihn später mit spitze ansprichst, gibt es einen Programmfehler.
Schlüsselwörter können hingegen sowohl gross wie klein geschrieben werden: statt LINE könnten wir auch line, Line, oder sogar lInE schreiben.

Genauso wie POINT, hat auch der Befehl LINE seine wahlweisen Parameter, welche in diesem Abschnitt des GeoScript-Manuals erklärt werden.

Um dieses Script auszuführen (unter Windows), öffne "GeoScript.exe", und wähle im erscheinenden Dialogfenster die Programmdatei, die Du ausführen willst (in diesem Fall "tutorial1.geo"). Du kannst auch den Windows-Explorer in dem Ordner öffnen, wo sich die Script-Datei befindet, und sie auf das GeoScript-Icon ziehen.

Dies ist das Ergebnis unseres Programms:

- Jetzt müssen noch die zwei letzten Befehle erklärt werden:

WAIT hält das Programm an, bis der Benutzer auf einen Knopf klickt oder eine der reservierten Tasten drückt. Ohne diesen Befehl würde sich das Programmfenster sofort schliessen, sobald das Dreieck fertig ist, und wir hätten keine Zeit, das Ergebnis unseres ersten Programms zu bewundern.

END beendet das Programm - da gibt es nichts weiter dazu zu sagen. Ende.


Übungsvorschläge:
A) Schreibe ein Script, das auf die zweite in diesem Kapitel vorgeschlagene Weise ein Dreieck zeichnet (mit LINE als Initialisierungsbefehl, und ohne den Befehl POINT).
B) Schreibe ein Script, das einen Stern zeichnet.
C) Spiele ein wenig mit den verschiedenen Stilen, Linienmustern, Farben und Breiten, und beobachte das Ergebnis auf dem Bildschirm. (Konsultiere den entsprechenden Abschnitt im
GeoScript-Manual.)


 

Kapitel 2: Einfache Zeichnungen mit Geraden
(Befehle LINEPOLAR, CROSS, STARTLINE, ADVANCETO)

Im Kapitel 1 haben wir Bekanntschaft gemacht mit der geometrischen Konstruktion LINE. Jetzt werden wir einige zusätzliche Konstruktionen zu unserem ersten Programm hinzufügen:

hc = LINEPOLAR C, c, 90º, &HF0F

Der Befehl LINEPOLAR zeichnet eine Gerade, die durch einen gegebenen Punkt geht und mit einer gegebenen Gerade den angegebenen Winkel bildet. Winkel werden in Grad angegeben und nehmen im Gegenuhrzeigersinn zu. (Das Grad-Zeichen º nach der Zahl ist nicht obligatorisch; aber es macht das Script besser verständlich. Für den Fall, dass Du es in fünfzig Jahren wieder anschaust, wenn Du vergessen hast, was alles bedeutet.)

Hier brauchen wir LINEPOLAR, um einen rechten Winkel zur Basis c zu zeichnen, der durch den Punkt C geht; d.h. die Höhe des Dreiecks. Der Wert &HF0F für "Muster" bewirkt, dass die Gerade gestrichelt gezeichnet wird.

Es gibt auch einen Intialisierungsbefehl LINEPOLAR, in der folgenden Form:

LINEPOLAR Name, x1, y1, Winkel [, Muster, Farbe, Breite]

Hier sind x1, y1 die Koordinaten des Ursprungs der Geraden, und Winkel ist ein absoluter Winkel: 0º bedeutet nach rechts, 90º nach oben, 180º nach links, usw. Du wirst Dir das einfach merken können, wenn Du Dich daran erinnerst, dass GeoScript christlichen Prinzipien folgt: Zuerst entscheidest Du Dich, auf dem rechten Weg zu gehen; dann richtest Du den Blick nach oben, um die Hilfe des Allerhöchsten zu erhalten.

- Dann zeichnen wir die Höhe durch B auf dieselbe Weise:

hb = LINEPOLAR B, b, 90º, &HF0F

Dann speichern wir den Schnittpunkt der zwei Höhen in einer Variable H:

H = CROSS hc, hb, 4, &HFF0000

Die Zahl 4 ist ein Punktstil, der den Punkt als ausgefülltes Quadrat erscheinen lässt. &HFF0000 ist ein Farbwert und bedeutet ein intensives Rot. - Im Kapitel 1 sahen wir eine andere Form, Farben anzugeben; in jener Form wäre diese Farbe (255,0,0). Stattdessen kannst Du die hexadezimale Form &HRRGGBB benützen (je zwei Stellen für Rot, Grün und Blau). Aber wenn Dir hexadezimale Zahlen Bauchschmerzen bereiten, dann wirst Du die Form mit Klammern vorziehen (rot, grün, blau).
Nicht sehr wichtige Anmerkung: Diese Form, hexadezimale Zahlen zu schreiben, entspricht der Syntax der Familie von Programmiersprachen BASIC, in welcher GeoScript geschrieben wurde. Für einen Farbwert sind auch die Formen 0xFF0000 und 0FF0000h erlaubt. Letztere Formen sind aber nicht erlaubt für Linienmuster, und auch nicht für andere Werte, die Du hexadezimal angeben möchtest. (Du kannst auch Koordinaten, Winkel, usw. hexadezimal angeben, wenn Dir das Freude macht; aber dann MUSST Du &H voransetzen.)

Als nächstes, nur um eines Beispiels willen, initialisieren wir einen weitern Punkt und eine Strecke mit den folgenden Befehlen:

POINT X, 400, 280, -1, (0,128,0)
x, Y = STARTLINE X, 0º, 180, -1, (0,128,0), 3

Der Befehl STARTLINE dient hauptsächlich zu Ausbildungszwecken: Er initialisiert eine Strecke genau in der Weise, wie man sie auf dem Papier zeichnen würde. Er nimmt einen bereits existierenden Punkt, zeichnet von da aus eine Gerade in einer bestimmten Richtung (in unserem Beispiel 0º = nach rechts), und misst darauf vom Startpunkt her die gewünschte Länge ab (in unserem Beispiel 180 Pixel). Die letzten drei Parameter sind die graphischen Eigenschaften der Geraden: das vorgegebene Muster, Farbe Grün und Breite 3.
Die allgemeine Syntax von STARTLINE ist:

Gerade, Punkt2 = STARTLINE Punkt, Winkel, Distanz [, Muster, Farbe, Breite]

Du siehst, dass dieser Befehl zwei Ergebnisse hat: eine Gerade und einen Punkt (den Endpunkt). Der Endpunkt erhält dieselben graphischen Eigenschaften wie der Startpunkt.

Jetzt wollen wir einen dritten Punkt auf dieser Geraden x definieren, in einem Abstand von 50 Pixel von X in Richtung Y. Das erreichen wir mit dem folgenden Befehl:

Z = ADVANCETO X, Y, 50, 2

(Der letzte Parameter, 2, ist der Stil des neuen Punktes Z.)
Wenn wir bereits eine Gerade von X zu Y konstruiert haben, wie im vorliegenden Beispiel, dann könnten wir dasselbe Ergebnis mit dem folgenden Befehl erzielen:

Z = ADVANCEON X, x, 50, 2

Der einzige Unterschied zwischen ADVANCETO und ADVANCEON besteht darin, dass ADVANCETO als Parameter zwei Punkte verlangt, während ADVANCEON einen Punkt und eine Gerade benutzt.

Wenn wir aber ADVANCEON benutzen wollen, dann stellt sich eine Frage: In welcher Richtung bewegen wir uns? Da eine Gerade in zwei Richtungen geht, was ist dann, wenn GeoScript sich irrt und den Abstand nach links misst, wenn wir nach rechts gehen wollen? - Die Antwort liegt im vektoriellen Format, das GeoScript intern benutzt. Für eine Gerade wird nicht nur ihr Ort gespeichert, sondern auch ihre Richtung. Diese Richtung hängt davon ab, wie die Gerade ursprünglich konstruiert wurde. In unserem Fall haben wir sie unter Angabe eines absoluten Winkels konstruiert; also können wir sicher sein, dass ihr Vektor nach rechts zeigt, nicht nach links. Eine Gerade, die als Verbindung zweier Punkte konstruiert wird, zeigt vom ersten Punkt zum zweiten, nicht umgekehrt.

Als letztes Beispiel konstruieren wir eine Gerade, die in Z beginnt und mit x einen Winkel von 30 Grad bildet:

z = LINEPOLAR Z, x, 30º, -1, (0,128,0), 3

Hier können wir wieder fragen: in welche Richtung zeigt dieser Winkel? Nach links oder nach rechts? - Sehen wir nochmals den Vektor der Geraden an. Wir erinnern uns, dass Winkel im Gegenuhrzeigersinn zunehmen. Somit gibt es nur eine Antwort: diese Gerade wird nach rechts oben zeigen.

Dies ist das ganze Programm:

POINT A, 100,360, -1, &H0000FF
POINT B, 400,360, -1, &H0000FF
POINT C, 300,85, -1, &H0000FF
a = LINE B,C
b = LINE A,C
c = LINE A,B
hc = LINEPOLAR C, c, 90º, &HF0F   'gestrichelte Linie
hb = LINEPOLAR B, b, 90º, &HF0F
H = CROSS hc, hb, 4, &HFF0000
POINT X, 400, 280, -1, (0,128,0)
x, Y = STARTLINE X, 0º, 180, -1, (0,128,0), 3    'Eine grüne Linie, 3 Pixel breit.
Z = ADVANCETO X, Y, 50, 2      'Ein Punkt in 50 Pixel Abstand von X, in Richtung Y.
z = LINEPOLAR Z, x, 30º, -1, (0,128,0), 3
WAIT
END

Und dies ist das Ergebnis:


Übungsvorschläge:
A) Schreibe ein Script, das ein Dreieck mit den Winkeln 40º, 60º und 80º zeichnet.
B) Schreibe ein Script, das über einer gegebenen Strecke ein Rechteck von 150 Pixeln Höhe zeichnet.
C) Schreibe ein Script, das über einer gegebenen Strecke ein Quadrat zeichnet. (Hinweis: Benutze die Diagonalen.)


 

Kapitel 3: Objekte markieren
(Befehle MARKPOINT, MARKLINE, MARKANGLE, MARKNUMBERANGLE, MARKNUMBERLINE.)

Wir werden nochmals das Programm vom vorherigen Kapitel als Beispiel nehmen, und einige Ergänzungen dazu vornehmen. Da unsere Punkte und Geraden Namen haben, wäre es schön, diese Namen auch auf dem Bildschirm zu sehen. Das bewerkstelligt die Familie von Befehlen MARK... Um einen Punkt zu markieren, brauchen wir den Befehl:

MARKPOINT Punkt [, Grösse, Position]

Grösse ist ein wahlweiser Parameter, der die Schriftgrösse (Höhe) in Pixeln angibt. Wenn er weggelassen wird, erscheint die Schrift 16 Pixel hoch.
Position gibt an, wo genau Du die Anschrift des Punktes hinsetzen möchtest. Wenn Du auf dem Papier zeichnest, kannst Du leicht sehen, wo es einen freien Platz gibt, wo Du einen Punkt anschreiben kannst; aber GeoScript ist nicht so schlau. Wenn Du nicht angibst, wo genau sich die Buchstaben befinden sollen, dann wird GeoScript einen Punkt immer genau darüber anschreiben. Für die Punkte A und B unseres Dreiecks sähe das nicht schön aus, da die Buchstaben von den Seiten a bzw. b durchkreuzt würden. Deshalb geben wir mit einem Wert von 2 an, dass wir den Buchstaben unter dem Punkt haben wollen:

MARKPOINT A, -1, 2
MARKPOINT B, -1, 2

(Für weitere Position-Werte und andere Einzelheiten über die Markierungsbefehle, siehe im GeoScript-Manual.)

Für den Punkt C ist die vorgegebene Position in Ordnung. Aber beispielshalber benutzen wir hier eine grössere Schriftgrösse:

MARKPOINT C, 24

Um eine Gerade zu markieren, gibt es zwei Alternativen:

MARKLINE line [, point1, point2, size, position]
MARKLINE line [, size , position]

Du musst auf irgendeine Weise angeben, wo entlang der Geraden die Anschrift platziert werden soll. Du kannst zwei Punkte auf der Geraden angeben, und die Anschrift wird in die Mitte zwischen beiden gesetzt werden. Pass auf, GeoScript überprüft nicht, ob diese Punkte wirklich auf der Geraden liegen! Wenn das nicht der Fall ist, könntest Du einige seltsame Ergebnisse erhalten.
Wenn Du keine Punkte angibst, dann kommt die Anschrift in die Mitte zwischen dem Ursprung der Geraden (dem Startpunkt, con dem aus sie ursprünglich konstruiert wurde) und dem Endpunkt ihres Vektors, beginnend von dort, zu liegen. (Im Kapitel 2 haben wir kurz die Vektoren erklärt.) Für unser Dreieck ist das in Ordnung, da wir ja die Geraden mit Hilfe der Ecken des Dreiecks konstruiert haben; somit geben wir keine Punkte an:

MARKLINE a, -1, 1
MARKLINE b
MARKLINE c, -1, 1

Du siehst, dass wir die Positionswerte für die Seiten a und c ändern, da wir gerne alle Anschriften ausserhalb des Dreiecks haben wollen. Für Geraden gibt es nur zwei verschiedene Positionswerte: der vorgegebene Wert ist links von der Geraden, wenn sie steil ist (über 45º), und oberhalb der Geraden, wenn sie eher flach ist. Ein Wert von 1 ändert diese Position zur Rechten, bzw. unterhalb der Geraden.

Jetzt zu den Winkeln. Die zwei Formen des Markierungsbefehls sind:

MARKANGLE Gerade1, Gerade2, "Text" [, Grösse, Position, Radius]
MARKANGLE Punkt1, Punkt2, Punkt3, "text" [, Grösse, Radius]]

Da Winkel nicht in Variabeln gespeichert werden, haben sie keine Namen, und wir müssen ihnen jetzt welche geben. Dazu dient der Parameter "Text". Dieser Text muss in Anführungs- und Schlusszeichen gesetzt werden "". - Zusätzlich zur Anschrift werden Winkel auch mit einem Bogen markiert. Mit dem wahlweisen Parameter Radius kannst Du den Radius dieses Bogens angeben.
In der ersten Form des Befehls wird der Winkel durch zwei Geraden definiert. Aber das ist nicht genügend, da es mindestens vier verschiedene Winkel gibt (sogar noch mehr), die zwischen zwei Geraden markiert werden können:

Ich habe die Numerierung dieser Möglichkeiten mit 0 begonnen, weil das eine Programmierergewohnheit ist (sehr nützlich für den Umgang mit Computern, aber nicht für das Alltagsleben). Und auch, weil diese roten Zahlen den Werten des wahlweisen Parameters Position entsprechen. Position 0 (vorgegeben) ist der Winkel im Gegenuhrzeigersinn von Gerade1 zu Gerade2, Position 1 ist der folgende Winkel im Gegenuhrzeigersinn, usw.
Aber das ist noch nicht alles. Der Vektor von Gerade2 könnte in die umgekehrte Richtung zeigen, und welcher der folgenden ist dann der Winkel im Gegenuhrzeigersinn von 1 nach 2?

Wie Du siehst, wird Position 0 immer den kleineren Winkel wählen (<180º), unabhängig von der Richtung von Gerade2. Position 4 wird jedoch immer genau den Winkel vom Vektor 1 zum Vektor 2 markieren, auch wenn er grösser als 180º ist.
Wenn Du also nicht aufpasst, kann dieser Befehl leicht einen anderen Winkel markieren als jenen, den Du möchtest. Wann immer Du also drei bekannte Punkte hast, die einen Winkel definieren, solltest Du die zweite Form des Befehls MARKANGLE benutzen. Diese Form braucht keinen Parameter Position, da sie immer im Gegenuhrzeigersinn von Punkt1 zu Punkt3 drehen wird, mit Punkt2 als Ursprung des Winkels, wie rechts dargestellt.

Das ist es, was wir in unserem Beispielprogramm tun:

MARKANGLE B,A,C, "a"
MARKANGLE C,B,A, "b"
MARKANGLE A,C,B, "g", 24, 150

Du wirst sehen, dass auf dem Bildschirm griechische Buchstaben erscheinen: statt eines lateinischen "a" erscheint ein griechisches Alpha. Gamma wird als "g" bezeichnet (nicht "c"). - Bei diesem dritten Winkel benutzen wir eine grössere Schriftgrösse (24) und einen grösseren Bogenradius (150 Pixel).

Grössen von Strecken und Winkeln markieren

Manchmal ist es wünschenswert, nicht nur den Namen eines Winkels anzugeben, sondern auch seine Grösse. Das tun wir mit dem Befehl MARKNUMBERANGLE, der genau dieselbe Syntax hat wie MARKANGLE (beide Formen). Er berechnet aber zusätzlich die Grösse des Winkels in Grad und gibt sie auf dem Bildschirm an. In unserem Beispielprogramm geben wir die Grösse des Winkels zwischen der Höhe hc und der Basis c an, der 90º betragen sollte:

MARKNUMBERANGLE c, hc, "f"

Für Geraden heisst der entsprechende Befehl MARKNUMBERLINE, mit der folgenden Syntax:

MARKNUMBERLINE Gerade [, Punkt1, Punkt2, Faktor, Grösse, Position]

Dieser Befehl gibt den Abstand zwischen Punkt1 und Punkt2 in Pixeln an; oder wenn keine Punkte angegeben sind, die Länge des Vektors der Geraden.
Du siehst hier einen zusätzlichen Parameter, Faktor. Das ist eine ganze Zahl, durch welche die Länge (in Pixeln) geteilt wird. So kannst Du Deine eigene Masseinheit definieren: z.B. mit einem Faktor von 10 wird ein Abstand von 10 Pixeln mit 1 angeschrieben und ein Abstand von 50 Pixeln mit 5, usw.

Das ist das vollständige Programm:

POINT A, 100,360, -1, &H0000FF
MARKPOINT A, -1, 2    'Vorgegebene Schriftgrösse; Position 2 = unten
POINT B, 400,360, -1, &H0000FF
MARKPOINT B, -1, 2
POINT C, 300,85, -1, &H0000FF
MARKPOINT C, 24       'Wir nehmen hier eine grössere Schrift.
a = LINE B,C
MARKLINE a, -1, 1     'Position: rechts bzw. unten
b = LINE A,C
MARKLINE b
c = LINE A,B
MARKLINE c, -1, 1     'Position: rechts bzw. unten
'Wir markieren die Winkel des Dreiecks:
MARKANGLE B,A,C, "a"
MARKANGLE C,B,A, "b"
MARKANGLE A,C,B, "g", 24, 150   'Grössere Schrift und Bogenradius.
hc = LINEPOLAR C, c, 90º, &HF0F
MARKNUMBERANGLE c, hc, "f"
hb = LINEPOLAR B, b, 90º, &HF0F
H = CROSS hc, hb, 4, &HFF0000
POINT X, 400, 280, -1, (0,128,0)
x, Y = STARTLINE X, 0º, 180, -1, (0,128,0), 3
Z = ADVANCETO X, Y, 50, 2
MARKNUMBERLINE x, X,Z          'Abstand X-Z anschreiben.
z = LINEPOLAR Z, x, 30º, -1, (0,128,0), 3
WAIT
END

Und hier die Ausgabe auf dem Bildschirm:


Übungsvorschläge:
Gebrauche die Scripts der Übungen von Kapitel 2, und schreibe die Punkte, Geraden und Winkel der gezeichneten Figuren an.


 

Kapitel 4: Kreise
(Befehle CIRCLE, CROSS mit Kreisen, TANGENT.)

So wie POINT, LINE und LINEPOLAR, hat auch der Befehl CIRCLE zwei Gebrauchsarten. Um einen Kreis mit numerischen Werten zu initialisieren, ist die Syntax:

CIRCLE Name, x, y, Radius [, Farbe, Breite, Anfang, Ende]

x,y sind die Koordinaten des Mittelpunkts. Die wahlweisen Parameter Anfang und Ende geben den Anfangs- und Endwinkel des Bogens an, in Grad; somit kann statt eines vollen Kreises auch nur ein Bogen gezeichnet werden. - Diese Eigenschaften gelten nur für die Ausgabe auf dem Bildschirm, aber nicht für Konstruktionen: Wenn Du z.B. die Schnittpunkte eines Kreises mit einer Geraden konstruierst, dann werden diese Punkte auch dann erzeugt, wenn sie sich auf dem unsichtbaren Teil des Kreises befinden.

Als Konstruktion hat CIRCLE die folgenden zwei Formen:

Kreis = CIRCLE Mittelpunkt, Punkt [, Farbe, Breite, Anfang, Ende]
Kreis = CIRCLE Mittelpunkt, Gerade [, Farbe, Breite, Anfang, Ende]

In der ersten Form geht die Kreislinie durch Punkt. In der zweiten Form wird Gerade eine Tangente an den Kreis.
Das folgende Beispielprogramm zeigt alle drei Varianten des Befehls CIRCLE::

CIRCLE c1, 200,200, 150, (128,128,0), 3
POINT C, 280,280
MARKPOINT C
POINT A, 460,370
MARKPOINT A
c2 = CIRCLE C, A, (128,128,0), 3
'CIRCLE mit zwei Punkten: C ist Mittelpunkt, und die Kreislinie geht durch A.
LINEPOLAR t, 20,410, 0º
c3 = CIRCLE A, t, (255,0,0), 1
'CIRCLE mit einem Punkt und einer Geraden: A ist Mittelpunkt, und t eine Tangente.
'Schnittpunkte zwischen einem Kreis und einer Geraden:
P,Q = CROSS t, c2
MARKPOINT P
MARKPOINT Q
'Schnittpunkte zwischen zwei Kreisen:
R,S = CROSS c1, c2
MARKPOINT R
MARKPOINT S
a,b = TANGENT P, c1, &HF01, (0,160,0)
WAIT
END

Du siehst hier zwei neue Varianten des Befehls CROSS:

P,Q = CROSS t, c2
R,S = CROSS c1, c2

Im ersten Fall werden die Schnittpunkte einer Geraden mit einem Kreis konstruiert; im zweiten Fall die Schnittpunkte zweier Kreise. Da es normalerweise zwei Schnittpunkte gibt, musst Du zwei verschiedene Variabeln für die Ergebnisse angeben.
Aber was geschieht, wenn es nur einen Schnittpunkt gibt (im Fall einer Tangente), oder gar keinen? - In diesem Fall wird GeoScript die Punkte P und Q (bzw. R und S) einfach als "ungültig" erklären und sie nicht auf dem Bildschirm anzeigen. Kein Fehler wird Dein Programm unterbrechen; aber wenn Du solche ungültigen Punkte in weiteren Konstruktionen verwendest (z.B. sie mit einer Geraden verbinden möchtest), dann werden die Ergebnisse ebenfalls ungültig sein.
(Anmerkung: Nein, im Fall einer Tangente hat es sich als sinnvoller erwiesen, keinen Schnittpunkt als ungültig zu erklären, sondern beiden denselben Wert zuzuweisen. Die gegenwärtige Version von GeoScript sollte so funktionieren.)

Der letzte Befehl, den wir erklären müssen, ist:

a,b = TANGENT P, c1, &HF01, (0,160,0)

Dies zeichnet die Tangenten (wiederum zwei Variabeln für die möglichen Ergebnisse) vom Punkt P an den Kreis c1. Von den üblichen wahlweisen Parametern (Muster, Farbe, Breite) sind zwei angegeben: &HF01 zeichnet eine Strich-Punkt-Linie, und die Farbe ist Grün.

Dies ist die Ausgabe des Programms:

Auf dem Bildschirm sind zwei graue Elemente zu sehen, die Du vielleicht nicht erwartet hast: eine senkrechte Linie von A auf PQ, und ein Kreis, der durch P und durch den Mittelpunkt des Kreises c1 geht. Das sind Hilfslinien, die Du auch auf dem Papier zeichnen würdest (oder solltest), wenn Du diese Konstruktionen exakt ausführst: sie helfen, die genauen Berührungspunkte der Tangenten zu finden.
Der Computer hat natürlich keine solchen Hilfslinien nötig, um Kreise und Tangenten zu berechnen. Sie werden nur zu Demonstrationszwecken gezeichnet. (Später werden wir sehen, wie man Konstruktionen im Modus FAST ausführen kann, wo diese Hilfslinien nicht erscheinen.)


Übungsvorschläge:
A) Schreibe ein Script, das über einer gegebenen Strecke ein gleichseitiges Dreieck zeichnet. (Ohne LINEPOLAR zu verwenden, damit Du Kreise gebrauchen musst...)
B) Schreibe ein Script, das über einer gegebenen Strecke ein gleichmässiges Sechseck zeichnet.
C) Schreibe ein Script, das einem gegebenen Kreis ein gleichmässiges Sechseck einschreibt.
D) Schreibe ein Script, das einem gegebenen Kreis ein gleichmässiges Sechseck umschreibt.
E) Schreibe ein Script, das einem gegebenen Kreis ein Dreieck umschreibt, von dem eine Ecke P gegeben ist und ein Punkt Q auf der gegenüberliegenden Seite.
F) Wie E, aber statt des Punktes Q ist ein Winkel gegeben (aber nicht jener in P).
G) Schreibe ein Script, das einen Kreis mit dem Radius 80 Pixel zeichnet, der zwei sich schneidende Geraden berührt.

(Wenn Du Dir in den Konstruktionen nicht sicher bist, probiere sie zuerst auf dem Papier aus.)


 

Kapitel 5: Wichtige Linien im Dreieck; Textausgabe
(Befehle MIDDLE, MIDLINE, BISECTOR, REVERT; SCREEN, WINDOW, TEXTWINDOW, TEXT, CLS)

Wenn wir mit GeoScript geometrische Konstruktionen zeigen, wäre es gut, etwas Text auf den Bildschirm zu bringen, um dem Benutzer zu erklären, was wir tun. Es gibt eine Reihe von Bildschirmbefehlen, die das tun. Für eine Textausgabe brauchst Du die folgenden Befehle:

TEXTWINDOW x, y, Breite, Höhe
TEXT "Text" [, Textfarbe, Hintergrundfarbe, Grösse]

Statt TEXTWINDOW kannst Du auch TWINDOW schreiben. Dieser Befehl definiert ein Rechteck, innerhalb dessen der Text erscheinen wird. Du kannst den Befehl TEXT nicht gebrauchen, wenn Du nicht irgendwo vorher im Programm ein TEXTWINDOW definiert hast.
Der "Text" zur Ausgabe muss in Anführungs- und Schlusszeichen "" eingeschlossen sein, und muss auf ein und derselben Linie im Script bleiben. (GeoScript übernimmt den Zeilenumbruch - wenn auch nicht perfekt -, um den Text innerhalb des Textfensters einzupassen.)
Die Bedeutung der wahlweisen Parameter ist: Textfarbe = die Farbe, mit der der Text geschrieben wird. Hintergrundfarbe = die Farbe, mit der das Textfenster ausgefüllt wird. Grösse =Schriftgrösse (Höhe) in Pixel.

Wir setzen also die Befehle TEXTWINDOW und TEXT irgendwo zwischen die Konstruktionsbefehle des vorherigen Programms. Was geschieht? Der Text erscheint nur für einen kurzen Moment. Vielleicht hast Du nicht einmal Zeit, ihn zu sehen. Sobald das nächste Objekt gezeichnet wird, verschwindet der Text. Das geschieht, weil sich das Textfenster innerhalb des Bereichs befindet, wo die Grafiken gezeichnet werden. Somit wird es zugedeckt, sobald die Grafik aktualisiert wird.
Es gibt zwei Arten, dies zu vermeiden:
- Das Programm anhalten mit WAIT, wenn ein Text mitten in einer Konstruktion gezeigt werden soll.
- Den Grafikbereich des Fensters reduzieren, sodass er nicht mehr mit dem Textfenster überlappt.

In unserem Beispielprogramm werden wir die zweite Methode anwenden. Sieh diese Linien an:

SCREEN 600,460
WINDOW 600, 380
TWINDOW 2,380, 596,60

Der Befehl SCREEN definiert die Grösse des Programmfensters (hier 600x460 Pixel). Wenn Du diesen Befehl auslässt (wie in den vorherigen Beispielen), dann wird das Fenster in der vorgegebenen Grösse von 640x480 initialisiert.
Der Befehl WINDOW definiert die Grösse des Bereichs, wo Grafiken gezeichnet werden. Dieser Bereich wird rechts und unten abgeschnitten, wenn er kleiner ist als das Programmfenster. In unserem Beispiel füllen also die Grafiken die ganze Fensterbreite von 600 Pixeln aus, aber nur 380 Pixel der Höhe. 460-380=80 Pixel bleiben also unten frei für Text.
Unser Textfenster beginnt also bei der y-Koordinate 380 und ist 60 Pixel hoch. (Beachte, dass die untersten 20 Pixel von den Standard-Knöpfen beansprucht werden. Diese würden einen Text zudecken, der dort gezeigt würde.)
Du kannst natürlich die Grösse und den Ort des Textfensters während des Programms ändern. Aber in unserem Beispiel hier werden wir während des ganzen Programms dasselbe Textfenster benutzen.

Nach dieser Initialisation konstruieren wir ein Dreieck und schreiben seine Teile an, wie im Kapitel 3. Diesen Programmteil hier zu wiederholen ist unnötig. Nachher schreiben wir einen Text auf den Bildschirm, um zu erklären, was wir tun:

TEXT "Wir verbinden jede Ecke des Dreiecks mit der Mitte der gegenüberliegenden Seite.
Die resultierenden Geraden schneiden sich im Schwerpunkt des Dreiecks.", (0,0,255)

(Beachte, dass im wirklichen Programm dieser ganze Text auf einer einzigen Linie stehen muss. Ich schreibe ihn hier nur deshalb auf zwei Linien, damit Du nicht das Fenster scrollen musst, um ihn zu lesen.)

Dann konstruieren und markieren wir den Schwerpunkt mit den folgenden Befehlen:

D = MIDDLE B,C
E = MIDDLE A,C
F = MIDDLE A,B
d = LINE A,D, -1, (0,0,255)
e = LINE B,E, -1, (0,0,255)
f = LINE C,F, -1, (0,0,255)
G = CROSS d, e, -1, (0,0,255)
MARKPOINT G

Der Befehl MIDDLE setzt einfach einen Punkt genau in die Mitte zwischen zwei anderen Punkten. Du kannst, wenn Du willst, den Stil, die Farbe und die Breite des resultierenden Punktes angeben.
Jetzt wollen wir, dass der Benutzer dieses Bild wirklich ansehen kann; also unterbrechen wir das Programm mit WAIT. Aber bevor wir das tun, informieren wir mit einem Text den Benutzer darüber, was wir von ihm erwarten:

TEXT "Klicke auf 'Weiter', um weiterzufahren.", (255,255,0), (160,0,0)
WAIT

Als nächstes konstruieren wir den Umkreis des Dreiecks. Wir schreiben wieder einen erklärenden Text, und führen dann die folgende Konstruktion aus:

h = MIDLINE B,C, -1, (255,0,0)
i = MIDLINE A,C, -1, (255,0,0)
j = MIDLINE A,B, -1, (255,0,0)
M = CROSS h,i, -1, (255,0,0)
MARKPOINT M
c1 = CIRCLE M,A, (255,0,0)

Der Befehl MIDLINE zeichnet die Mittelsenkrechte zwischen zwei Punkten, und hat dieselben wahlweisen Parameter wie alle Konstruktionsbefehle (Muster, Farbe und Breite, im Fall einer Geraden). Du wirst wieder einige Hilfslinien erscheinen sehen, die die tatsächliche Konstruktion auf Papier simulieren.
Hier ist das Ergebnis:

Jetzt haben wir bereits eine Menge Linien auf dem Bildschirm, und noch weitere dazuzuzeichnen würde ziemlich unordentlich aussehen. Deshalb löschen wir den Bildschirm - nach einem WAIT - mit dem Befehl CLS. Du kannst wahlweise eine Hintergrundfarbe angeben; z.B. CLS (0,0,100) wird den Bildschirm dunkelblau ausfüllen.
Aber jetzt müssen wir unser Dreieck wieder zeichnen. Wir kopieren hier also dieselbe Serie von Befehlen wie am Anfang. Danach können wir im Dreieck eine neue Konstruktion ausführen. Diesmal konstruieren wir den Inkreis:

d = BISECTOR c,b, -1, (0,190,0)
REVERT c
e = BISECTOR a,c, -1, (0,190,0)
REVERT a
REVERT b
f = BISECTOR b,a, -1, (0,190,0)
M = CROSS d,e, -1, (0,190,0)
c2 = CIRCLE M, a, (0,190,0)

Der Befehl BISECTOR zeichnet die Winkelhalbierende des Winkels zwischen zwei gegebenen Geraden. Und wozu dient REVERT? - Das hat wiederum mit der Richtung der Vektoren zu tun. Wie wir in einem früheren Kapitel erwähnten, kann der Winkel zwischen zwei Geraden auf verschiedene Arten verstanden werden. Ebenso gibt es mehrere Arten, eine Winkelhalbierende zwischen zwei Geraden zu zeichnen. BISECTOR wird immer den Winkel im Gegenuhrzeigersinn von Gerade1 zu Gerade2 verwenden. Wenn die Vektoren dieser Geraden nicht in die gewünschte Richtung zeigen, dann müssen wir sie mit REVERT umdrehen. Dieser Befehl ändert nichts an dem Ort und dem Aussehen einer Geraden; er dreht einfach ihren Vektor in die entgegengesetzte Richtung um.
Wenn Du wissen möchtest, was das für einen Unterschied macht, dann kannst Du die REVERT-Befehle herausnehmen (oder mit einem vorgesetzen Apostroph in Anmerkungen verwandeln), das Script so laufenlassen und beobachten, was geschieht.

Das Programm hat einen letzten Teil, welcher die Höhen konstruiert. In diesem Teil gibt es nichts Neues. Hier ist das vollständige Programm:

SCREEN 600,460
WINDOW 600, 380
TWINDOW 2,380, 596,60
POINT A = 70,340
POINT B = 530,340
POINT C = 140,40
c = LINE A,B
b = LINE A,C
a = LINE B,C
MARKPOINT A, -1, 2
MARKPOINT B, -1, 2
MARKPOINT C
MARKLINE a
MARKLINE b
MARKLINE c, -1, 1
TEXT "Wir verbinden jede Ecke des Dreiecks mit der Mitte der gegenüberliegenden Seite.
Die resultierenden Geraden schneiden sich im Schwerpunkt des Dreiecks.", (0,0,255)
D = MIDDLE B,C
E = MIDDLE A,C
F = MIDDLE A,B
d = LINE A,D, -1, (0,0,255)
e = LINE B,E, -1, (0,0,255)
f = LINE C,F, -1, (0,0,255)
G = CROSS d, e, -1, (0,0,255)
MARKPOINT G
TEXT "Klicke auf 'Weiter', um weiterzufahren.", (255,255,0), (160,0,0)
WAIT
TEXT "Jetzt zeichnen wir die Mittelsenkrechten der drei Seiten.
Sie schneiden sich im Mittelpunkt des Umkreises.", (255,0,0)
h = MIDLINE B,C, -1, (255,0,0)
i = MIDLINE A,C, -1, (255,0,0)
j = MIDLINE A,B, -1, (255,0,0)
M = CROSS h,i, -1, (255,0,0)
MARKPOINT M
c1 = CIRCLE M,A, (255,0,0)
TEXT "Klicke auf 'Weiter', um weiterzufahren.", (255,255,0), (160,0,0)
WAIT
CLS
'Jetzt müssen wir das Dreieck wieder zeichnen.
c = LINE A,B
b = LINE A,C
a = LINE B,C
MARKPOINT A, -1, 2
MARKPOINT B, -1, 2
MARKPOINT C
MARKLINE a, -1, 1
MARKLINE b
MARKLINE c, -1, 1
TEXT "Wir halbieren jeden Winkel des Dreiecks. Der Schnittpunkt der Winkelhalbierenden
ist der Mittelpunkt des Inkreises.", (0,190,0)
d = BISECTOR c,b, -1, (0,190,0)
'Wir müssen den Vektor von c umdrehen, sodass sein Ursprung in B liegt
'  und die Winkelhalbierende den richtigen Winkel halbiert.
REVERT c
e = BISECTOR a,c, -1, (0,190,0)
REVERT a
REVERT b
f = BISECTOR b,a, -1, (0,190,0)
M = CROSS d,e, -1, (0,190,0)
c2 = CIRCLE M, a, (0,190,0)
TEXT "Klicke auf 'Weiter', um weiterzufahren.", (255,255,0), (160,0,0)
WAIT
TEXT "Die Höhe eines Dreiecks ist eine senkrechte Gerade von einer Ecke zur gegenüberliegenden
Seite. Es gibt drei Höhen, und sie schneiden sich in einem Punkt.", (160,0,160)
hc = LINEPOLAR C,c, 90º, -1, (160,0,160)
ha = LINEPOLAR A,a, 90º, -1, (160,0,160)
hb = LINEPOLAR B,b, 90º, -1, (160,0,160)
H = CROSS hc, ha, -1, (160,0,160)
MARKPOINT H
TEXT "Klicke auf 'Weiter' oder 'Beenden', um das Programm zu beenden.", (255,255,0), (160,0,0)
WAIT
END

Und hier ist die Ausgabe der zweiten Programmhälfte:


Übungsvorschläge:
A) Schreibe ein Script, das einen Kreis konstruiert, welcher durch zwei gegebene Punkte geht und einen Radius von 120 Pixeln hat.
B) Füge zum Script von Übung A einige erklärende Texte hinzu.
C) Schreibe ein Script, das über einer gegebenen Strecke ein Quadrat konstruiert und dieses in 4 gleiche Quadrate aufteilt.
D) Schreibe ein Script, das einen Winkel von 75º konstruiert, ohne LINEPOLAR zu verwenden. Füge einen erklärenden Text hinzu.


 

Kapitel 6: Subroutine "CONSTRUCTION"
(Befehle CONSTRUCTION, REPEAT, CALL / CONSTRUCT, FAST, PACE, SLOW / TOOLS, IPOINT)

Im letzten Beispiel mussten wir dasselbe Dreieck zweimal zeichnen. Statt dieselben Befehle zweimal zu schreiben, gibt es einen besseren Weg, dies zu tun. Wir können diese Befehle in eine Subroutine vom Typ CONSTRUCTION schreiben. Dann brauchen wir im Hauptprogramm nur eine einzige Linie, um mit CALL diese Subroutine aufzurufen. Alle Befehle, die in der Subroutine enthalten sind, werden ausgeführt, und dann fährt das Programm normal weiter mit der Linie, die auf CALL folgt.

Subroutine müssen nach allen Befehlen des Hauptprogramms aufgeführt werden. Wir setzen also ans Ende unseres Programms den folgenden Block von Befehlen:

CONSTRUCTION Dreieck A,B,C
  c = LINE A,B
  b = LINE A,C
  a = LINE B,C
  MARKPOINT A, -1, 2
  MARKPOINT B, -1, 2
  MARKPOINT C
  MARKLINE a
  MARKLINE b
  MARKLINE c, -1, 1
REPEAT

Das Wort CONSTRUCTION sagt GeoScript, dass hier eine Subroutine vom Typ "CONSTRUCTION" beginnt. "Dreieck" ist der Name der Subroutine. (Jede Subroutine muss einen Namen haben, damit wir sie von einer anderen Stelle des Programms her beim Namen rufen können.) A,B,C sind die Parameter der Subroutine.

Parameter weiterzugeben ist ein wichtiges Konzept beim Programmieren. Wenn Du mit CALL die Subroutine "Dreieck" aufrufst, dann erwartet die Subroutine, dass Du ihr drei Punkte gibst, um damit zu arbeiten. Das müssen nicht unbedingt die Punkte A,B,C des Hauptprogramms sein; es können irgendwelche Punkte sein. Du kannst z.B. schreiben: "CALL Dreieck D,E,F". Dann wird die Subroutine aus den Punkten D, E und F ein Dreieck konstruieren. Überall in der Subroutine, wo die Variable A erscheint, wird sie stattdessen D verwenden; ebenso E anstelle von B und F anstelle von C.
Du musst sicherstellen, dass Du die Subroutine mit dem richtigen Typ von Parametern aufrufst. Wenn Du z.B. versuchst "CALL Dreieck ha, hb, hc", dann erhältst Du eine Fehlermeldung: "Typen stimmen nicht überein", weil ha, hb und hc an einem anderen Ort des Programms als Geraden definiert sind, nicht als Punkte.
Innerhalb einer Subroutine sind alle Variabeln, die nicht als Parameter definiert sind, global; d.h. es sind dieselben Variabeln wie jene mit demselben Namen im Hauptprogramm. So sind z.B. in der obigen Subroutine die Geraden a, b und c globale Variabeln. Wenn Du "Dreieck" aufrufst, dann werden sich nachher die Geraden a, b und c verändert haben. (Andere Programmiersprachen gebrauchen "lokale Variabeln" in ihren Subroutinen. Aber in GeoScript gibt es keine lokalen Variabeln.)
Andererseits sind wie erwähnt die Parameter A,B,C nicht dasselbe wie A,B,C im Hauptprogramm. Nehmen wir an, die Subroutine würde die Werte der Parameter A, B und C verändern (was im obigen Beispiel nicht der Fall ist).Wenn wir sie aufrufen mit "CALL Dreieck D,E,F", dann wird sich an den Punkten A, B und C nichts ändern; aber die Punkte D, E und F würden mit veränderten Werten zurückkommen.
Beachte, dass in den Namen von Subroutinen Gross- und Kleinbuchstaben unterschieden werden: Wenn Du "CALL DREIECK" rufst, dann wird "Dreieck" nicht antworten, da es seinen Namen in dieser Form nicht wiedererkennt.

Jede Subroutine endet mit dem Befehl REPEAT. Nach REPEAT kannst Du wahlweise eine Zahl schreiben, die angibt, wie oft die Subroutine wiederholt werden soll. Wenn Du z.B. "REPEAT 5" schreibst, dann wird sich die Subroutine fünfmal wiederholen, bevor sie zum Hauptprogramm zurückkehrt. Wenn Du keine Zahl schreibst, wird die Subroutine nur einmal ausgeführt und kehrt dann zurück.

(In diesem Lehrgang gibt es keine Beispiele für wiederholte CONSTRUCTIONen. Aber Du kannst in den anderen Beispielprogrammen welche finden; z.B. in "Spirale.geo" und in "Kegelschnitte.geo".).

Wenn Du eine CONSTRUCTION aufrufst, kannst Du statt CALL auch CONSTRUCT schreiben.

Ausführungsmodi

Es gibt drei verschiedene Modi, mit denen eine Subroutine aufgerufen werden kann: SLOW, PACE und FAST.

PACE ist der Modus, den Du bis jetzt gesehen hast: Objekte werden eins ums andere auf den Bildschirm gezeichnet, mit einer Wartezeit von zwei Sekunden nach jedem. (Der Benutzer kann jedoch diese Wartezeiten überspringen, indem er irgendeine Taste drückt ausser "R", [Esc] und [PageUp].) Wenn Du keinen Modus angibst, werden CONSTRUCTIONen in diesem Modus ausgeführt. Das Hauptprogramm wird immer im Modus PACE ausgeführt.

Der Modus FAST zeichnet die ganze CONSTRUCTION auf einmal, so schnell, wie es die Leistungsfähigkeit Deines Computers erlaubt.

Der Modus SLOW ist für bewegte Konstruktionen zu Ausbildungszwecken. Er zeigt nicht nur die geometrischen Objekte an, sondern auch eine bewegte Zeichnung der Werkzeuge, mit denen man die betreffenden Objekte auf dem Papier zeichnen würde (Lineal, Zirkel, usw.) Das dauert natürlich seine Zeit, aber es ist interessant anzusehen, besonders für Anfänger. - Statt SLOW kannst Du auch TOOLS schreiben
Dies ist ein Ausschnitt aus einer solchen "Werkzeug-Zeichnung" aus dem untenstehenden Beispiels-Script:

In einem Befehl CALL muss das Schlüsselwort für den Modus nach dem Namen der Subroutine stehen, aber vor den Parametern. Zum Beispiel:

CALL Dreieck FAST, X, Y, Z

Das untenstehende Beispielprogramm zeigt Beispiele für alle drei Modi. Es ist im wesentlichen dasselbe wie im vorhergehenden Kapitel. Aber da wir jetzt die Subroutinen einüben, sind die anderen Konstruktionen (Schwerpunkt, Umkreis, usw.) auch in Subroutinen verpackt worden, und werden vom Hauptprogramm aus mit CALL aufgerufen. Und Du wirst sehen, dass in der Mitte des Programms das Dreieck mit anderen Punkten initialisiert wird.

- Es gibt noch eine weitere Änderung in diesem Programm: Wo die Punkte A,B,C initialisiert werden, siehst Du, dass wir statt POINT den Befehl IPOINT gebrauchen. Das "I" steht für "Invisible" (unsichtbar). Punkte, die mit IPOINT initialisiert werden, erscheinen nicht auf dem Bildschirm und verbrauchen deshalb auch keine Wartezeit. (Das langsame Erscheinen der drei Punkte in den vorhergehenden Beispielen wird Dich schon gelangweilt haben.) - Später im Programm kannst Du immer noch die Punkte markieren, die mit IPOINT initialisiert wurden.

Ebenso kannst Du fast allen Initialisierungs- und Konstruktionsbefehlen ein "I" voransetzen: ILINE, ICIRCLE, ICROSS, IMIDLINE, usw.

SCREEN 600,460
WINDOW 600, 380
TWINDOW 2,380, 596,60
IPOINT A = 70,340
IPOINT B = 530,340
IPOINT C = 140,40
TEXT "Dreieckskonstruktion im Modus PACE. Das ist der vorgegebene Wert."
CALL Dreieck PACE A,B,C
TEXT "Schwerpunktskonstruktion im Modus FAST. Drücke 'Weiter', um weiterzufahren."
CALL Schwerpunkt FAST A,B,C
WAIT
'Wir löschen den Bildschirm und zeichnen das Dreieck wieder:
CLS
CALL Dreieck FAST A,B,C
TEXT "Umkreiskonstruktion im Modus SLOW."
CALL Umkreis SLOW A,B,C
CLS
TEXT "Inkreiskonstruktion im vorgegebenen Modus (PACE)."
'Jetzt initialisieren wir unser Dreieck mit anderen Punkten:
POINT X, 100,80, 3,(0,160,0)
POINT Y, 400,80, 3,(0,160,0)
POINT Z, 250,300, 3,(0,160,0)
'Hier ist es nicht nötig, "Dreieck" aufzurufen: "Inkreis" zeichnet die Seiten.
CALL Inkreis X,Y,Z
WAIT 4000         'Wir warten 4 Sekunden.
CLS
TEXT "Höhenkonstruktion im Modus SLOW."
Markpoint X
Markpoint Y
Markpoint Z
'Hier ist es nicht nötig, "Dreieck" aufzurufen: "Höhen" zeichnet die Seiten.
CONSTRUCT Höhen SLOW X,Y,Z
TEXT "Klicke auf 'Weiter' oder 'Beenden', um das Programm zu beenden.", (255,255,0), (160,0,0)
WAIT
END
' Das Hauptprogramm endet hier. Die Subroutinen beginnen hier.
CONSTRUCTION Dreieck A,B,C
  c = LINE A,B
  b = LINE A,C
  a = LINE B,C
  MARKPOINT A, -1, 2
  MARKPOINT B, -1, 2
  MARKPOINT C
  MARKLINE a
  MARKLINE b
  MARKLINE c, -1, 1
REPEAT
CONSTRUCTION Schwerpunkt A,B,C
  D = MIDDLE B,C
  E = MIDDLE A,C
  F = MIDDLE A,B
  d = LINE A,D, -1, (0,0,255)
  e = LINE B,E, -1, (0,0,255)
  f = LINE C,F, -1, (0,0,255)
  G = CROSS d, e, -1, (0,0,255)
  MARKPOINT G
REPEAT
CONSTRUCTION Umkreis A,B,C
  h = MIDLINE B,C, -1, (255,0,0)
  i = MIDLINE A,C, -1, (255,0,0)
  j = MIDLINE A,B, -1, (255,0,0)
  M = CROSS h,i, -1, (255,0,0)
  MARKPOINT M
  c1 = CIRCLE M,A, (255,0,0)
REPEAT
CONSTRUCTION Inkreis A,B,C
  c = LINE A,B
  b = LINE A,C
  a = LINE B,C
  d = BISECTOR c,b, -1, (0,190,0)
  REVERT c
  e = BISECTOR a,c, -1, (0,190,0)
  REVERT a
  REVERT b
  f = BISECTOR b,a, -1, (0,190,0)
  M = CROSS d,e, -1, (0,190,0)
  c2 = CIRCLE M, a, (0,190,0)
REPEAT
CONSTRUCTION Höhen A,B,C
  c = LINE A,B
  b = LINE A,C
  a = LINE B,C
  hc = LINEPOLAR C,c, 90º, -1, (160,0,160)
  ha = LINEPOLAR A,a, 90º, -1, (160,0,160)
  hb = LINEPOLAR B,b, 90º, -1, (160,0,160)
  H = CROSS hc, ha, -1, (160,0,160)
  MARKPOINT H
REPEAT

Übungsvorschläge:
A) Verwende das Script von Kapitel 5, Übung C. Schreibe es neu als CONSTRUCTION, welche als Parameter die zwei Endpunkte der gegebenen Strecke annimmt, und über diesen Punkten das Quadrat konstruiert und teilt. Rufe vom Hauptprogramm aus diese CONSTRUCTION mehrmals auf, mit verschiedenen Punkten als Parameter.
B) Schreibe eine CONSTRUCTION, die als Parameter einen Punkt, eine Gerade und einen Kreis annimmt, und einen Kreis mit demselben Radius wie des gegebenen Kreises konstruiert, der durch den gegebenen Punkt geht und die gegebene Gerade berührt. (Vielleicht möchtest Du hier den Befehl
MOVECIRCLE gebrauchen. Es gibt aber auch andere Alternativen.)


 

Kapitel 7: Bewegte Konstruktionen
(Befehle ANIMATION, STEP, TRACE)

Im vorangehenden Kapitel haben wir Subroutinen vom Typ CONSTRUCTION gesehen. Es gibt zwei andere Arten von Subroutinen. Eine davon ist ANIMATION. Sie erlaubt es, dieselbe Konstruktion viele Male zu wiederholen, während sich die Ausgangspunkte bewegen. Im Modus FAST gibt dies den Eindruck einer geometrischen Figur, die laufend ihre Form ändert.

Das folgende Beispiel benutzt die CONSTRUCTIONen "Dreieck" und "Umkreis", die wir bereits aus dem vorigen Kapitel kennen. Aber diese zwei Subroutinen werden jetzt von innerhalb einer anderen Subroutine vom Typ ANIMATION aufgerufen, die so aussieht:

ANIMATION Um
  STEP A, 4,-1
  TRACE M
  CALL Dreieck FAST A,B,C
  CALL Umkreis FAST A,B,C
REPEAT 150

Zuerst haben wir das Schlüsselwort ANIMATION und den Namen der Subroutine. ANIMATIONen können keine Parameter haben. - Dann finden wir zwei neue Befehle:

STEP A, 4,-1

Der Befehl STEP sagt dem Punkt A, dass er sich bewegen soll. Die Zahlen geben an, um wieviele Pixel sich der Punkt von einer Wiederholung zur andern bewegen soll: 4 Pixel nach rechts und 1 Pixel nach oben.
Man kann mit STEP nicht nur Punkte bewegen, sondern auch Kreise (aber keine Geraden). Siehe im GeoScript-Manual.

TRACE M

Der Befehl TRACE gibt an, dass der Punkt M eine "Spur" zurücklassen soll, während sich die Konstruktion bewegt. Während die anderen Objekte bei jeder Wiederholung gelöscht und neu gezeichnet werden, wird der Punkt M eine Spur hinter sich lassen, bestehend aus allen Positionen von M seit Beginn der Bewegung. - Nach TRACE können auf derselben Linie bis zu 14 Punkte angegeben werden.

Die Befehle STEP und TRACE wirken sich generell auf die ganze Subroutine aus, unabhänging davon, wo innerhalb der Subroutine sie stehen.

- Nach diesen Befehlen rufen wir mit CALL unsere Konstruktionen "Dreieck" und "Umkreis" auf. Beachte, dass eine ANIMATION andere Subroutinen aufrufen kann, aber eine CONSTRUCTION kann keine andere Subroutine aufrufen.
(Anmerkung: Leicht geändert in der aktuellen Version. Eine CONSTRUCTION, die keine Parameter hat, kann jetzt eine andere CONSTRUCTION (mit oder ohne Parameter) aufrufen.)
- Schliesslich geben wir mit REPEAT 150 an, dass die ganze Subroutine 150mal wiederholt werden soll.

Vom Hauptmodul aus rufen wir unsere Bewegung "Um" im Modus FAST auf. (Das ist der vorgegebene Modus für eine ANIMATION.) Führe das Programm aus und sieh zu, wie die Punkte laufen!

WINDOW 640,400
TWINDOW 2,400, 636,60

IPOINT A = 70,340
IPOINT B = 530,340
IPOINT C = 140,40

TEXT "Sieh, wie sich der Umkreis ändert, wenn A sich auf a zubewegt."
CALL Um FAST

TEXT "Klicke auf 'Weiter' oder 'Beenden', um das Programm zu beenden.", (255,255,0), (160,0,0)
WAIT
END

CONSTRUCTION Dreieck A,B,C
  c = LINE A,B
  b = LINE A,C
  a = LINE B,C
  MARKPOINT A, -1, 2
  MARKPOINT B, -1, 2
  MARKPOINT C
  MARKLINE a
  MARKLINE b
  MARKLINE c, -1, 1
REPEAT

CONSTRUCTION Umkreis A,B,C
  h = MIDLINE B,C, -1, (255,0,0)
  i = MIDLINE A,C, -1, (255,0,0)
  j = MIDLINE A,B, -1, (255,0,0)
  M = CROSS h,i, -1, (128,0,0)
  MARKPOINT M
  c1 = CIRCLE M,A, (255,0,0)
REPEAT

ANIMATION Um
  STEP A, 4,-1
  TRACE M
  CALL Dreieck FAST A,B,C
  CALL Umkreis FAST A,B,C
REPEAT 150

Hier ist die Ausgabe nach einigen Wiederholungen:


Übungsvorschläge:
A) Verwandle auch die anderen Konstruktionen von Kapitel 6 (Schwerpunkt, Inkreis, Höhen) in bewegte Konstruktionen, in derselben Weise wie im obigen Beispiel.
B) Schreibe ein Script, das mit einem kleinen Quadrat anfängt und es allmählich vergrössert, während sein Mittelpunkt am selben Ort bleibt.
C) Wie B, aber zeichne zusätzlich mit TRACE die Spur der Ecken des Quadrats nach.


 

Kapitel 8: Subroutine "INTERACTION"
(Befehle INTERACTION, CLICKABLE)

Die dritte Art von Subroutinen in GeoScript ist INTERACTION. Sie ähnelt ANIMATION in der Hinsicht, dass sie dieselbe Konstruktion von verschiedenen Ausgangspunkten her wiederholt zeichnet. Aber während ANIMATION die Punkte automatisch bewegt, lässt INTERACTION den Benutzer die Punkte mit der Maus umherziehen.
Sehen wir uns diese neue Art von Subroutine an:

INTERACTION Um
  CLICKABLE A, B
  CALL Dreieck FAST A,B,C
  CALL Umkreis FAST A,B,C
REPEAT

Hier haben wir keine Befehle STEP und TRACE. Stattdessen haben wir den Befehl CLICKABLE. Er gibt an, welche Punkte mit der Maus gezogen werden können (in unserem Beispiel sind es A und B). Wie bei TRACE, kannst Du nach CLICKABLE bis zu 14 Punkte auf derselben Linie schreiben. Nur Punkte können CLICKABLE sein, aber keine Geraden oder Kreise.
Die Punkte, auf die man klicken kann, werden nicht besonders markiert auf dem Bildschirm. Du musst sie also selber kenntlich machen, entweder indem Du sie mit einem besonderen Stil versiehst, oder indem Du einen Text ausgibst, der dem Benutzer sagt, welche Punkte er umherziehen kann, oder beides.

Eine INTERACTION wird unbegrenzt wiederholt, bis der Benutzer auf den "Beenden"-Knopf klickt oder die [Esc]-Taste drückt. Daher hat es in einer INTERACTION keinen Sinn, eine REPEAT-Zahl anzugeben.

Im Modus FAST funktioniert eine INTERACTION anders als im SLOW- oder PACE-Modus: Im FAST-Modus wird die Konstruktion fortwährend aktualisiert, während der Benutzer noch daran ist, einen Punkt umherzuziehen. Das ergibt den Eindruck, als ob man die ganze Figur umherziehen und ihre Form dynamisch ändern würde. Das kannst Du beobachten, wenn Du das untenstehende Script laufenlässt.
Im Modus PACE und SLOW hingegen wird die Konstruktion erst aktualisiert, wenn Du nach dem Ziehen eines Punktes die Maustaste loslässt.

Probiere jetzt das folgende Beispielprogramm aus:

WINDOW 640,420
TWINDOW 2,420, 636,40

'Wir tun die Initialisierung der Punkte in eine CONSTRUCTION,
'sodass wir sie im Modus FAST aufrufen können.

CALL Init FAST

TEXT "Ziehe den Punkt A oder B mit der Maus und sieh, wie sich der Umkreis verändert.
Klicke auf 'Beenden' oder drücke [Esc], um das Programm zu beenden."
CALL Um FAST
END

CONSTRUCTION Init
  POINT A = 70,340, 4, (255,0,0)
  POINT B = 530,340, 4, (255,0,0)
  IPOINT C = 140,40
REPEAT

CONSTRUCTION Dreieck A,B,C
  c = LINE A,B
  b = LINE A,C
  a = LINE B,C
  MARKPOINT A, -1, 2
  MARKPOINT B, -1, 2
  MARKPOINT C
  MARKLINE a
  MARKLINE b
  MARKLINE c, -1, 1
REPEAT

CONSTRUCTION Umkreis A,B,C
  h = MIDLINE B,C, -1, (0,0,255)
  i = MIDLINE A,C, -1, (0,0,255)
  j = MIDLINE A,B, -1, (0,0,255)
  M = CROSS h,i, -1, (0,0,255)
  MARKPOINT M
  c1 = CIRCLE M,A, (0,0,255)
REPEAT

INTERACTION Um
  CLICKABLE A, B
  CALL Dreieck FAST A,B,C
  CALL Umkreis FAST A,B,C
REPEAT

Übungsvorschläge:
A) Verwandle auch die anderen Konstruktionen von Kapitel 6 (Schwerpunkt, Inkreis, Höhen) in INTERACTIONen, in derselben Weise wie im obigen Beispiel.
B) Schreibe ein Script, das es dem Benutzer ermöglicht, die Grösse eines Rechtecks zu verändern, indem er an einer seiner Ecken zieht (während der Mittelpunkt des Rechtecks am selben Ort bleibt).
C) Schreibe ein Script, das es dem Benutzer ermöglicht, die Grösse eines Quadrats zu verändern und es zu drehen, indem er an einer seiner Ecken zieht (während der Mittelpunkt des Quadrats am selben Ort bleibt).


 

Kapitel 9: Bewegungen einschränken in bewegten Konstruktionen und Interaktionen
(Befehle ALONG, COPY, FILL)

Manchmal ist es nützlich, einen Punkt zu bewegen (oder den Benutzer ihn umherziehen zu lassen), aber nicht auf dem ganzen Bildschirm umher, sondern nur entlang einer bestimmten Linie. In diesem Kapitel z.B. wollen wir das Gesetz visuell illustrieren, dass alle Winkel über derselben Sehne in einem Kreis gleich sind. Dazu brauchen wir einen Kreis, eine Sehne, und einen Punkt, der sich bewegt - aber nur entlang der Kreislinie. Das Schlüsselwort ALONG ermöglicht es, bewegliche Punkte so zu dressieren, dass sie diesem Befehl Folge leisten. Das folgende Beispiel demonstriert den Gebrauch von ALONG sowohl in einer ANIMATION als auch in einer INTERACTION.

In der ANIMATION haben wir die folgende Linie:

  STEP P ALONG c1, 3

Das sagt dem Punkt P, dass er sich dem Kreis c1 entlang bewegen soll. (Statt einem Kreis kann man auch eine Gerade angeben nach ALONG.) - Da die Bewegung des Punktes jetzt auf eine Kreislinie begrenzt ist, können wir ihm nicht mehr eine x- und eine y-Koordinate geben für diese Bewegung. Wir können ihm nur noch einen einzigen Parameter geben: den Abstand, den er in jeder Wiederholung zurücklegen soll (3 Pixel in unserem Beispiel); und die Richtung ist festgelegt durch den Kreis oder die Gerade, wo sich der Punkt entlangbewegt.
Auf einem Kreis bedeutet ein positiver Wert, dass sich der Punkt im Gegenuhrzeigersinn bewegt, und ein negativer Wert bedeutet im Uhrzeigersinn. Auf einer Gerade bedeutet ein positiver Wert vorwärts in Richtung des Vektors der Geraden, und ein negativer Wert bedeutet rückwärts.

Sehen wir jetzt die Subroutine INTERACTION an. Hier haben wir eine ähnliche Linie:

CLICKABLE P ALONG c1

Mit diesem Befehl kann der Benutzer den Punkt P unherziehen, aber er wird ihn nicht von der Kreislinie wegbringen können. Wenn Du das Script ausführst und es ausprobierst, wirst Du den Effekt sehen.

Hier ist das ganze Programm:

WINDOW 640,420
TWINDOW 2,420, 636,40

TEXT "Alle Winkel über derselben Sehne in einem Kreis sind gleich."
CONSTRUCT Init FAST
ANIMATE BewegeWinkel FAST
TEXT "Ziehe jetzt selber den Punkt P um den Kreis herum."
INTERACT ZieheWinkel FAST
END

CONSTRUCTION Init
  CIRCLE c1, 320,200, 170, (0,0,255)
  FILL c1, (0,0,255), 20
  ILINE invisible, 0,310, 600,310
  A,B = CROSS invisible, c1
  chord = LINE A,B
  P = COPY B
REPEAT

ANIMATION BewegeWinkel
  'Wir begrenzen die Bewegung des Punktes P auf den Kreis c1:
  STEP P ALONG c1, 3
  MARKPOINT P
  a = LINE P,A, -1, (128,0,0)
  b = LINE P,B, -1, (128,0,0)
  MARKNUMBERANGLE a,b, "a"
REPEAT 250

INTERACTION ZieheWinkel
  'Wir begrenzen die Bewegung des Punktes P auf den Kreis c1:
  CLICKABLE P ALONG c1
  MARKPOINT P
  a = LINE P,A, -1, (128,0,0)
  b = LINE P,B, -1, (128,0,0)
  MARKNUMBERANGLE a,b, "a"
REPEAT

Zwei weitere Befehle in diesem Programm benötigen eine Erklärung, beide in der CONSTRUCTION Init::

FILL c1, (0,0,255), 20

Dieser Befehl führt keine Konstruktion aus. Er füllt einfach den bereits existierenden Kreis c1 mit einer Farbe aus. Die Zahl 20 gibt die Farbintensität auf einer Skala von 0 bis 255 an. 0 ist völlig durchsichtig (d.h. man sieht gar nichts von der Farbfüllung); 255 ist volle Intensität (deckend). Wenn es sich um einen Teilkreis handelt (einen Bogen), dann wird nur der Sektor ausgefüllt, der dem Bogen entspricht.
Es gibt eine andere Form des Befehls FILL, der ein Dreieck ausfüllt; hier musst Du die drei Punkte des Dreiecks angeben:
FILL Punkt1, Punkt2, Punkt3 [, Farbe, Intensität]
FILL ist eine relativ langsame Operation. Wenn Du sie in einer Subroutine gebrauchst, die wiederholt im Modus FAST aufgerufen wird, dann kann das Bild flimmern, wenn Du einen älteren Computer hast.

Der andere neue Befehl in diesem Programm ist:

P = COPY B

Wir wollen, dass der bewegliche Punkt P am selben Ort startet wie der Punkt B auf dem Kreis. Wir "kopieren" also den Punkt B in die Variable P. P hat dann genau dieselben Koordinaten und dasselbe Aussehen wie B.
Du kannst Punkte, Geraden und Kreise kopieren. Wenn Du aber dies versuchst: "A = COPY a", wobei A ein Punkt ist und a eine Gerade, dann wird sich GeoScript über einen Fehler beklagen: "Typen stimmen nicht überein."

Dies ist das Ergebnis des Programms in zwei verschiedenen Etappen:


Übungsvorschläge:
A) Schreibe eine ANIMATION, die die Bewegung der Zeiger auf einer Uhr simuliert. Schreibe auch die Zahlen von I bis XII an ihrem entsprechenden Ort auf den Bildschirm.
B) Schreibe eine ANIMATION, die eine Zykloide zeichnet (den Weg eines Punktes auf dem Umfang eines Rades, das der Strasse entlangrollt).
C) Schreibe eine INTERACTION, die dem Benutzer ermöglicht, die Spitze eines Dreiecks zu ziehen, aber ohne dessen Höhe zu verändern. Erkläre in einem Text, dass die Fläche des Dreiecks dabei gleich bleibt. Fülle das Dreieck mit einer Farbe aus.


 

Kapitel 10: Ein Menu
(Befehle MENU, MENUITEM, EXITMENU, ENDMENU, REPEATMENU)

Es ist praktisch, in einem Programm ein Menu zu haben. (Ausser dass es einen ans Essen erinnert, während man ans Programmieren denken sollte.) Der Benutzer kann auf einen Blick sehen, was das Programm anbietet, und kann die Optionen auswählen, die er möchte.
Ein GeoScript-Fenster hat kein Menu, nur die drei vorgegebenen Knöpfe, wie Du in den vorherigen Beispielen gesehen hast. Aber Du kannst in einem GeoScript-Programm einfache Menu-Listen programmieren. Dies ist ein Script für ein einfaches Menu:

MENU
  MENUITEM "Option 1"
    TEXT "Du hast Option 1 ausgewählt."
  MENUITEM "Option 2"
    TEXT "Du hast Option 2 ausgewählt."
  MENUITEM "Option 3"
    TEXT "Du hast Option 3 ausgewählt."
ENDMENU
WAIT
END

Dieses Menu macht natürlich nichts Interessantes. Aber es zeigt, wie es funktioniert. Du siehst, dass es mit MENU anfängt (ohne Parameter), gefolgt von einer Liste von MENUITEMs. Nach MENUITEM folgt jeweils ein Text. Das ist der Text, der in der Menu-Liste erscheint.
In Wirklichkeit gibt es zwei wahlweise Parameter zu MENU: Du kannst ihm zwei Farbwerte geben. Der erste ist die Textfarbe und der zweite die Hintergrundfarbe für die hervorgehobene Option. Es ist (noch) nicht möglich, die Farben der nicht hervorgehobenen Optionen zu ändern; diese sind immer schwarz auf grau.
Nach einer Linie mit MENUITEM kommen die Befehle, die Du für die entsprechende Option ausführen möchtest. GeoScript wird die Befehle ausführen, die es nach demjenigen MENUITEM findet, das vom Benutzer ausgewählt wurde. Sobald es ein neues MENUITEM oder ein ENDMENU findet, springt das Programm auf die Linie nach ENDMENU und fährt dort weiter.
Der Benutzer kann sich in MENU umherbewegen mit den Pfeiltasten nach oben und unten, und kann die hervorgehobene Option mit der [Enter]-Taste auswählen. Oder natürlich eine Option mit der Maus anklicken - Um nichts auszuwählen, kann der Benutzer die [Esc]-Taste drücken, oder mit der Maus irgendwo ausserhalb der Menu-Liste klicken. Das Programm fährt dann nach ENDMENU fort, ohne irgendeine der Optionen auszuführen.

Aber der Befehl MENU hat noch weitere Möglichkeiten. Nehmen wir z.B. an, unser Benutzer hat eine Menu-Option ausgewählt, der entsprechende Teil des Programms ist ausgeführt worden, und dann möchte der Benutzer eine andere Option desselben Menus auswählen. Aber die Menu-Liste ist nicht mehr da. Wie kommen wir zurück zu ihr? - Du kannst dies tun, indem Du Deine Menu-Liste mit REPEATMENU beendest statt mit ENDMENU. Das bewirkt, dass das Menu wiederholt erscheint, jedesmal, wenn die Ausführung einer Menu-Option beendet ist. Aber dann haben wir natürlich ein anderes Problem: wie kann der Benutzer dieses Menu verlassen? Es wird sich endlos wiederholen. Das heisst, es würde - wenn es nicht den Befehl EXITMENU gäbe. Setze EXITMENU ans Ende der Befehle einer Menu-Option, und das Programm wird auf die Zeile nach REPEATMENU springen. Wir ändern also unsere erste Menu-Liste leicht ab:

MENU
  MENUITEM "Option 1"
    TEXT "Du hast Option 1 ausgewählt."
  MENUITEM "Option 2"
    TEXT "Du hast Option 2 ausgewählt."
  MENUITEM "Option 3"
    TEXT "Du hast Option 3 ausgewählt."
  MENUITEM "Ich möchte dieses langweilige Menu verlassen!"
    TEXT "Du hast entschieden, das Menu zu verlassen."
    EXITMENU
REPEATMENU
WAIT
END

Dieses Menu wiederholt sich, bis der Benutzer die vierte Option auswählt (oder bis er [Esc] drückt oder mit der Maus ausserhalb der Menu-Liste klickt).

Aber es gibt noch mehr. Du kannst auch Menus ineinander verschachteln: ein MENUITEM kann seinerseits eine neue MENU-Liste enthalten. Du wirst dies im folgenden Beispielprogramm sehen. Es enthält dieselbe ANIMATION und INTERACTION wie das Beispiel aus Kapitel 9, aber jetzt kann der Benutzer zwischen den beiden auswählen, und er kann den Ausführungsmodus wählen.

WINDOW 640,420
TWINDOW 2,420, 636,40

CALL Init FAST

MENU
  MENUITEM "Konstruktion automatisch bewegen"
    TEXT "Alle Winkel über derselben Sehne in einem Kreis sind gleich."
    MENU
      MENUITEM "Modus FAST (bewegt)"
        ANIMATE BewegeWinkel FAST
      MENUITEM "Modus PACE (schrittweise Konstruktion)"
        ANIMATE BewegeWinkel PACE
      MENUITEM "Modus SLOW (Zeichenwerkzeuge zeigen)"
        ANIMATE BewegeWinkel SLOW
    ENDMENU
  MENUITEM "Konstruktion interaktiv zeigen"
    TEXT "Ziehe jetzt selber den Punkt P um den Kreis herum."
    MENU
      MENUITEM "Modus FAST (bewegt)"
        INTERACT ZieheWinkel FAST
      MENUITEM "Modus PACE (schrittweise Konstruktion)"
        INTERACT ZieheWinkel PACE
      MENUITEM "Modus SLOW (Zeichenwerkzeuge zeigen)"
        INTERACT ZieheWinkel SLOW
    ENDMENU
  MENUITEM "Programm verlassen"
    EXITMENU
REPEATMENU
END

CONSTRUCTION Init
  CIRCLE c1, 320,200, 170, (0,0,255)
  FILL c1, (0,0,255), 20
  ILINE invisible, 0,310, 600,310
  A,B = CROSS invisible, c1
  chord = LINE A,B
  P = COPY B
REPEAT

ANIMATION BewegeWinkel
  'Wir begrenzen die Bewegung des Punktes P auf den Kreis c1:
  STEP P ALONG c1, 3
  MARKPOINT P
  a = LINE P,A, -1, (128,0,0)
  b = LINE P,B, -1, (128,0,0)
  MARKNUMBERANGLE a,b, "a"
REPEAT 250

INTERACTION ZieheWinkel
  'Wir begrenzen die Bewegung des Punktes P auf den Kreis c1:
  CLICKABLE P ALONG c1
  MARKPOINT P
  a = LINE P,A, -1, (128,0,0)
  b = LINE P,B, -1, (128,0,0)
  MARKNUMBERANGLE a,b, "a"
REPEAT
So erscheint die Menu-Liste auf dem Bildschirm:

Übungsvorschläge:
Programmiere ein eigenes Projekt, das ein geometrisches Prinzip Deiner Wahl veranschaulicht. Füge ein Menu hinzu, welches dem Benutzer erlaubt, zwischen verschiedenen Teilen des Programms auszuwählen.


 

Kapitel 11: Vorgegebene Stile und Farben ändern
(Befehle DEFAULTS, TOOLDEFAULTS)

GeoScript hat bestimmte vorgegebene Werte für Farben, Eigenschaften von Punkten und Linien, usw. die automatisch auf jedes Objekt angewendet werden, dessen Eigenschaften nicht ausdrücklich im Script angegeben sind. Wenn Du möchtest, dass ein Objekt anders gezeichnet wird, musst Du ausdrücklich seine Farbe, seinen Stil und seine Breite angeben.
Es ist aber auch möglich, mit einem Schlag die vorgegebenen Werte für das ganze Programm zu ändern. Das geschieht mit dem Befehl DEFAULTS, der die folgende Syntax hat:

DEFAULTS Hintergrundfarbe [, Zeichnungsfarbe, Textfarbe, Hilfsfarbe, Linienbreite, Muster, Punktbreite, Stil, Winkelposition, Bogenweite]

Die Parameter haben die folgende Bedeutung:
Hintergrundfarbe = Hintergrundfarbe des Programmfensters.
Zeichnungsfarbe = die Farbe, mit der geometrische Objekte normalerweise gezeichnet werden.
Textfarbe = vorgegebene Farbe für Text.
Hilfsfarbe = die Farbe, mit der die Hilfslinien gezeichnet werden, die in den Konstruktionen von Winkelhalbierenden, Tangenten, usw. erscheinen, im Modus PACE und SLOW.
Linienbreite = vorgegebene Breite von Geraden und Kreisen.
Muster = vorgegebenes Muster für Geraden.
Punktbreite = vorgegebene Breite von Punkten.
Stil = vorgegebener Stil von Punkten.
Winkelposition = die vorgegebene Position für Winkel, die mit MARK(NUMBER)ANGLE markiert werden.
Bogenweite = die Winkelweite (in Grad) für die Hilfsbögen, die in den vorgegebenen Konstruktionen von MIDLINE, BISECTOR, usw. erscheinen im Modus PACE und SLOW.

Der Befehl DEFAULTS ändert diese Werte für alle folgenden Zeichnungsbefehle. Beachte, dass er das Aussehen des Fensters und der bereits gezeichneten Objekte NICHT ändert. Den Befehl DEFAULTS zu verwenden, ist also nur am Beginn einer neuen Konstruktion sinnvoll.

Es gibt auch einen Befehl TOOLDEFAULTS, der das Aussehen der Werkzeuge ändert, die im Modus SLOW / TOOLS gezeichnet werden. Seine Syntax ist:

TOOLDEFAULTS Bleistiftgrösse [, Dreiecksgrösse, Linealbreite, Bleistiftfarbe, Zirkelfarbe, Dreiecksfarbe, Transporteurfarbe, Linealfarbe]

Die Parameter sollten sich selbst erklären. Bleistiftgrösse gilt nicht nur für den Bleistift, sondern auch für den Zirkel. Dreiecksgrösse gilt nicht nur für das Zeichendreieck, sondern auch für den Transporteur. (Zeichendreieck und Transporteur erscheinen nur mit dem Befehl LINEPOLAR.)
Ein Wert von -1 in den Farbwerten von TOOLDEFAULTS hat eine spezielle Bedeutung: Er bewirkt, dass das entsprechende Werkzeug jeweils die Farbe des Objekts annimmt, das es zeichnet. GeoScript setzt diesen Wert anfangs für den Bleistift: Du wirst in den vorherigen Beispielen bemerkt haben, dass der Bleistift jeweils in der Farbe des Punktes oder der Geraden erscheint, den/die er zeichnet.

Das folgende Beispiel zeigt die Auswirkungen von Änderungen, die mit DEFAULTS und TOOLDEFAULTS angegeben werden. Zusätzlich ändern wir die Farben der hervorgehobenen Menu-Optionen.

DEFAULTS 0, (255,180,255), (255,255,0), (0,0,128), 3, &HF01, 20, 2, 0, 45º
TOOLDEFAULTS 50, 100, 20, (0,255,0), (0,160,0), (160,160,0), (160,0,0), (50,90,50)

CLS 0     'DEFAULTS ändert den Hintergrund NICHT, der bereits gezeichnet ist!
          '(ausser wenn nach DEFAULTS ein Befehl SCREEN kommt.)
WINDOW 640,420
TWINDOW 2,420, 636,40

CALL Init FAST

MENU (255,255,0), (190,0,0)
  MENUITEM "Konstruktion automatisch bewegen"
    TEXT "Alle Winkel über derselben Sehne in einem Kreis sind gleich."
    MENU
      MENUITEM "Modus FAST (bewegt)"
        ANIMATE BewegeWinkel FAST
      MENUITEM "Modus PACE (schrittweise Konstruktion)"
        ANIMATE BewegeWinkel PACE
      MENUITEM "Modus SLOW (Zeichenwerkzeuge zeigen)"
        ANIMATE BewegeWinkel SLOW
    ENDMENU
  MENUITEM "Konstruktion interaktiv zeigen"
    TEXT "Ziehe jetzt selber den Punkt P um den Kreis herum."
    MENU
      MENUITEM "Modus FAST (bewegt)"
        INTERACT ZieheWinkel FAST
      MENUITEM "Modus PACE (schrittweise Konstruktion)"
        INTERACT ZieheWinkel PACE
      MENUITEM "Modus SLOW (Zeichenwerkzeuge zeigen)"
        INTERACT ZieheWinkel SLOW
    ENDMENU
  MENUITEM "Programm verlassen"
    EXITMENU
REPEATMENU
END

CONSTRUCTION Init
  CIRCLE c1, 320,200, 170, (0,0,255)
  FILL c1, (0,0,255), 20
  ILINE invisible, 0,310, 600,310
  A,B = CROSS invisible, c1
  chord = LINE A,B
  P = COPY B
REPEAT

ANIMATION BewegeWinkel
  'Wir begrenzen die Bewegung des Punktes P auf den Kreis c1:
  STEP P ALONG c1, 3
  MARKPOINT P
  a = LINE P,A, -1, (128,0,0)
  b = LINE P,B, -1, (128,0,0)
  MARKNUMBERANGLE a,b, "a"
REPEAT 250

INTERACTION ZieheWinkel
  'Wir begrenzen die Bewegung des Punktes P auf den Kreis c1:
  CLICKABLE P ALONG c1
  MARKPOINT P
  a = LINE P,A, -1, (128,0,0)
  b = LINE P,B, -1, (128,0,0)
  MARKNUMBERANGLE a,b, "a"
REPEAT

Hier ist ein Beispiel der Ausgabe:

 


Jetzt, da Du die Grundlagen von GeoScript gemeistert hast, wird Dich nichts mehr davon abhalten, die erstaunlichsten Scripts zu schreiben!

Wenn Du ein interessantes Script geschrieben hast und es anderen GeoScript-Benutzern zur Verfügung stellen möchtest, sende es an:

GeoScript-Website