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
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: ![]()