Wir malen einen Stammbaum

„I’ve been looking so long at these pictures of you
That I almost believe that they’re real“
— The Cure

Nachdem wir in den ersten beiden Beiträgen Stammbäume für Entwickler und GEDCOM im Detail etwas über die Datenquellen erfahren haben, wenden wir uns nun dem eigentlichen Wunsch der beiden agilen Kunden zu.

Meine Töchter Alicia und Fiona wünschen die graphische Darstellung eines Stammbaumes,  dessen Wurzel eine von ihnen ist. Die klassische Darstellung der Ahnen, die schon seit biblischen Tagen ihre Tücken hat. Dazu aber später.

In meinen Backlog habe ich mir zusätzlich die Story zur Darstellung der Nachfahren eingefügt. Solch ein Baum hat den familiären Vorteil, dass alle lebenden Verwandten abgebildet werden. Außerdem habe ich natürlich die Verallgemeinerung vorgenommen, dass jede Person in der GEDCOM Datei die Wurzel einer Stammbaum Darstellung sein kann. Bei dem einen oder anderen Ahnen wird es ein recht kleiner Baum, da seine Eltern unbekannt sind.

Eine triviale Lösung zum Zeichnen eines Stammbaums ist die maximale Anzahl der Generationen zu bestimmen um dann einen vollständigen Baum über diese Anzahl Ebenen zu konstruieren. Da jeder Mensch zwei Eltern hat, erhalten wir einen wunderbar symmetrischen Binärbaum, der nur in den meisten Fällen zwei gravierende Mängel aufweist.

Die meisten Felder im Baum sind leer aber dafür ist der Baum auch ein echter Platzkiller. Bei den Urgroßeltern stehen schon 8 Einträge nebeneinander und bei den Ururgroßeltern schon 16. Der Stammbaum der Familie Kaiser umfasst 11 Generationen, der Baum hätte also 1024 Blätter auf der obersten Ebene.

Bei Stammbäumen dünnen sich die Informationen aber schnell aus, weil einige Ahnen unbekannt sind und mit ihnen auch der gesamte Ast ihrer Vorfahren. Der Stammbaum der Familie Kaiser umfasst 11 Generationen, der Baum hätte also 1024 Blätter auf der obersten Ebene. Bekannt sind aber nur 4 Ahnen, die Namen der  restlichen 1020 sind den Wirren von Kriegen, Hungersnöten, Familienfehden, Erbstreiteren und Umzügen zum Opfer gefallen.

Wenn der triviale Weg den Software Entwickler nicht zum Ziel bringt, dann zäumt er gerne den Gaul von hinten auf. Das Zauberwort heißt Rekursion.

Ich male meinen Stammbaum, indem ich erst den Stammbaum meiner Mutter zeichne und dann den meines Vaters. Danach lege ich beide passgenau nebeneinander und zeichne zentriert einen Kasten mit meinem Namen darunter. Wenn ich dann noch zwei Verbindungslinien zu den Elternstammbäumen ziehe, ist mein Stammbaum fertig. Die Rekursion ergibt sich aus der Frage, woher bekomme ich denn die Stammbäume für Vater und Mutter? Indem ich die selbe Zeichenregel anwende, die ich auch für meinen eigenen Baum verwendet habe. Ich male also erst den Stammbaum von Oma, dann den von Opa und dann beide nebeneinanderlegen und den Kasten ihres Kindes darunter.  Dieses Matrjoschka Spiel hört nach spätestens 10 Wiederholungen auf, da diese meiner Ahnen keine bekannten Eltern haben und sie ihren Kindern nur den eigenen Kasten als Stammbaum vermachen können.

Bevor hier das reflexartige Wehklagen über Rekursion beginnt, wir können auch anders. Bei einem Stammbaum handelt es sich um einen Baum, dessen Knoten und Blätter wir auch depth-first mit einem Visitor durchlaufen können. Am ersten Blatt angekommen, lassen wir uns von Friedrich Magnus seinen Kasten geben um dann im nächsten Schritt bei seiner Frau Anna Sophia ihren Kasten abzuholen. Beide Kästen nehmen wir auf den Rückweg zu ihrem Sohn Christoph mit, bei dem dann das erste Mal aus drei Kästen ein minimaler Stammbaum erstellt wird. So läuft der Visitor, dann von Ahne zu Ahne und erstellt dabei, wie im Vorbeigehen, den Stammbaum meiner Töchter.

Diese Art der Konstruktion hilft auch immens Platz zu sparen. Hat eine Person keine weiteren Vorfahren, dann erweitert sich der Platz für diesen Zweig nicht weiter. Hat eine Person nur einen bekannten Elternteil, dann kann man ihre Kästen direkt untereinander anordnen und benötigt keinen weiteren Platz.

Bevor wir nun zur graphischen Umsetzung mit SVG kommen, noch kurz die biblische Anekdote zum Zeichnen von Stammbäumen. Dank der fleißigen Arbeit einiger Christen, gibt es auch GEDCOM Dateien, der Familie von Adam und Eva und weiteren Protagonisten der biblischen Geschichten. Um meiner Jüngsten die Tauglichkeit meines Algorithmus zu demonstrieren erstellte ich also den Stammbaum von Jesus und erhielt sofort eine vernichtende Kritik. An den Blättern des Stammbaums waren Adam und Eva mehrfach anzutreffen, da ich den biblischen Inzest nicht in Betracht gezogen habe. Mein Baum wucherte zu stark, weil Inzest Kinder eben nur einen Opa und eine Oma haben. Wir haben uns pragmatisch auf den Standpunkt zurückgezogen, dass wir weder Inzest noch das Alte Testament unterstützen werden.

Die grundlegenden geometrischen Betrachtungen sind damit abgeschlossen und die Umsetzung in das Format SVG kann beginnen. Bei SVG handelt es sich um ein  XML basiertes Format für Vektorgraphiken. Dieses Format hat einige sehr angenehme Eigenschaften für die Erstellung unserer Stammbäume.

Erstens können wir das Format mit einer Vielzahl von Tools bearbeiten. Mit Inkscape interaktiv verändern und mit der Batik Bibliothek in Bitmap Formate konvertieren. Zweitens ist die Bildgröße beim erstellen egal, wir können die Vektorgrafik für beliebige Größen bereitstellen, indem wir das Ergebnis skalieren. Drittens benötigen wir keinerlei weitere Bibliotheken zum Erstellen der Grafik, da alle Graphikoperatoren über XML Elemente beschrieben werden. Viertens existiert die Möglichkeit in SVG Grafikelemente zu Gruppen zusammenzufassen. Auf diese Art können wir z.B. in Inkscape einzelne Kästen im Stammbaum einfacher manipulieren.

Die tatsächliche Umsetzung von Personeninformationen in SVG Graphiken ist trivial und hier nur einmal das Ergebnis für den Kasten für Bart Simpson dargestellt. Es handelt sich um eine SVG Gruppe <g> bestehend aus einem abgerundeten Rechteck <rect> mit Rahmen und dem Namen als Text <text>. Zu beachten gilt hier, die Maße des Rechtecks wurden nicht berechnet, alle haben die gleichen Abmessungen und die Werte sind fest kodiert. Damit der Stammbaum beim Öffnen in Inkscape auf eine DIN A4 Seite passt, enthält die Datei eine passende Skalierungsoperation. Der Stammbaum kann selbstverständlich auch in DIN A3, DIN B4 und DIN B5 generiert werden.

<g>
<rect rx="4"ry="4" x="0" y="90" width="200" height="20" style="stroke-width:2;stroke:blue;fill:rgb(213, 213, 255)"/>
<text x="4" y="105" fill="black">Bart Simpson</text>
</g>

Schwierg gestaltete sich hier hauptsächlich die Diskussion mit dem Kunden über diverse Änderungswünsche bei der grafischen Gestaltung.

So stiess als erstes der monochrome Entwurf auf wenig Gegenliebe und wurde durch den hier vorgestellten geschlechtsspezifisch gefärbten ersetzt. Auch mussten die Ecken der Kästen abgerundet werden. Eine spätere Herausforderung ergab sich durch die Anforderung, dass auch Geschwister im Stammbaum zu sehen sein sollten. Wichtige Argumente, dass so die Berechnung komplizierter werden würde, Geschwister dort nichts zu suchen haben und überhaupt, wurden durch Kulleraugenrollen überstimmt.

Akzeptiert wurden Ergänzungen von der Entwicklung für eine DSGVO konforme Darstellung öffentlich zugänglicher Stammbäume, ein kurzer Trennstrich zwischen Namen und Daten und das Ausgrauen  von Geschwistern, die im Kindesalter verstorben sind.

Mittlerweile besitzen diverse Familienmitglieder ihren eigenen Stammbaum, mit Inkcape um einen gefälligen Hintergrund bereichert und als Poster ausgedruckt, im eigenem Domizil.