Quadrat in ein DIN-Rechteck umwandeln

Für Werner,
dem ich die Anregung für diese Ausarbeitung verdanke

Zunächst eine Pizza für den kleinen Hunger

Das Ausrollen einer Pizza stand für die Animation der nachfolgenden Grafik Pate. So wie die Pizza bei gleich bleibender Teigmenge dünner und breiter wird, so wird hier ein Quadrat beim Zusammendrücken bei gleichbleibender Fläche niedriger und breiter bis es sich schließlich in ein Rechteck im Seitenverhältnis des DIN-A-Formates verwandelt.

Die Idee

Der Maler Werner Goldmann (hier seine Werke werner-goldmann.de )
- als Vermessungstechniker im Umgang mit Zirkel und Lineal vertraut -
stellte sich folgende Aufgabe:
Konstruiere euklidisch (mit Zirkel und Lineal) aus einem Quadrat ein flächengleiches Rechteck im DIN-A-Format (im Seitenverhältnis 1 zu Wurzel 2).

Die Originalzeichnung

Werner erstellte seine Zeichnung, mit Zirkel und Lineal auf Papier, notierte darauf die Berechnungen und stellte mir eine Fotografie zur Verfügung.

Werners Lösung

Die zwei wesentlichen Schritte sind

Flächengleichheit (Bezeichner s. unten)

Seitenverhältnis

\[ \frac{k}{h} = \frac{\frac{1}{2} \cdot \sqrt{2} \cdot \sqrt[4]{2} \cdot p}{\sqrt[4]{2} \cdot p} = \frac{1}{\sqrt{2}} \]

Die Konstruktion in kleineren Schritten

Seien gegeben zwei Punkte A und F.
Konstruiere:
  1. Konstruiere Quadrat mit Seite AF und Punkten D, E.
  2. Ziehe Gerade g durch Punkte A und F.
  3. Schlage Kreis um F, der die Gerade g im Punkt B schneidet.
  4. Errichte Thaleshalbkreis über AB.
  5. Lot h zu Gerade g über F schneidet Thaleskreis im Punkt C.
  6. Lot zu Gerade h im Punkt C schneidet Kreis um Punkt C mit Radius = FC im Punkt G.
  7. Punkt H halbiert Strecke FG. (die Diagonale des Höhenquadrates)
  8. Kreis um F mit Radius = FH
  9. schneidet Strecke FB im Punkt I.
  10. Punkt J vervollständigt das Ergebnis-Rechteck mit Punkten C, F, I.J

Mein bescheidener Anteil

Da mir zwei leistungsfähige Programmiersprachen, das Skalierbares-Vektor-Grafik-Format SVG sowie die Sprache Racapis mit ihrem SVG-Modul und der Fähigkeit, mit euklidischen Objekten rechnen zu können, zur Verfügung standen, war es mir eine Freude, Werners Konstruktion am PC programmiersprachlich auszudrücken.

Hier der Quellkode als RECA-Datei.

Ein kurze Einführung in Recapis

Da die Programmiersprache Recapis ohnehin schon mit rationalen Zahlen rechnen kann (also Zahlen, die durch mehr als einen skalaren Wert repräsentiert werden)
   a = Rational(1,2);
   b = Rational(1,6);
   $ = a+b; // gibt 2/3 aus statt üblich 0.6666667
brachte mich das auf die Idee, euklidische Zahlen (Punkt, Gerade, Kreis) zu definieren und mit praktisch nützlichen Operationen auszustatten.
Literale sind
    P = Punkt(1,2);    // Punkt an der Stelle x=1 und y=2
    K = Kreis(1,2,10); // Kreis um Punkt (1,2) mit Radius 10
    G = Gerade(1,m,n); // Gerade mit 1*y = m*x + n
Operationen sind
   - Differenz (Abstand zwischen zwei Punkten)
   + verbindet Punkte zu einer Geraden
     G = Punkt(1,2) + Punkt(99,2); // ergibt G = Gerade(1,0,2)
   / schneidet eine Gerade mit einer Geraden
     P = Gerade(1,1,0) / Gerade(1,-1,1) // ergibt Schnittpunkt P = Punkt(1,1)
   < schneidet Kreis < Gerade // Der Punkt mit kleinerm x-Wert
   < schneidet Kreis < Kreis 
   > schneidet Kreis > Gerade // Der Punkt mit größerem x-Wert
   > schneidet Kreis > Kreis 
Regel: Wenn es zwei Schnittpunkte gibt, meint der Operator '>' denjenigen Ergebnispunkt, der den größeren x-Wert hat. Durch die Möglichkeit, komplexe Terme zu bilden, müssen Zwischenergebnisse nicht als Variablen angelegt werden, was den Kode kompakter und übersichtlicher macht.

Eine erste praktische Anwendung:
Der Punkt B soll sich als Schnittpunkt der durch A und F gehenden Geraden mit dem Kreis um F und dem Radius der Diagonalen des Quadrates ergeben. (Der Kode und die Grafik sind vielleicht leichter zu verstehen als dieser Text.)

Hier das vollständige Recapis-Programm 'erste.reca',

p = 30;
A = Punkt (-p, 0);
F = Punkt ( 0, 0);
D = Punkt (-p,-p);
E = Punkt ( 0,-p);
B =                // Ergebnis ist B = Punkt(diagonale, 0)
     Kreis(F,F-D)  // Kreis um F mit Radius Abstand F von D
    >              // Kreis schneidet Gerade
     (A+F)         // Gerade durch A und F
    ;          
svg_open(100,60,40,50);
  svg_kreuz;
  svg_polygon(A,D,E,F,'ff=lightgreen');
  svg_bogen  (F, F-D, 1.25*PI, 2*PI, "sf=red");
  svg_punkt  (A,"text=A");
  svg_punkt  (D,"text=D");
  svg_punkt  (E,"text=E");
  svg_punkt  (F,"text=F");
  svg_punkt  (B,"text=B");
svg_close "erste.svg";
das mit dem Konsolaufruf
recapis.exe sf=erste.reca 
die folgende SVG-Datei 'erste.svg' produziert.

Nebenkonstruktionen

Diese Nebenkonstruktionen sind aus Gründn der Übersichtlichkeit in Unterkonstruktionen ausgelagert Außerdem verkürzen Unterprogramme bei mehrfacher Verwendung den Kode, und innerhalb eines Ausdrucks erspart der Rückgabewert die Verwaltung einer weiteren Variablen.
Lotrechte
Zunächst ausführlich:
Nun mit Unterprogramm:

Schlussbemerkung

Wenn der geneigte Leser dieses Artikels vermutet, dass ich mit der Nachzeichnung nicht nur Werners Konstruktion in ein schönes Licht setzen möchte, sondern auch die Leistungsfähigkeit des Werkzeuges Recapis demonstrieren möchte, so liegt er damit richtig.