Code und
              Software
Java

E3D

Dieses in Java geschriebene Package enthält die folgenden Applikationen:
  • Den 3D-Fraktal-Generator mit dem viele der hier beschriebenen Fraktale erzeugt werden können (mit dem hier beschriebenen Rendering-Algorithmus)
    E3DFractalRenderer
  • Den Image-Smoother der die Diskrete Wavelet-Transformation benutzt, wie sie hier erklärt wird
    DWT-Smoother
  • Den Bezier-Renderer der hier genauer erklärt wird, wobei der hier beschriebenen Rendering-Algorithmus verwendet wird.
    Bezier-Renderer
  • Einen "Typewriter" der den Bezier-Renderer benutzt, um spezielle Fonts zu erzeugen (wurde z.B. für die Überschrift der Bezier-Seite benutzt)
    Type-Writer
  • Einen (einfachen) Bezier-Editor mit dem Objekte erzeugt werden können, die dann mit dem Bezier-Renderer gerendert werden, wobei sie im Editor mit Java3D in "Echtzeit" visualisiert werden.
    3D-Editor
Voraussetzungen:
  • Java 1.6 (auch "6.0" genannt), oder 1.7 (auch "7.0" genannt) in der 32-Bit-Version (die geht auch auf einem 64-Bit-Rechner)
  • Windows (XP, Windows-7, 32- oder 64-Bit)
    oder
  • Linux (getestet unter KDE, 32- oder 64-Bit)
  • Java3D (nur für den Bezier-Editor nötig, alle anderen Applikationen funktionieren auch ohne Java3D)
Installation:

Einfach das entsprechende plattformabhängige Zip-Archiv entpacken. Es entsteht ein Verzeichis "E3D".

Run:
  • Unter Windows können die enthaltenen Batch-Dateien (*.bat) zum Starten der einzelnen Applikationen genutzt werden (ggf. muss das richtige Java mit dem vollständigen Pfad aufgerufen werden, wenn nicht im Suchpfad liegend). Unter den meisten Windows-Distributionen und wenn Java 1.6 im Suchpfad liegt dürften aber auch gleich die mitgelieferten Exe-Dateien funktionieren.
  • Unter Linux sind die Kommandos, wie sie in den *.sh Dateien enthalten sind zu verwenden, oder man tippt z.B. "sh E3DFractal.sh" für Fractal-Creator, oder man macht die *.sh Dateien ausführbar (z.B. chmod u+x Fractal.sh). Dann kann das jeweilige Programm direkt über die *.sh-Datei gestartet werden, indem man z.B. "./Fractal.sh" für den Fractal-Creator tippt. Für den Bezier-Editor muss der Inhalt der sh-Datei entsprechend des Installationsverzeichnisses von Java-3D angepasst werden.
Neue Features in der Version 1.x:
  • Man kann im Fractal-, Bezier-, und Schrift-Renderer über das Options-Menü einstellen, dass sofort nachdem ein Wert geändert wird eine Neuberechnung startet. Man muss nicht warten bis diese abgeschlossen ist, sondern kann sofort weitere Parameteränderungen vornehmen (eine ggf. bereits laufende Berechnung wird dann abgebrochen). Dabei werden nur die wirklich nötigen Rendering-Phasen neu angestoßen, während beim Drücken des Start-Buttons immer alle Phasen durchlaufen werden.
  • Filter zur Erzeugung von Tiefen-(un-)schärfe, sowie zur Blau- und Weißverschiebung sind dazugekommen, was dem räumlichen Eindruck zugute kommt.
  • Hintergrundbilder können gesetzt werden.
  • Ein Bezier-Editor (wenn auch noch nicht sonderlich gut benutzbar)
  • ...
Neue Features in der Version 2.x:
  • Der Bezier-Editor unterstützt jetzt die Ezeugung von Flächen aus NxM "Nadeln"/Punkten die dann als ein Objekt behandelt werden (vorher gab es nur einzelne Bezier-Flächen die durch 4 Nadeln definert wurden). Die Erzeugung einzelner Nadeln und einzelner Bezier-Flächen entfällt (es kann natürlich immer ein Fläche aus 2x2 Nadeln erzeugt werden, die einer einzelnen Fläche entspricht). Zeilen, Spalten können hinzugefügt und gelöscht werden. Mehrere Flächen können zusammengefügt ("verschmolzen") werden. Sie teilen sich dann einige gemeinsame Nadeln/Punkte.Die alten XML-Dateien können weiterhin eingelesen werden, beim Abspeichern werden einzelnen Bezier-Flächen dann aber als NxM-Flächen mit 2x2 Nadeln abgelegt. Hinzu kommen einige Bedienungsänderungen am Editor: So wird jetzt immer um den Punkt rotiert, der mit der Maus gepackt wurde. Außerdem wird auch immer auf den Punkt zugezoomt der mit der Maus gepackt wurde. Und beim Ändern der Perspektive mit den Tasten "Home", "End", "Up", "Down", "Left", "Right" wird der Mittelpunkt auch in der Mitte gehalten. Damit ist der Editor IMO schon deutlich handlicher geworden...
Neue Features in der Version 3.x:
  • Neuer Renderer (RayTracer) für die Fraktal-, Bezier- und TypeWriter-GUIs.
  • Weitere Neuerungen am Bezier-Editor.
  • Farbgebungs-Algorithmus Glühen ("Glowing") für die Fraktale.
  • B-Spline-Flächen (inkl. Konvertierung von Bezier- in B-Spline-Flächen zum kantenlosen Zusammenfügen)
Bugs:
  • Manchmal dauert es relativ lange (Windows und Linux) bis der (letzte) Fortschrittsbalken verschwindet und das fertige Bild angezeigt wird, obwohl längst 100% erreicht sind. Das hat wahrscheinlich damit zu tun, dass vor dem Beenden des Berechnungs-Threads der Garbage-Collector von Java aktiv wird und den oft recht großen zwischenzeitlich belegten Speicherplatz wieder freigibt (das muss ich mir noch genauer ansehen)
  • Sehr große Bilder (z.B. in der Gegend von 48 Megapixel) können von SWT nicht korrekt angezeigt werden. Dies ist inbesondere für den Bildglätter relevant. Es werden zwar jetzt (hoffentlich alle) diesbezüglichen Abstürze abgefangen und stattdessen eine Fehlermeldung angezeigt, so dass man zumindest noch speichern kann, jedoch ändert das an der Tatsache an sich nichts. Entweder man verwendet kleinere Bilder oder man muss im Blindflug arbeiten und sieht sich die Ergebnisse mit anderen Programmen an (die das besser können) - Allerdings kann das Speichern dann auch schon eine ganze Weile dauern (die Applikation "hängt" solange leider völlig).
  • Teilweise (aber eher selten) scheint das Abbrechen bereits laufender Berechnungen nicht zu klappen, was man daran sieht, dass die Fortschrittsbalken vor und zurück springen.
  • Unter Windows zeigt der Bezier-Editor anfangs oft nur ein weißes Bild. Abhilfe: kurz den Zoom-Faktor verändern.
(Hoffentlich) Behobene Bugs:
  • Die Slider funktionieren jetzt auch unter Linux normal.
  • Die Anzeige wird korrekt aktualisiert (vorher musste man teilweise das Fenster bewegen).
  • Die Hilfe-Seiten lassen sich jetzt auch unter Linux normal aufrufen (es muss nur ein Standard-Browser für Html-Dateien festgelegt worden sein, was normalerweise bereits der Fall sein sollte).
  • Unter Windows (zumindest Windows-7) ließ sich der Bezier-Editor nicht richtig beenden. Das Programm ließ sich nur noch abschießen. Unter Linux gab es keine derartigen Probleme.
 Download:

Windows: E3D_win32.zip (2.7MB)
Linux (KDE): E3D_KDE.zip (2.5MB)
Viel Spaß!
JavaScript

Bayes'sche Netze

Der Javascript-Code sowie weitere Dateien (Bilder, CSS, ...) zu den interaktiven Bayes'schen Netzen auf meiner Seite. Wie die Einbindung in eine HTML-Seite geht kann man sich dort ansehen. Ich habe hier diese Beispiele nicht direkt eingebunden, da sie weitere Resourcen benutzen. Der Code steht unter der GPL-Lizenz. Achtung: Die Anzeige funktioniert nur mit neuen Mozilla-Browsern wirklich gut. Webkit-basierte Browser funktionieren mit ganz leichten optischen Einschränkungen ebenfalls. Mit Opera-Browsern werden die Kanten nicht richtig dargestellt.

Download:
pn4web.zip (ca. 1MB) (enthält das Verzeichnis js/pn4web mit allen JavaScript-Dateien und Bildern sowie die Datei GPL_LICENSE)

Navigations-Leiste

Die dhtml-/JavaScript-basierte Navigationsleiste, wie ich sie auf meiner Seite verwende (sofern JavaScript aktiviert ist, sollte diese z.B. auch auf dieser Seite, am linken Fensterrand sichtbar sein). Die Lösung mit JavaScript hat den Nachteil, dass sie nicht funktioniert, wenn JavaScript nicht aktiviert ist, hat aber den Vorteil, dass sie auch auf Seiten eingesetzt werden kann, wo php, cgi, etc. nicht möglich ist. Gegenüber einer rein CSS-basierten Lösung hat sie dabei den Vorteil, dass nur an einer Stelle (navbar.js) Änderungen vorgenommen werden müssen, wenn sich die Einträge des Navigationsmenüs ändern sollen.
Das Verzeichnis js/ sollte direkt im Basis-Verzeichnis der Seite stehen. Die Datei navbar.js ist entsprechend der eigenen Seiten-Parameter und Unterseiten-Aufteilung anzupassen, Die Bilder für den Navigationsbereich, den "Slider" sowie die Icons sollten ebenfalls an das eigene Design angepasst werden. Seiten, die die Navigationsleiste benutzen, müssen ein paar spezielle Elemente definieren (siehe Kommentar in navbar.js). Der Code steht unter der GPL-Lizenz. Achtung: stark veraltete Browser ohne DOM-Unterstützung werden nicht mehr unterstützt.

Download:
navbar.zip (66kB) (enthält das Verzeichnis js/ mit allen JavaScript-Dateien und Bildern sowie die Datei GPL_LICENSE)

Bild-Galerie

Die dhtml-/JavaScript-basierte Galerie, wie ich sie auf meiner Seite an mehreren Stellen verwende (siehe Fraktal-Galerie, Portrait-Zeichnungen). Links auf Bilddateien werden dabei so "umgebogen", dass die Bilder in einer Art "Popup-Fenster" angezeigt werden. Die Lösung mit JavaScript hat den Nachteil, dass sie nicht funktioniert, wenn JavaScript nicht aktiviert ist. In diesem Fall werden keine Links umgebogen und die Bilder würden direkt geöffnet (allerdings ohne Bildunterschriften, die im Popup-Fenster zusätzlich angezeigt werden, falls ein (unsichtbares) <Div>-Element im Link-Element hinterlegt ist. Ein Mini-Ausschnitt einer Html-Datei zur Verdeutlichung der Funktionsweise:

<head>
  ...
  <script type="text/javascript" src="../js/dhtml.js"></script>
  <script type="text/javascript" src="../js/navbar.js"></script>
  <script type="text/javascript" src="../js/galery.js"></script>
  // Diverse CSS-Einstellungen werden zusätzlich benötigt, um
  // das Aussehen des Popup-Fensters festzulegen. Diese können
  // hier "inline" oder in einer extra CSS-Datei gemacht werden.
</head>
<body onload="initGalery('Galery1',1,36);">    // Umbiegen der Links (z.B. Bild1.jpg)
  <div id="GaleryPopup1" class="galeryPopup">  // Popup1 und Popup2 werden alternierend
    Kein JavaScript aktiviert                  // benutzt (quasi ein Double-Buffering)
  </div>
  <div id="GaleryPopup2" class="galeryPopup">
   
Kein JavaScript aktiviert
  </div>
  <div id="GaleryPreview" class="galeryPreview">  // Kleines Vorschau-Fenster
    <img id="GaleryPreviewImg" src="" width="1" heigh="1">
  </div>
  <div id="Progress">
                             // Busy-Progress-Bar
    <img src="../js/waiting.gif" alt="Wait...">
  </div>

  <div id="Galery1">

    <a id="ID1" href="Bild1.jpg"> // eindeutige ID wird benötigt (eigentlich nur wegen
      <img src="Thumbnail1.jpg">  // eines Bugs der zumindest im SeaMonkey vorkommt)
      <div class="detail">        // "detail" sollte via CSS unsichtbar gemacht werden
        Text (Html), der unter dem Bild angezeigt
        werden soll (mit Formatierungen, etc.)
      </div>
    </a>
    ...
  </div>
...
</body>

Das Verzeichnis js/ sollte wieder direkt im Basis-Verzeichnis der Seite stehen. Weitere Informationen zur Verwendung (z.B. nötige CSS-Einstellungen) sind dem Quellcode, oder dem Quelltext der Seiten, auf denen ich die Galerie selbst verwende, zu entnehmen. Der Code steht ebenfalls unter der GPL-LizenzAchtung: stark veraltete Browser ohne DOM-Unterstützung werden nicht mehr unterstützt.

Download:
galery.zip (83kB) (enthält das Verzeichnis js/ mit allen JavaScript-Dateien und Bildern sowie die Datei GPL_LICENSE)
C++

Content-Manager

C++-Code zum "Managen" des in einer eigenen Klasse C "verpackten" Inhalts einer Klasse T.
Eine Instanz der Klasse T (z.B. t) "verpackt" alle ihre Attribute in einer Instanz der Klasse C und hat (idealer Weise) keine weiteren Attribute. "Managen" bedeutet hier, dass derselbe Inhalt mehrere "Besitzer" (Instanzen der Klasse T) haben kann. Sobald einer dieser Besitzer aber seinen Inhalt verändern will, wird für diesen automatisch eine eigene Kopie angelegt. Unnötiges Kopieren wird damit vermieden. Der Code steht unter der GPL-Lizenz. Eine ausführlichere Erklärung ist im Kommentar-Header von contentManager.hh gegeben.

Download:
contentManager.tar.gz (12kB) (enthält die Dateien: contentManager.hh und GPL_LICENSE)

3-D

C++-Code für Vektoren, Linien, Flächen und Rotationen im 3D euklidischen Raum. Der Code steht unter der GPL-Lizenz.

Download:
d3.tar.gz (11kB) (enthält die Dateien: d3.cpp, mathematical.cpp und GPL_LICENSE)

Photoimage

Einfaches Interface für libtiff und libjpeg. Nich besonders schön und wenig kommentiert - sollte trotzdem halbwegs verständlich sein - hoffe ich... Auch dieser Code steht unter der GPL-Lizenz.

Download:

photoimage.tar.gz (12kB) (enthält die Dateien: photoimage.cpp, image.cpp, color.cpp, mathematical.cpp und GPL_LICENSE)

Fraktale

Beschreibungen zu Fraktalen (2D und hauptsächlich 3D) findet man hier. Der Code ist hier zu besichtigen, kann aber auch gleich hier gezogen werden. Es handelt sich nur um den reinen Code zur Fraktal-Berechnung das geschickte Suchen nach den Umrissen eines 3D-Fraktals sowie das Rendering sind nicht enthalten. Achtung: Dies ist eine alte Version und enthält noch keine Abstandsmaßberechnung (worum es dabei geht, ist auch auf der o.g. Seite beschrieben)!
Und na was wohl? Auch dieser Code steht unter der GPL-Lizenz.

Download:

fractal.tar.gz (5kB) (enthält die Dateien: fract.cpp und GPL_LICENSE)

Wavelets

Ein paar Code-Schnipsel und Erklärungen zur Diskreten Wavelet Transformation (DWT) finden sich auf dieser Seite.
Der komplette Code für das Image-Smoothing per DWT kann man sich hier runterladen. Der Code steht natürlich auch unter der GPL-Lizenz.
Achtung: Zusätzlich wird das Photoimage-Paket benötigt.

Download:
wavelet.tar.gz (11kB) (enthält die Dateien: wavelet.cpp, wavesmooth.cpp, mathematical.cpp und GPL_LICENSE)
Perl

Speedbar

Das ist der Perl-CGI-Code, der meine ehemalige Navigantionsleiste aka. "Speedbar" erzeugte. Hier wurden Frames benutzt und die Optik ist entsprechend etwas aus der Mode...
Die Pfade in mkSpeedbar.cgi sind natürlich an die jeweilige Datei-Struktur anzupassen. Der Aufruf erfolgt über einen Link - zB.: ~/www/cgi-bin/mkSpeedbar?path=../index.html. Zu beachten ist insbesondere, dass die Pfade alle mit "../" anfangen, da die beiden Funktionen mkSpeedbar.cgi und withSpeedbar im Verzeichnis "~/www/cgi-bin/" oberhalb des WWW-Root-Verzeichnisses "~/www/" stehen. Auch dieser Code steht wieder unter der GPL-Lizenz.

Anmerkung:
Da diese Lösung, nach dem Umzug der Seite, bei mir nicht mehr in Frage kommt, habe ich eine neue JavaScript-basierte Navigationsleiste gebaut, die ebenfalls hier runtergeladen werden kann.

Download:
speedbar.tar.gz (11kB) (enthält die Dateien: mkSpeedbar, withSpeedbar.cgi, .opened.gif, .closed.gif, .leaf.gif und GPL_LICENSE)
Tcl/Tk

PS-Print

Mit diesem Tcl/Tk-Modul kann man Postscript-Ausgaben von komplexen Widgets erzeugen. Der Trick besteht darin, dass die Widgets in einem Canvas nachgezeichnet werden, was allerdings ein nur näherungsweise ähnliches Aussehen ergibt. Das Canvas-Widget stellt eine PS-Export-Funktion zur Verfügung, die dann genutzt wird. Gescrollte Widgets funktionieren nur wenn das Img-Package installiert ist. In diesem Fall wächst die Größe des Postscript-Outputs u.U. dramatisch an. Mit einer kleinen Änderung kann der dafür genutzte Weg über einen Snapshot immer beschritten werden, was dann eine identische Widergabe des Widgets sicherstellt. Auch dieser Code steht natürlich unter der GPL-Lizenz.

Download:
psprint.tar.gz (12kB) (enthält die Dateien: psprint.tcl und GPL_LICENSE)

Profiler


Ein Tcl/Tk-Front-End für den gprof Profiler gibt's hier.
Matlab

Fraktal

Ein Mini-Beispiel für die Erzeugung eines Mandelbrot-Fraktals mit Matlab/Octave gibt's hier.
Feedback
Freue mich über eure Meinungen, Anregungen, usw.
Mail-Adresse.
Feedback-Formular
Patrick Rammelt, 2011