Euklid in Recapis

Wort und Bild: Wer wollte auf eines verzichten? Die Zusammengehörigkeit von Sprache und Visualisierung ist besonders ausgeprägt in der Geometrie. Wenn man mit einem Stift eine runde Linie zeichnet: Wie fein und genau auch immer man zeichnet, es bliebe doch eine dicke Linie, die erst im Kopf zu einem Kreis wird. Wenn man einen Satz liest, der einen Kreis beschreibt: Wie sprachlich anspruchsvoll auch immer man ihn formuliert (Beispiel: "Der geometrische Ort aller zu einem gegebenen Punkt äquidistanten Punkte"), der Satz bliebe doch Text und wird erst im Kopf zu einem Kreis (dem Bild eines Kreises).

Vorgeschichte

Eine Anekdote: Euklid ging mit seiner Frau Euklidia am Strand spazieren. Und er sprach also: „Ich habe einen neuen Zweig am Baum der Mathematik gefunden, die Geometrie.“ „Die euklidische Geometrie“, fügte er mit Stolz hinzu. Das Wort 'gefunden' wählte er mit Bedacht; er sagte nicht 'erfunden', weil er glaubte, dass die Mathematik von Zeus gemacht wurde und er sie nur noch zu entdecken brauchte. „In Arithmetik und Geometrie gibt es Gegenstände, Objekte mit denen, an denen Handlungen, Tätigkeiten ausgeführt werden, wodurch neue, andere Gegenstände erzeugt werden. In der Arithmetik kann man aus der unendlichen Menge der natürlichen Zahlen willkürlich zwei auswählen, sie einer Subtraktion unterwerfen und dabei einen neuen Zahlentyp, die rationale Zahl, erhalten. In der euklidischen Geometrie kann man zwei (verschiedene) Punkte auswählen und durch sie eine Gerade ziehen.“ (Aus zwei Punkten können Gerade und Kreis, aus Gerade und Kreis oder aus zwei Geraden oder aus zwei Kreisen oder aus Gerade und Kreis können Punkte erzeugt werden.)

Dann nahm er ein Stöckchen, zeichnete Figuren in den Sand und erläuterte: „Ich will dir an einem Beispiel, dem Fällen eines Lotes, die Leistungsfähigkeit und Schönheit der Geometrie zeigen.“ Er zeichnete, als wäre es Hexerei (so kam es Euklidia vor), Punkte, Geraden und Kreise und erhielt das Lot. So in etwa könnte die Stöckchenfigur ausgesehen habe.

Als eine besonders hohe Welle den Strand herauf schwappte und die Zeichnung auslöschte, sagte Euklidia, die praktisch, technisch und pädagogisch dachte: „Lass und morgen mit unseren Kindern wieder zum Strand gehen, und lass uns Bindfaden und Pflöcke mitnehmen. Damit lassen sich deine Ideen viel genauer umsetzen.“ ('als mit deinen krummen Linien und eiförmigen Kreisen', fügte sie als kluge Frau nicht hinzu.)

Und so - oder so ähnlich, allerdings ohne Farbe - sah die Figur am nächstenTage aus. Blau sind die Vorgaben, schwarz die Hilfslinien und grün das Ergebnis.

Das kartesische Koordinatensystem

Viele Jahrhunderte später: Vielleicht dachte René Descartes nicht an die Vergänglichkeit der euklidischen Figuren im Sand, denn er konnte ja auf Papier zeichnen; vielleicht besorgte ihn die Reproduzierbarkeit seiner geometrischen Konstruktionen mit Tinte und Feder auf Papier. Wie würden sie nach mehrmaligem Kopieren mit Auge und Hand aussehen? Wie auch immer: Er erfand das später nach ihm benannte Koordinatensystem, das es ermöglichte, jeden Ort der Ebene mit seinem Abstand von der senkrechten (x-Wert) und waagerechten Achse (y-Wert) zu kennzeichnen. Zum Beispiel konnte er in natürlicher Sprache anweisen:

Zeiche einen Kreis mit Mittelpunkt Punkt(x=1, y=2) und Radius(r=3)
oder vielleicht in Kurznotation
zeichne_kreis (1,2,3)
Dreh- und Angelpunkt waren für ihn das kartesische Koordinatensystem und die Zahlenwerte, die auch nach seinem Tod es jedem Mathematiker ermöglichen würden, die gleiche Konstruktion zu reproduzieren. Weiter unten ist das Zeichnen von Punkten, Geraden und Kreisen näher beschrieben.

Schon bei Euklid sind seine Sandzeichnungen (in der Anekdote) nur Visualisierungen einer Idee von Punkt, Gerade und Kreis. Decartes löst sich noch stärker von der grafischen Darstellung indem er Punkte, Geraden und Kreise als rein arithmetische Objekte darstellt. Er könnte Punkt(x,y), Kreis(mx,my,r), Gerade(y,x,c) geschrieben haben.

Recapis

Hier können die beiden Aspekte, das Rechnen mit Zahlen und das Bearbeiten von Text zusammengeführt werden, um geometrische Konstruktionen sowohl zunächst zu berechnen und dann auch als Text in Form von SVG-Zeichenanweisungen auszugeben, wie im Folgenden gezeigt wird.

Begrüßung

„Guten Tag! Mein Name ist Euklid, Euklid von Alexandria, und ich habe die Lizenz zum Zeichnen und Berechnen von Punkten, Geraden und Kreisen. Mit Recapis kann ich aus Zeichenanweisungen ein Bild erstellen, wie im Folgenden gezeigt.“

Euklidisch programmieren

Die klassisch-griechischen Werkzeuge Zirkel und Lineal werden hierbei nicht manuell sondern nach gedanklicher Vorstellung sprachlich benutzt. Ein Satz wie: "Gegeben sind zwei Punkte A und B. Nimm die Entfernung in den Zirkel und schlage einen Kreis um A." wird dabei wie folgt euklidisch formuliert:
ax=10; // Punkt A
ay=20;
bx=30; // Punkt B
by=40;
radius = wurzel ( (ax-bx)^2+(ay-by)^2 );
svg_open;
  svg_kreis (ax,ay,radius);
svg_close ('/tmp/filu/test_reca/euklid/hallo_kreis.svg');
Dieses Programm erzeugt eine SVG-Datei, die wie oben einen Kreis enthält, allerdings mit einem berechneten Radius. Die SVG-Datei kann von den meisten Browsern dargestellt werden.

Der Punkt

wird in Euklid durch ein Feld (array, vector) mit zwei Fließpunktzahlen repräsentiert, die für die kartesischen xy-Koordinaten stehen. Beispiel:
ax=1.0;
ay=2.0;
A Fvector (ax,ay);
svg_open;
  svg_punkt A;
  svg_punkt (2, 3.0,'sd=1','sf=red');
  svg_text  (A,'Hallo Punkt','font-family:monospace;font-size:8pt');
svg_close;
Erläuterung:
Die Vokabel "vector" wird wegen der Nähe des Eukid-Interpreters zu c++ und damit zu der c++-Bibliothek verwendet (F für Fließpunktzahlen). Alternativ können die Koordinaten auch direkt als geklammerte Liste eingegeben werden. Weiter darf die Liste auch noch Textargumente enthalten, die Strichdicke (sd=) und/oder Strichfarbe (sf=) kennzeichnen. svg_text erlaubt Text an dieser Stelle auszugeben. Das optionale dritte Argument wird als Style-Argument in die Svg-anweisung durchgereicht. Beispiel:
<text x='76.0' y='76.0' style='font-family:monospace;font-size:8pt'>Hallo Punkt
</text>
Zum Style-Argument siehe die HTML-Dokumentation.
Breite = 50; // Die Maße des Zeichenblattes
Hoehe  = 40;
Rechts = 10; // Der Ursprung bezogen auf die linke untere Ecke
Hoch   =  5;
svg_open (Breite,Hoehe,Rechts,Hoch);
   svg_kreuz 10; // kartesisches Koordinatenkreuz mit 10mm-Markierungen
   svg_rechteck (-Rechts+1,-Hoch+1,Breite-2,Hoehe-2); // Rahmen
   P Fvector (10,15); // xy-Koordinaten eines Punktes in mm
   svg_punkt (P,'sf=blue','sd=1'); // sf=Strichfarbe, sd=Strichdicke (in mm)
   svg_text  (P,'Hallo Punkt','font-family:monospace;font-size:8pt');
svg_close ('/tmp/filu/test_reca/euklid/hallo_punkt.svg');

Der Kreis

Für den Kreis gibt es unter anderem drei Repräsentationen: Euklid verwendet die Mittelpunkt-Radius-Darstellung. Der Kreis wird durch einen Vektor mit den 3 Elementen (mx, my, r) dargestellt. Beispiel:
mx=1.0;
my=2.0;
r =10;
K Fvector (mx,my,r);
svg_open;
  svg_kreis K; // oder
  svg_kreis (1.0, 2.0, 10, 'sd=1', 'sf=red', 'ff=green');
    // optional noch ff für Füllfarbe
svg_close;

Die Gerade

kann unter anderem auf drei Arten repräsentiert werden: Euklid erwartet die Punktmengen-Darstellung. Beispiele:

Berechnungen

Neben dem Zeichnen von Punkten, Geraden und Kreisen können die in der Datei euklid.include definierten Funktionen zum Berechnen von Punkten genutzt werden.

Hier ein Beispiel:
"Erzeuge einen Kreis mit dem Schnittpunkt zweier Geraden als Mittelpunkt."
wird euklidisch formuliert:
include '/tmp/filu/test_reca/euklid/euklid.include';
r = 20;                    // der Radius
M  Fvector  2;             // M soll den Mittelpunkt aufnehmen
G1 Fvector  (-1,2,10);     // die vorgegebenen Geraden
G2 Fvector  ( 2,1,20);
schneide_gg3 (G1, G2, M);  // berechnet den Schnittpunkt M
K Fvector (M[0], M[1], r); // Kreis festlegen

svg_open;
  svg_kreuz;                 // kartesisches Koordinatenkreuz
  svg_gerade G1;             // die svg-anweisungen
  svg_gerade G2;             // zeichnen die Objekte
  svg_kreis (K,'sf=red');
  svg_punkt (M,"sf=blue","sd=2");
svg_close ('/tmp/filu/test_reca/euklid/schnittpunkt.svg');

Erklärung:


Euklid kennt die drei Zeichenanweisungen im obigen Beispiel.

An Rechenfunktionen stehen zu Verfügung:

Anders als in Javascript üblich werden nicht die Vektoren sondern ihre Pointer an das Unterprogramm übergeben, weil auf diese Weise das Ergebnis in E abgelegt werden kann. Der Returnwert der Funktion enthält die Anzahl der Schnittpunkte.
Man kann also notieren:
if (schneide__gg(G1,G2,E)==0)
   $='Geraden sind parallel!\n';

Unterprogrammtechnik

Wiederkehrende Berechnungen können in Unterprogrammen definiert werden. Beispiel Lot: "Fälle das Lot vom Punkt P auf die Gerade G."

Wenn Funktion Lot häufiger gebraucht wird, kann man sie in euklid.include anhängen. Aus Gründen der Allgemeingültigkeit sollten aber noch die Fälle der Achsenparallelität abgefangen werden.

Beispiel Thaleskreis

Beweise, dass die Ecke C im Thaleskreis über der Strecke AB
einen rechten Winkel bildet!

Seien A=(1,2) und B=(2,3)
Errichte den Thaleskreis über der Strecke AB.
 Zeichne 2 radiengleiche Kreise um A und B derart,
 dass 2 Schnittpunke S1 und S2 gebildet werden.
 Zeichne Gerade g durch S1 und S2. g schneidet AB in Punkt M,
 welcher die Strecke AB halbiert.
 Zeichne den Thaleshalbkreis über AB mit dem Mittelpunkt B und dem Radius MA.
Wähle eine beliebigen Punkt C auf dem Thaleskreis.
Fälle das Lot von A auf die durch die Punkte B und C gehende Gerade,
was den Punkt L ergibt.
L und C sollten gleich sein.

A Fvector (-1,0;)
B Fvector ( 1,0;)
svg_open;
ab = abs(A-B);
k1 = A,r;
erg fvector 2;
schneide (k1,k2,erg)
svg_close '/tmp/filu/test_reca/euklid/thales.svg';
(Bemerkung: Um nicht der Sprachverarmung Vorschub zu leisten, werden in dieser Dokumentation nicht Punkte, Geraden und Kreise "gezeichnet", sondern Punkte gesetzt, Geraden gezogen und und Kreise geschlagen.)