-----------------------------------------------------------------------------
UNIX 2
                                                       4. Uebungsblatt
______________________________________________________________________
Aufgabe 1 (0 Punkte)

    Lest die Dokumentation zu Scheme und Elk (aus den vorlesungs-
                              ------     ---
    begleitenden Unterlagen Nummer 8; der dritte Teil Interfacing
                                                      -----------
    Scheme to the ``Real World'' ist fuer die Aufgabe noch nicht
    ------ -- ---   ---- -----
    relevant).

    Legt eine Unterdirectory ueb4 in Eurem Uebungsverzeichnis an.

______________________________________________________________________
Aufgabe 2 (10 Punkte)

    Gegeben ist der Anzeigeteil eines einfachen Grafik-Editors (in
    ~unix2/bin/kred-elk bereits hineingeladen -- Achtung: nur auf
    Sparc/SunOS4 ablauffaehig).  Diese Basis ist zu vervollstaendigen,
    indem der eigentliche Grafik-Editor in Scheme geschrieben wird.

    Der Anzeigeteil ist sehr einfach, angezeigt werden koennen nur
    Kreise.  Die Schnittstelle ist:

            (kred-init) => #f/#t
            (kred-draw-circle pointx pointy radius) => ...
            (kred-show-drawing) => ...
            (kred-get-next-event) => (type detail x y)

    (kred-init) dient zur Initialisierung; es liefert als Booleschen
    Wert zurueck, ob die Initialisierung erfolgreich war.  (kred-
    draw-circle) zeichnet den durch ganzzahlige Koordinaten
    beschriebenen Kreis zunaechst in duenne Luft; erst (kred-show-
    drawing) zeigt die Grafik tatsaechlich an.  Gezeigt werden dabei
    nur die Elemente, die seit dem letzten (kred-show-drawing)
    gezeichnet wurden; zwei aufeinanderfolgende Aufrufe von (kred-
    show-drawing) zeigen also z.B. ein leeres Window an.

    Die Hauptschleife des Grafik-Editors kann (kred-get-next-event)
    aufrufen, um auf das naechste Ereignis (Knopf- oder Tastendruck)
    zu warten; es wird eine Liste mit Informationen ueber das Ereignis
    zurueckgeliefert.  Wenn (kred-get-next-event) im ersten Listenele-
    ment type das Symbol key-press liefert, enthaelt das zweite
    Listenelement detail die gedrueckte Taste als String.  Wenn
    (kred-get-next-event) in type das Symbol button-press oder
    button-release liefert, enthaelt detail einen der Werte 1, 2 oder
    3 fuer MB1, MB2, MB3. Die dritten und vierten Listenelemente x und
    y geben dann an, an welcher Position auf dem Bildschirm der Knopf
    gedrueckt wurde.  Wenn (kred-get-next-event) im ersten Listenele-
    ment type das Symbol expose liefert, heisst dies, dass das
    Window-System den Window-Inhalt vergessen hat, dann muss (wie nach
    jeder Aenderung der Grafik) das gesamte Bild neu gezeichnet wer-
    den.

    Es ist nun in Scheme ein einfacher Grafik-Editor zu schreiben, der
    in einer Grafik neue Kreise erzeugen und alte Kreise loeschen kann
    (das Schwergewicht kann hier natuerlich aufgrund der einfachen
    Anzeigekomponente nicht auf Benutzerfreundlichkeit liegen).  Dabei
    ist folgende Funktionalitaet zu implementieren:

    MB1: Beim Druecken: das Zentrum eines neuen Kreises festlegen;
         beim Loslassen: relativ zu diesem Zentrum den Umfang eines
         neuen Kreises festlegen und diesen neuen Kreis in die Grafik
         einfuegen.

    MB2: (Nicht belegt.)

    MB3: Den Kreis mit dem naechstliegenden Umfang loeschen (der
         Abstand eines Punktes vom Umfang eines Kreises laesst sich
         aus dem Betrag der Differenz zwischen dem Radius des Kreises
         und dem Abstand des Punktes vom Mittelpunkt des Kreises
         leicht berechnen; der Abstand zwischen zwei Punkten ergibt
         sich aus dem pythagoreischen Lehrsatz).

    u:   undo (letzte Operation rueckgaengig machen, d.h. entweder
         letzten geloeschten Kreis wieder einfuegen oder letzten
         eingefuegten Kreis wieder loeschen); undos sind undo-faehig.

    w:   write; Schreiben der Grafik in das File kred.kreise (die
         Grafik wird sinnvollerweise als Scheme-Ausdruck
         abgespeichert).

    r:   read; Einlesen des Files kred.kreise.

    q:   quit; Verlassen des Mini-Grafik-Editors.

    Nach jeder Aenderung muss die Grafik neu angezeigt werden.

    Ein Kreis wird in der internen Datenstruktur Eures Kreise-Editors
    am besten beschrieben ueber sein Zentrum (x, y) und seinen Radius
    (r); letzteren berechnet man ueber den pythagoreischen Lehrsatz.

    Sinnvollerweise haelt man sich eine aktuelle Liste der Kreise, die
    nach jeder Aenderung sowie bei Empfang eines Expose-Events
    angezeigt werden muss (fuer diese Anzeige-Funktion ist for-each
    nuetzlich). Diese Liste kann man einfach mit read und write
    internalisieren/externalisieren.  Zusaetzlich sollte man sich in
    einer weiteren globalen Variable die letzte Aenderung merken, um
    undo implementieren zu koennen.
    ----

    Achtung: Diese Aufgabe ist recht einfach!  Eine ziemlich verbos
    geschriebene Musterloesung hat 160 Zeilen Scheme-Code; Ihr solltet
    (aber muesst natuerlich nicht) mit weniger Zeilen auskommen.

    ~unix2/bin/kred-elk laedt uebrigens, falls in der aktuellen Direc-
    tory ein File kred.scm existiert, dieses beim Aufruf automatisch;
    das spart eine Menge Tipp-Arbeit beim Testen, wenn Ihr Euren
    Grafik-Editor kred.scm nennt.

______________________________________________________________________
Abgabe

    Elektronisch[1] am 18.05.1993, 18:00 MEZ.

_________________________

  [1] Der Tutor begutachtet in ~/unix2/ueb4 das File kred.scm.

UNIX-2 SS 93   Bormann et al                                         1


