Benutzer-Werkzeuge

Webseiten-Werkzeuge


mathe:konstruktion:sprache

Befehle der Konstruktionssprache

Ignoriert werden Leerzeichen, Leerzeilen und Kommentare. Kommentare beginnen mit dem Zeichen # und enden mit dem Zeilenende. Alles was man sonst schreibt, wird als Definition eines Objektes interpretiert.

Enthält eine Definition ein =, so muss links davon ein gültiger Name stehen, rechts davon ein gültig definiertes Objekt, das dann diesen Namen erhält. Enthält die Definition kein =, wird ein Objekt erzeugt aber nicht benannt. Dies ist sinnvoll, wenn auf das erzeugte Objekt nur das eine Mal bei der Erzeugung Bezug genommen werden muss, wie es z.B. bei darstellenden Objekten der Fall ist.

In einer Zeile dürfen mehrere Definitionen stehen. Jede wird durch ein Semikolon ; beendet.

Jeder Name darf beliebig oft verwendet aber nur einmal definiert werden. Namen, die mit dem Unterstrich _ beginnen, sind für den internen Gebrauch reserviert und dürfen verwendet aber nicht definiert werden, weil sie schon definiert sind.

Zu den gültig definierten Objekten gehören Zahlen, Zeichenketten in (doppelten) Anführungszeichen, Objekte, die weiter unten noch einzeln aufgeführt werden und Listen daraus. Listen werden in geschweiften Klammern notiert. Elemente von Listen oder Parameterlisten werden durch Kommata getrennt.

Zahlen haben das in Programmiersprachen übliche Format (Dezimalpunkt, Zehnerexponent mit e), dürfen aber der Bequemlichkeit mit ° enden, was einer Multiplikation mit π/180 entspricht. Dies verwendet man üblicherweise bei Winkeln, das sind Zahlen, die mit < beginnen.

Eine gültige (wenn auch völlig sinnlose) Konstruktionsbeschreibung zeigt folgendes Beispiel:

 
A = Punkt(0,0); # Erzeugung und Benennung eines Punktes
str = {Farbe(1, 0.1, 0), Strich(1.5,{4,2,2,2})};
# Menge von 2 Objekten; Strich hat als Argument selber
# wieder eine Menge aus 4 Zahlen.
B = Punkt(6,-4.7e-1);
t = "ein schöner Text";
z = Zeichner(A);
# erzeugt eine Zeichnung von A und nennt sie z.
# Die Benennung des Zeichners ist wenig sinnvoll aber möglich.
g = Gerade(A,B); Zeichner(g,str);
# erzeugt eine Gerade und zeichnet sie.
# der Zeichner erhält hier keinen Namen.
k = Kr# gleich geht's weiter
eis(Punkt(20,30),A); #das ist hässlich aber möglich!
S = Schnitt(k,g);
w = <30°; # eine Abkürzung für 0.5235...
c = -5.01;

Besonderheiten im Konstruktionstext

Konstruktionen bestehen aus Punkten, Geraden und Kreisen, die sich mehr oder weniger häufig schneiden. Ist bei einem Schnitt ein Kreis beteiligt, so gibt es zwei Schnittpunkte. Um festlegen zu können, welcher von beiden gemeint sein soll, ist in den hier besprochenen Konstruktionstexten die Operation Schnitt nicht kommutativ, wenn also g und k eine Gerade und ein Kreis sind, ist Schnitt(g,k) der erste Schnittpunkt und Schnitt(k,g) der zweite. Die Begriffe 'erster' und 'zweiter' haben ihren Sinn, weil Geraden eine Richtung zugedacht wird. Z.B. hat die Gerade durch die Punkte A und B also Gerade(A,B) die Richtung von A nach B, und wenn man in dieser Fahrtrichtung vorgeht und auf einen Kreis trifft, trifft man ihn klar definiert das erste und dann das zweite Mal.

Ganz ähnlich verhält es sich beim Schnitt zweier Kreise k und h. Durch ihre Mittelpunkte ist eine Gerade vom erst- zum zweitgenannten definiert. Der erste Schnittpunkt ist dann jener auf der linken Seite der Fahrtrichtung, der zweite der auf der rechten.

Wenn man größere Konstruktionen durchführt, wird das Liniengewirr oft unübersichtlich. Um die Darstellung eines Objektes unabhängig vom Objekt handhaben zu können, gibt es spezielle Objekte, die nur zum Zeichnen der geometrischen Objekte dienen, sogenannte Zeichner. Will man ein Objekt auf der Zeichenfläche sehen, so muss man einen Zeichner anfordern, der das Objekt darstellt. Dem Zeichner kann man dann wieder mehr oder weniger aufwändig mitteilen, wie er das Ding darstellen soll.

Da ist also auf der einen Seite z.B. eine Gerade (unendlich dünn, unendlich lang, unsichtbar) und ein Zeichner, der sie mir hübsch darstellt (in blau, gestrichpunktet, mitteldick). Das macht natürlich eine Konstruktionsbeschreibung einigermaßen umständlich, aber darüber kann man an anderer Stelle streiten. Vielseitig ist dieser Weg allemal.

Erzeugbare Objekte

Am interessantesten ist natürlich die Frage, welche Objekte man denn auf welche Weise erzeugen kann.

Um die folgenden Ausführungen kurz halten zu können, nennen wir Kreise, Geraden und Punkte geometrische Objekte. Abstände und Zahlen sind Längen.

Es folgt eine Liste aller Objekte, die ich bisher programmiert habe, und die deshalb im Konstruktionstext vorkommen können. Die Liste besteht aus geometrischen Objekten und solchen, die für deren Darstellung gebraucht werden. Manche oft gebrauchten Objekte sind schon definiert, und zwar mit Namen, die für diese Zwecke reserviert sind: diese beginnen mit dem Unterstrich _.

Geometrische Objekte

  • Abstand(P,g) bezeichnet den Abstand zwischen einem Punkt und einem weiteren geometrischen Objekt. Die Reihenfolge der Argumente P und g ist unwichtig. In klassischen Konstruktionen darf der Abstand nur zwischen zwei Punkten gemessen werden (auf dem Papier tut man das mit dem Zirkel).
  • Gegner(g) ist die gleiche Gerade wie g aber mit entgegengesetzter Richtung.
  • Gerade(x,y,dx,dy) ist eine Gerade durch den Punkt mit den Koordinaten x und y und mit der Richtung dx, dy. Die vier Argumente müssen Längen sein.
  • Gerade(P,V) ist eine Gerade durch den Punkt P mit dem Richtungsvektor V. V ist ein Vektor.
  • Gerade(A,B) ist eine Gerade durch die Punkte A und B. Die Richtung geht von A nach B.
  • Gerade(A,w,g) ist eine Gerade durch den Punkt A unter einem Winkel w zur Geraden g gegen den Uhrzeigersinn gemessen.
  • Gerade(A,w,B) ist eine Gerade durch den Punkt A unter einem Winkel w zur Geraden von A nach B gegen den Uhrzeigersinn gemessen.
  • Kreis(x,y,r) ist ein Kreis mit den Mittelpunktkoordinaten x, y und dem Radius r. Alle Argumente sind Längen.
  • Kreis(P,r) ist ein Kreis um den Punkt P und dem Radius der Länge r.
  • Kreis(A,B) ist ein Kreis um den Mittelpunkt A durch den Punkt B.
  • Lot(g,P) ist das Lot auf die Gerade g, das durch den Punkt P geht. Die Richtung des Lotes erhält man aus der Richtung von g, indem man diese um 90° gegen den Uhrzeigersinn dreht.
  • Mittelpunkt(P,Q) ist der Mittelpunkt zwischen den beiden Punkte P und Q.
  • Mittelsenkrechte(P,Q) ist die Mittelsenkrechte zwischen den beiden Punkten P und Q. Die Richtung der Mittelsenkrechten erhält man, wenn man die Gerade PQ um 90° gegen den Uhrzeigersinn dreht.
  • Parallele(g,P) ist eine Parallele zur Geraden g durch den Punkt P. Die Parallele hat die gleiche Richtung wie g.
  • Parallele(g,d) ist eine Parallele zur Geraden g im Abstand d. Der Abstand ist eine Länge. Bei positiven Werten befindet sich die Parallele links von g, sonst rechts.
  • Punkt(x,y) ist ein Punkt mit den Koordinaten x, y. Alle Argumente sind Längen.
  • Punkt(go) ist ein Punkt am gleichen Ort wie das geometrische Objekt go.
  • PunktAuf(g,x,y) ein beliebiger Punkt auf der Geraden g. Weil das Programm nicht wissen kann, wo der Punkt beliebt, wird mit x, y eine Position in der Ebene angegeben, in deren Nähe der beliebige Punkt sein soll. Die Position auf der Geraden ist nachträglich veränderbar.
  • PunktAuf(k,x,y) ein beliebiger Punkt auf dem Kreis k. Weil das Programm nicht wissen kann, wo der Punkt beliebt, wird mit x, y eine Position in der Ebene angegeben, in deren Nähe der beliebige Punkt sein soll. Die Position auf dem Kreis ist nachträglich veränderbar.
  • PunktAuf(k,w) ein beliebiger Punkt auf dem Kreis k. Weil das Programm nicht wissen kann, wo der Punkt beliebt, wird mit w der Winkel gegen die Horizontale angegeben.
  • Schnitt(a,b) ist der Schnittpunkt zwischen a und b. Bei diesen muss es sich um Kreise und/oder Geraden handeln.
  • VarPunkt(x,y) wie Punkt(x,y) jedoch mit der Möglichkeit, die Lage nachträglich zu verändern.
  • Vektor(dx,dy) ein Vektor mit der Richtung dx, dy. Vektoren im strengen Sinne haben keinen Ort. Weil sie in Zeichnungen jedoch irgendwo erscheinen müssen, haben sie die Position, auf die ihre Spitze zeigt. Erzeugt man einen Vektor wie hier aus nur zwei Zahlen, so ist sein Fuß immer der Nullpunkt.
  • Vektor(p) ein Vektor vom Ursprung zum angegebenen Punkt p.
  • Vektor(A,B) ein Vektor von A nach B, wobei Aund B Punkte oder Vektoren sind.
  • Vektor({v1,v2,…}) die Summe der angegebenen Vektoren. Die Position wird so gelegt, dass der Fußpunkt der Summe der gleiche ist, wie der Fußpunkt von v1.
  • Vektor(a,v) das a-fache des Vektors v. Mit a=-1 bekommt man also z.B. den Gegenvektor. Der Fußpunkt ist derselbe wie der von v.
  • Vektor(v,a,w) die Summe aus Vektor v und a mal Vektor w. Der Fußpunkt ist derselbe, wie der von v.
  • Winkel(g,h) ist der Winkel zwischen den beiden Gerade g und h. Er hat Werte zwischen -Pi und Pi und ist positiv, wenn die (kürzere) Drehung von g nach h gegen den Uhrzeigersinn verläuft.
  • Winkel(A,P,B) ist der Winkel zwischen den Geraden PA und PB.
  • Winkelhalbierende(g,h) ist eine Gerade durch den Schnittpunkt der Geraden g und h, die den Winkel dazwischen halbiert. Die Reihenfolge der beiden Argumente ist bedeutungslos. Die anderen drei möglichen Winkelhalbierenden bekommt man, wenn man Gegner(g) bzw. Gegner(h) geeignet verwendet.
  • Winkelhalbierende(A,P,B) ist eine Gerade durch P, die den Winkel zwischen den Geraden PA und PB halbiert. Die Vertauschung von A und B hat keine Auswirkungen.

Objekte für die Darstellung

Einige darstellende Objekte nehmen als Parameter eine Liste von Hints entgegen, die die Darstellung genauer definieren. Das Verhalten dieser Liste ist etwas ungewöhnlich. Weil sie nicht allzu kompliziert in der Verwendung werden sollte, wurde ein bisschen mehr syntaktischer Freiraum gewährt, als bei den anderen Objekten:

  • Enthält die Liste nur ein Objekt, so dürfen die geschweiften Klammern weggelassen werden.
  • Die Hints haben üblicherweise die Form Hintname:wirksamesObjekt. Der Hintname sagt aus, worauf wirksamesObjekt Einfluss nimmt. Wie Hintname lauten muss, ist unten jeweils aufgeführt..
  • Manche Hints braucht man so oft, dass die Angabe des Hintnamens unangenehm wird. Diese besonderen Hints dürfen dann auch ohne Hintname (und ohne Doppelpunkt) angegeben werden. Sie werden allein auf Grund des Typs von wirksamesObjekt erkannt.
  • Wenn in der Liste der Hints irgendetwas nicht zusammenpasst, wird der Hint ignoriert und so verfahren, als wäre er nicht genannt worden. So ist z.B. der Hint Strichfarbe:„blau“ ein sinnloser Hint, weil nach dem Doppelpunkt statt eines Strings eine Farbe definiert werden müsste, also etwa Strichfarbe:Farbe(0,0,1) oder Strichfarbe:_blau. Die Darstellung erfolgt in diesem Fall aber ohne Fehlermeldung in der Standardfarbe.
  • Es besteht keine Gefahr der Kollision von Hintnamen mit selber definierten Namen. Hintnamen werden gesondert erkannt. Nach dem Doppelpunkt werden vernünftigerweise selber definierte Namen als solche erkannt. Die Angabe Strichfarbe:blau ist also sinnvoll, wenn vorher irgendwo definiert wurde blau=Farbe(…).
  • Farbe(r,g,b) Farbe mit den drei Anteilen für Rot, Grün und Blau. Die einzelnen Werte müssen Zahlen zwischen 0 und 1 sein. Je größer die Werte sind, desto heller ist die Farbe. Sind alle drei Werte 1, ist die Farbe Weiß gemeint. (Ohne Angabe der Farbe wird stets schwarz verwendet. Bereits definiert sind die unten genannten Farben.)
  • Strich(d) ein durchgezogener Strich der Dicke d Points. Bereits definiert sind die unten genannten Striche.
  • Strich(d,{s1,u1,s2,u2,…}) ein Strich der Dicke d Points. Der Stil des Strichs ist nicht durchgezogen, sondern bestehend aus: sichtbares Stück der Strichlänge s1, unsichtbares Stück der Unterbrechungslänge u1, usw. Wenn das Muster für den darzustellenden Strich nicht reicht, wird es wiederholt.
  • Zeichner(go) zeichnet ein geometrisches Objekt go in standardisierter Weise, also mit Standardfarbe (schwarz), Standardstrichstärke (1 Point), Standardstil (durchgezogen).
  • Zeichner(go,hints) zeichnet ein geometrisches Objekt go unter Angabe weiterer Hinweise hints. hints kann alles sein, was der Zeichner versteht. Im Moment wird unterstützt: Stiftfarbe:Farbe(…), Stift:Strich(…) und Marke:_Punkt oder eine Liste aus diesen Elementen. Der Eintrag _Punkt bewirkt, dass bei Geraden angezeigt wird, wo sie herkommen. Bei Kreisen bewirkt er die Anzeige des Mittelpunkts. Bei Vektoren bewirkt der Eintrag
  • Spitze:_Pfeil, dass ein Pfeil gezeichnet wird.
  • Zeichner({g1,g2,…},hints) zeichnet einen Linienzug durch die Positionen der angegebenen geometrischen Objekte. &Uuml;blicherweise wird man meist Punkte verwenden. Dadurch hat man also die Möglichkeit, Linien zu zeichnen, die nicht unendlich lang sind.
  • Anzeige(was,wo,hints) schreibt einen Text in die Zeichnung. Der Inhalt und das Aussehen werden größtenteils in den hints festgelegt. Da aber fast immer ein Parameter dargestellt werden soll, muss mit was angegeben werden, von welchem Objekt. Da die meisten Objekte mehrere Parameter haben, wird in einem Formatierungsstring in den hints definiert, welcher Parameter gewünscht ist. Diese sind durchnummeriert mit ganzen Zahlen ab 0. Mit wo muss ein Objekt angegeben werden, von dem dann die Koordinaten verwendet werden, um die Anzeige dort zu platzieren. Vernünftigerweise nimmt man da meistens einen Punkt, den man selbst nicht zeichnet.
  • In den hints können folgende Eintragungen gemacht werden:
    • Stiftfarbe:Farbe(…), Hintergrund:Farbe(…), dx:Zahl, dy:Zahl und Format:String (Stiftfarbe und Format sind Defaultangaben, d.h. der Hintname darf weggelassen werden.)
    • dx und dy geben an, um wie viele Pixel die Anzeige von der Position wo entfernt erfolgen soll. Das hat den Zweck, dass man für mehrere Anzeigen den gleichen Ort wo verwenden kann, jedoch mit jeweils verschiedenen Verschiebungen dx oder dy. Verändert man dann die Lage von wo, so wandern alle Anzeigen auf einmal mit.
  • Beispiel: Sei A=Punkt(10,1) Dann bewirkt Anzeige(A,A,{“(%0 #.##%|%1 #.##%)“,dx:10,Stiftfarbe:Farbe(1,0,0),Hintergrund:Farbe(0,1,0)}) die Anzeige der Koordinaten des Punktes A in einer Entfernung von 10 Pixeln rechts von A in etwa folgender Weise: (1,13|-2,2)
    • Ein % leitet ein Format ein. Danach folgt die Nummer des gewünschten Parameters (im Beispiel 0 bzw. 1). Danach kann die Formatierung angegeben werden. Ein weiteres % beendet das Format und schaltet auf normale Textwiedergabe. Daraus folgt, dass das Zeichen % selber nicht darstellbar ist. Deswegen dient es als Fehlermelder: Taucht es in der Ausgabe auf, so heißt das, dass der Formatstring fehlerhaft ist. Verzichtet man ganz auf die Angabe eines Formats, so wird ein Format verwendet, das am besten zum verwendeten Objekt passt.
    • Bei eindimensionalen Größen, wie Längen und Winkeln ist Parameter 0 der Wert und Parameter 1 der Wert multipliziert mit 180/π (also der Wert in Grad). Dies ist sinnvoll, wenn man Winkel in Grad angeben will. Bei zweidimensionalen Objekten kommt erst die Position 0 für x, 1 für y und dann die Eigenheiten, also bei Kreisen der Radius (2) und bei Geraden der Richtungsvektor (2 und 3) und der Drehwinkel im Bogen- und Gradmaß (4 und 5). Vektoren haben noch als 6. Parameter ihre Länge.
    • Gibt man eine zu große Parameternummer an, so erhält man keinen Wert.
  • Anzeige(was,wo) wie oben, aber mit Standardwerten für alles was durch Hints definierbar ist.
  • Anzeige(wo,hints) dient der Anzeige eines Strings (deshalb entfällt der Parameter was). Der String muss bei den Hints mitgegeben werden und darf benannt werden mit Format:. Damit wird jedoch ein etwaiges %-Zeichen nicht als Parameter gewertet, sondern als solches wiedergegeben. Die anderen Hints funktionieren sinngemäß weiter.

Bereits definierte, oft gebrauchte Objekte

Die hellen Farben _rot, _grün, _blau, _cyan, _magenta, _gelb und etwas dunkler _Rot, _Grün, _Blau, _Gelb, _Cyan, _Magenta, _Gelb, sowie die Grauabstufungen _weiß, _grau20, _grau40, _grau60 und _grau80.

Als Striche stehen zur Verfügung _s1, _s2, _s3, _s4, _s5, _dünn, _dick.

Um Kreismittelpunkte und Herkunftspunkte von Geraden anzuzeigen gibt es die Marke:_Punkt.

Als Spitze von Linienzügen und Vektoren gibt es _keine und _Pfeil.

mathe/konstruktion/sprache.txt · Zuletzt geändert: 2011/02/14 16:35 von admin