Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Progforum Contest 2013 - Teenage Mutant Ninja (?) Turtles



Ineluki
15.03.2013, 23:11
Willkommen, liebes Progforum, zu unserem alljaehrlichen Programmier-Contest !

Dieses Jahr haben wir (d.h. Jeez, DFYX und ich) uns etwas ganz Besonderes ausgedacht.
Um allen gerecht zu werden, haben wir uns ueberlegt, dieses Mal sowohl etwas Programmiertechnisches als auch etwas Kuenstlerisches zu machen.

Ziel ist es, einen Interpreter fuer unseren speziellen Turtle-Graphik (http://en.wikipedia.org/wiki/Turtle_graphics)-Dialekt zu schreiben und damit ein aesthetisch besonders ansprechendes Bild (inklusive des Turtle-Graphik-Codes) zu generieren.
Hierzu bieten sich L-Systeme (http://en.wikipedia.org/wiki/L-system) an, muessen aber nicht verwendet werden.

Wie letzten Endes die Graphiken erzeugt werden, ist jedem selbst ueberlassen. Hauptsache ist, man kann sie am Ende hier im Forum praesentieren. Valide Moeglichkeiten sind so z.B.


C++ Programm mit SDL / OpenGL
Javascript und / oder HTML5
Bashscript, das eine SVG-Datei erzeugt
DCPU16 Assembler, welches eine Portable Pixmap Datei ausgibt
... was euch sonst noch einfaellt


Der Contest besteht aus drei abstimmbaren Teilen.
1. Der Sourcecode des Interpreters - wie elegant und womit setzt ihr den Turtle-Graphik-Interpreter um?
2. Die Aesthetik eueres eingesendeten Beispielbildes
3. Die Art und Weise, wie ihr zum Code eueres Beispielbildes gekommen seid.

Gewinner ist derjenige, der in der Summe aller drei Multiple-Choice-Umfragen die meissten Prozentpunkte erreicht.

Einsendeschluss ist voraussichtlich Sonntag, der 14. April. Anschliessend gibt es zwei Wochen Zeit für die Abstimmung.

Jeder Interpreter gilt als eigenstaendige Einsendung. Es steht allerdings jedem frei, mehrere Einsendungen zu machen oder mehrere Bilder zu seinem Interpreter abzugeben. Es zaehlt dann in allen Kategorien das jeweils beste Ergebnis.

Dieses Mal wird es sogar etwas zu gewinnen geben. Jeez, DFYX und ich haben ein paar Steam-Keys gesponsort (wenn ihr euch anschliessen wollt, weitere Keys sind gerne willkommen), aus denen die Gewinner waehlen koennen.
Der erste Platz darf sich 3 Keys aussuchen, der zweite Platz zwei Keys und der dritte Platz bekommt noch einen Key. Bisher haben wir folgende Keys im Angebot:


Bastion
Cargo! The Quest for Gravity
Cave Story +
2x Crayon Physics Deluxe
2x Cogs
Defcon
2x Dungeon Defenders + DLC
Gemini Rue
Gish
Humble Bundle 3
2x Machinarium
Multivinia
NightSky
Resonance
3x Superbrothers: Sword & Sorcery EP
Swords and Soldiers HD
The Binding of Isaac
Titan Quest (German)
Trine
Warhammer 40,000: Dawn of War


Und damit ihr auch wisst, was euerer Interpreter mindestens koennen muss, hier alle notwendigen Befehle fuer die Turtle-Graphik:


2D Turtle-Grafik, optional auf 3D (oder mehr) erweiterbar

F : move forward $length units while drawing
X : move forward $length units without drawing
* : multiply length with $factor
/ : divide length by $factor
+ : turn left by $angle degrees
- : turn right by $angle degrees
> : multiply angle with $factor
< : divide angle by $factor
! : increase $factor by 1
? : decrease $factor by 1
[ : push all states to stack
] : pop all states from stack
0-7: line colour, Palette: black, red, green, yellow, blue, magenta, cyan, white

Es duerfen auch zusaetzliche Operationen verwendet werden.
(z.B. Laden von RGB-Farbpaletten, etc)

Startzustand:
$factor: 2
$length: 1
$angle: 90
Facing up at start


Und nun viel Spass mit unserem Contest.

Whiz-zarD
16.03.2013, 22:34
Kleine Anmerkung:


[...]
0-8: line colour, Palette: black, red, green, yellow, blue, magenta, cyan, white
[...]

Das muss "0-7" heißen. ^^

Aber dass mit dem Stack versteh ich noch nicht so ganz. Heißt das, wenn ich z.B. "[FFF]" eingebe, dass er dann die drei Schritte nochmal ausführt? Kann man dann mit "]" den Stack nochmal ausführen? Also "[FFF]]"?

Ansonsten: Sehr netter Wettbewerb. Ich versuch da auch mal was zu basteln. Ich hoffe, dass Java trotz der ganzen Sicherheitsbedenken erlaubt ist. ^^

DFYX
16.03.2013, 23:16
Sollte 0-7 heißen, ja.

Stack ist so zu verstehen, dass bei "]" die Position und Orientierung des "Stifts", sowie $factor, $length und $angle wieder auf die Werte gesetzt werden, die sie beim zugehörigen "[" hatten.

"F/[+F]-F" würde also zum Beispiel ein T zeichnen. (Gibt übrigens ein schönes Fraktal, wenn man rekursiv jedes F außer dem ersten wieder durch diese Zeichenkette ersetzt)

Whiz-zarD
16.03.2013, 23:56
ah, ok. Also leichter, als ich dachte. Danke :)

DFYX
17.03.2013, 02:24
Noch zwei Dinge, die mir grade so aufgefallen sind:

Ihr solltet für euch selbst definieren, was passiert, wenn jemand eine ungültige Operation ausführen will. Also etwa durch 0 teilen oder von einem leeren Stack poppen. Ich für meinen Teil werde solche Befehle schlicht ignorieren und eine Warnmeldung ausgeben. Ähnliche Überlegungen sollte man auch für die Multiplikation mit 0 anstellen, weil sich der Stift anschließend nicht mehr bewegen bzw. nicht mehr rotieren lässt.

Außerdem wird natürlich auch die Farbe auf den Stack gepusht. Das hatte ich vorhin vergessen.

Cornix
17.03.2013, 14:18
Wie soll der Code eingelesen werden? Command-Prompt, Textdokument oder dergleichen?

DFYX
17.03.2013, 14:26
Bleibt euch überlassen. Insgesamt habt ihr so ziemlich überall, wo wir nichts vorgegeben haben, freie Hand.

Whiz-zarD
17.03.2013, 15:32
mmh, Programm steht, aber ich bin zu untalentiert für solche Grafiken >_<

Cornix
17.03.2013, 18:48
Wie sollen die Einsendungen eingeschickt werden?

Whiz-zarD
17.03.2013, 18:50
Bis jetzt war es immer so, dass die Ergebnisse in einem Thread präsentiert wurden waren.

Ineluki
17.03.2013, 19:14
Genau. Einsendungen hier in den Thread. Die Umfragen kommen dann in jeweils separate Threads, ebenso wie die Siegerehrung.

Cornix
17.03.2013, 23:23
Hier ist meine Abgabe.
Einmal der Source-Code, eine Windows-, Mac- und Linux-Version.
Ich kann persönlich nur die Windows-Version testen, für die Mac- und Linux-Versionen ist keine Garantie von meiner Seite, dass sie starten werden.

Code ist in Java geschrieben.
Für den Grafikkontext wird OpenGL verwendet, als Wrapper lwjgl.

Der Source-Code kann einfach erweitert werden um zusätzliche Operationen hinzuzufügen.
Wird das Programm über die Kommandozeile gestartet wird das erste übergebene Argument, falls vorhanden, als Code kompiliert.
Weitere Argumente werden ignoriert.
Sollte kein Argument übergeben werden oder nicht über die Kommandozeile gestartet werden wird ein zufälliger Code von Länge 500 oder mehr Zeichen erzeugt.
Fehler werden, sofern nicht über eine Kommandozeile gestartet wurde, in die Datei Out.txt geschrieben.

An Operationen sind derzeit nur die vorgegebenen implementiert. Weitere Funktionen sollten jedoch sehr einfach selbst erstellt werden können.
Da das ganze Programm sehr Objektorientiert programmiert ist, und zudem in Java, ist es bei weitem nicht so effizient wie es sein könnte. Falls man einen sehr langen Code mit sehr vielen Zeichenaufrufen verwendet muss man eventuell die Heap-Size vergrößern.

Fenstergröße ist fix auf 640x480 eingestellt, kein Vollbild. V-Sync ist aktiviert, framerate zum Zeichnen liegt bei 10 FPS.
Mit Druck auf die Escape-Taste kann die Anwendung beendet werden.

Special thanks to lwjgl (http://www.lwjgl.org/)für die wundervolle API und die aktive Hilfe im Forum.

Source-Code: http://www.file-upload.net/download-7342935/Turtle-Contest-Cornix-Source.zip.html

Windows: http://www.file-upload.net/download-7342938/Turtle-Contest-Cornix-Windows.zip.html

Mac: http://www.file-upload.net/download-7342939/Turtle-Contest-Cornix-Mac.zip.html

Linux: http://www.file-upload.net/download-7342942/Turtle-Contest-Cornix-Linux.zip.html

Hier ein Beispiel wie der (OpenGL) Compiler Initialisiert werden kann:

OGL_Turtle_Compiler compiler = new OGL_Turtle_Compiler();
compiler.add_operation(new Operation_Color("0", 0, 0, 0));
compiler.add_operation(new Operation_Color("1", 1, 0, 0));
compiler.add_operation(new Operation_Color("2", 0, 1, 0));
compiler.add_operation(new Operation_Color("3", 1, 1, 0));
compiler.add_operation(new Operation_Color("4", 0, 0, 1));
compiler.add_operation(new Operation_Color("5", 1, 0, 1));
compiler.add_operation(new Operation_Color("6", 0, 1, 1));
compiler.add_operation(new Operation_Color("7", 1, 1, 1));
compiler.add_operation(new Operation_FactorDecr());
compiler.add_operation(new Operation_FactorIncr());
compiler.add_operation(new Operation_Draw());
compiler.add_operation(new Operation_Move());
compiler.add_operation(new Operation_Mult());
compiler.add_operation(new Operation_LengthDiv());
compiler.add_operation(new Operation_Push());
compiler.add_operation(new Operation_Pop());
compiler.add_operation(new Operation_TurnLeft());
compiler.add_operation(new Operation_TurnRight());
compiler.add_operation(new Operation_TurnMult());
compiler.add_operation(new Operation_TurnDiv());
OGL_Turtle_Program prog = compiler.compile("F/[+F]-F");
Turtle_Graphic img = prog.run();

Und hier ein Beispiel wie eine einzelne Operation implementiert werden kann:

public class Operation_TurnLeft extends Turtle_Operation {
private static final long serialVersionUID = 5036124779502200375L;

private static final String TOKEN = "+";

public String get_token() {
return TOKEN;
}

public void affect(final Turtle_Program prog, final Turtle_Graphic image) {
final Turtle_State state = prog.get_state();
final Turtle turtle = state.get_turtle();
turtle.set_angle(turtle.get_angle() + state.get_angle());
}

public Turtle_Operation clone() {
return new Operation_TurnLeft();
}

}

Sollte das Programm zufälligerweise nicht starten dann bitte ich darum, dass so schnell wie möglich Bescheid gegeben werden kann.
Bei Fragen und Anregungen bitte hier im Forum kontaktieren oder per Mail an: CornixMail@gmail.com


Edit:
Mir ist aufgefallen, dass ich einen ziemlich dummen Fehler in dem Algorithmus für den zufälligen Code habe. Allerdings stellt dies in dieser Situation kein Problem dar, ganz im Gegenteil, das Ergebnis wird durch den Fehler sogar noch verbessert.
Hier ist ein Screenshot von dem, von DFYX (http://www.multimediaxis.de/members/4747-DFYX) als Beispiel angegebenen, rekursiven Code-Schnipsels:
http://www7.pic-upload.de/18.03.13/gqvr8f7ubvlb.png

DFYX
18.03.2013, 00:02
Tut nicht unter Mac OS X:


### Mon Mar 18 01:01:43 CET 2013 ###


org.lwjgl.LWJGLException: Could not get the JAWT interface
at org.lwjgl.opengl.AWTSurfaceLock.lockAndInitHandle(Native Method)
at org.lwjgl.opengl.AWTSurfaceLock.access$100(AWTSurfaceLock.java:51)
at org.lwjgl.opengl.AWTSurfaceLock$1.run(AWTSurfaceLock.java:94)
at org.lwjgl.opengl.AWTSurfaceLock$1.run(AWTSurfaceLock.java:92)
at java.security.AccessController.doPrivileged(Native Method)
at org.lwjgl.opengl.AWTSurfaceLock.privilegedLockAndInitHandle(AWTSurfaceLock.java:92)
at org.lwjgl.opengl.AWTSurfaceLock.lockAndGetHandle(AWTSurfaceLock.java:66)
at org.lwjgl.opengl.MacOSXCanvasPeerInfo.initHandle(MacOSXCanvasPeerInfo.java:57)
at org.lwjgl.opengl.MacOSXDisplayPeerInfo.doLockAndInitHandle(MacOSXDisplayPeerInfo.java:56)
at org.lwjgl.opengl.PeerInfo.lockAndGetHandle(PeerInfo.java:85)
at org.lwjgl.opengl.MacOSXContextImplementation.create(MacOSXContextImplementation.java:47)
at org.lwjgl.opengl.ContextGL.<init>(ContextGL.java:132)
at org.lwjgl.opengl.Display.create(Display.java:847)
at org.lwjgl.opengl.Display.create(Display.java:754)
at org.lwjgl.opengl.Display.create(Display.java:736)
at cs.turtle.misc.OGLWrapper.make_display(OGLWrapper.java:39)
at cs.turtle.misc.MainContest.main(MainContest.java:50)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)


Dazu auf der Kommandozeile:

JavaVM WARNING: JAWT_GetAWT must be called after loading a JVM

Cornix
18.03.2013, 00:09
Vielen Dank für die Information.
Eine schnelle Google-Suche ergab folgenden Treffer zu dem Problem:
http://lwjgl.org/forum/index.php?topic=4326.0


it seems that the JAWT/NSView API will intentionally not be included in OpenJDK 7

the OS X port of LWJGL needs to be completely rewritten
So wie es aussieht, heist das also, dass dieses Programm auf Mac nicht laufen wird.
Zumindest nicht solange die nächste Version von lwjgl erscheint.
Ich werde mich trotzdem versuchen noch ein bisschen zu diesem Thema schlau zu machen, vielleicht lässt sich ein Weg finden, immerhin ist dieser Beitrag bereits ein Jahr alt.

Edit: Wie es aussieht wurde das Problem bis heute noch nicht komplett aus der Welt geschafft: http://lwjgl.org/forum/index.php/topic,4711.msg26517.html#msg26517

DFYX
18.03.2013, 00:31
Weird. Ich denke allerdings nicht, dass das ein generelles Problem von LWJGL ist. Schließlich laufen genug andere Programme, die auf die Bibliothek setzen, einwandfrei unter OS X (allen voran Minecraft)

Edit:
Es könnte ein Kompatibilitätsproblem von LWJGL mit Java 1.7 unter OS X sein. Evtl. mal mit dem vorinstallierten Java 1.6 probieren. Allerdings muss ich dafür deinen Code erstmal neu kompilieren.

Cornix
18.03.2013, 00:36
Weird. Ich denke allerdings nicht, dass das ein generelles Problem von LWJGL ist. Schließlich laufen genug andere Programme, die auf die Bibliothek setzen, einwandfrei unter OS X (allen voran Minecraft)

Edit:
Es könnte ein Kompatibilitätsproblem von LWJGL mit Java 1.7 unter OS X sein. Evtl. mal mit dem vorinstallierten Java 1.6 probieren. Allerdings muss ich dafür deinen Code erstmal neu kompilieren.

Das kannst du gerne probieren.
Der Quellcode müsste vollständig sein. Ich hoffe das Neukompilieren wird helfen.

Edit:
Eine Frage noch am Rande: Wird die Anzahl der vorhandenen Operationen einen Einfluss auf die Bewertung haben?

DFYX
18.03.2013, 00:52
Eine Frage noch am Rande: Wird die Anzahl der vorhandenen Operationen einen Einfluss auf die Bewertung haben?
Die Bewertung läuft per Abstimmung durch die Userschaft. Dementsprechend können wir kaum Vorhersagen machen, worauf die Leute Wert legen werden.

csg
18.03.2013, 01:29
Zuerst hatte ich nicht vor teilzunehmen, aber irgendwie hat mich das Thema dann doch gepackt :D Sehr schönter Contest! Echt toll, was man mit so einem kleinen Spielzeug für interessante Bilder erzeugen kann. Mein Programm steht im groben, einzig die Farben sind noch nicht integriert. Wenn mir bis zur Abgabe noch lustige Features einfallen, kommen die noch rein.

http://share.cherrytree.at/showfile-9366/tmnt_temp.png

Cornix
18.03.2013, 10:10
Nocheinmal eine Frage:
Ist die angegebene Syntax aus dem Eröffnungsbeitrag verpflichtend oder dürfen wir die Operationen umbenennen falls wir es für passend empfinden? Wenn wir sie umbenennen dürfen werden parametrisierte Eingaben erlaubt oder nur atomare Operationen?

Whiz-zarD
18.03.2013, 10:45
Aufgrund der besseren Vergleichbarkeit würde ich doch eher vorschlagen, dass die eingesendeten Programme lediglich nur das besitzen, was vorgeschrieben wurde.

DFYX
18.03.2013, 12:02
Gedacht war, dass eure Programme die oben genannte Syntax verstehen sollten. Ihr dürft sie natürlich um zusätzliche Befehle erweitern oder wegen mir auch zusätzlich eine zweite davon unabhängige Syntax unterstützen. Da sollen eurer Fantasie erstmal keine Grenzen gesetzt werden.

Cornix
18.03.2013, 16:32
Hier ist ein weiterer Screenshot, zusammen mit dem Code dazu, von dem Programm in Aktion:
http://www7.pic-upload.de/18.03.13/iyy26cqzrqh.png

Code:

StringBuffer buf = new StringBuffer("********<<<<<<<");
for (int i = 0; i < 512; i++) {
buf.append("["+(i%8)+"FFFF]+");
}
return buf.toString();

Und hier ein weiteres:

http://www10.pic-upload.de/18.03.13/vasfpblvxw2l.png

Code:

StringBuffer buf = new StringBuffer("*******<<!>>");
for (int i = 0; i < 128; i++) {
buf.append("["+(i%8));
for (int j = 0; j < 50; j++) {
buf.append("-F");
}
buf.append("+");
}
return buf.toString();

niR-kun
18.03.2013, 21:06
Weird. Ich denke allerdings nicht, dass das ein generelles Problem von LWJGL ist. Schließlich laufen genug andere Programme, die auf die Bibliothek setzen, einwandfrei unter OS X (allen voran Minecraft)
Minecraft nutzt eine recht alte Version von lwjgl.

Das Problem mit dem JAWT Interface habe ich unter Linux auch (nutze Oracles JDK 1.7.0_17), allerdings nutze einen kleinen Trick, damit es trotzdem läuft - bevor ein Display über lwjgl geöffnet wird:

if(System.getProperty("java.version").contains("1.7") && System.getProperty("os.name").toLowerCase().contains("linux"))
{
String osArch = System.getProperty("os.arch");
boolean is64bit = "amd64".equals(osArch) || "x86_64".equals(osArch);

java.awt.Toolkit.getDefaultToolkit(); // loads libmawt.so (needed by jawt)

if (is64bit)
System.load(System.getProperty("java.home") + "/lib/amd64/libjawt.so");
else
System.load(System.getProperty("java.home") + "/lib/i386/libjawt.so");
}

Vielleicht kann dieser Trick auch auf OSX "verallgemeinert" werden. Ich kenne bloß den Pfad ab System.getProperty("java.home") zu der lib bei OSX nicht (hoffe, dass es die libjawt* überhaupt gibt).
Ich habe selber keine Mac, wo ich das ausprobieren könnte.

Whiz-zarD
18.03.2013, 21:21
Bei mir unter Windows 7 (64 bit) läuft was, aber ich weiß nicht, ob das so richtig ist. Der Output sieht recht schräg aus.
17184

Cornix
18.03.2013, 21:51
Das ist einer der zufällig generierten Codes.

Whiz-zarD
18.03.2013, 22:02
Ah, ok.
Ich hab mir auch mal dein Sourcecode angeschaut. Da existieren schon ein paar Parallelen. ^^
In den nächsten Tagen werde ich mal meinen Code hochladen. Ein paar Punkte gefallen mir da noch nicht so recht.
Aus irgendeinem Grund spielen die Farben auch nicht mehr so richtig mit. Ich muss hier auch grad so ein wenig auf Quellcodeverwaltung verzichten. Nun ich grad nicht mehr nachvollziehen, was welche Änderungen dies verursacht haben. :/
So sieht mein derzeitiger Stand aus:
17186

nudelsalat
18.03.2013, 22:24
Ich poste mal eine WIP Version. Mich würde sehr interessieren, ob die bei jedem läuft. (Verwendet WebGL / Three.js)
http://gebackene-ente.at/turtle/index.html

* Farben werden noch nicht unterstützt.
* Zusätzlich zu F kann auch mit G gezeichnet werden.
* neben + und - gibt es auch y,p,r und Y,P,R. (yaw, pitch und roll gegen den Uhrzeigersinn und im Uhrzeigersinn. r und R entsprechen + und -)
* Ich hab das Eingabefeld auf L-Systeme ausgerichtet. Wenn man nur eine bestimmte Zeichenkette zeichnen will, dann muss die einfach nur in das Feld "axiom" eingefügt und die iterationen auf 0 gesetzt werden.

2 Beispiele:
* Baum (http://gebackene-ente.at/turtle/index.html?length=1&angle=45&ruleKey_0=G&ruleValue_0=F[+G]-G&ruleKey_1=F&ruleValue_1=FF&axiom=G&iterations=3)
* Pflanze mit zusätzlicher pitch-rotation. d.h. sie ist ansich 3D, man siehts nur noch nicht gscheit, solang die Kamera nicht beweglich ist. (http://gebackene-ente.at/turtle/index.html?length=0.15&angle=25&ruleKey_0=E&ruleValue_0=F-p[[E]+pE]+PF[+FE]-E&ruleKey_1=F&ruleValue_1=FF&axiom=E&iterations=5&factor=0.6)

Coole Preise und Thema. :3

Cornix
18.03.2013, 22:33
Läuft bei mir. Zumindest scheint es so.

DFYX
18.03.2013, 22:43
Läuft (Chrome/Mac OS X). Manchmal bleibt der Canvas weiß, das lässt sich aber leicht lösen, indem man die Seite neu lädt.

nudelsalat
21.03.2013, 09:37
Interessant, dann werd ich mir wohl chrome auf mac und opera auf android genauer ansehen muessen.

Whiz-zarD
21.03.2013, 14:12
Unter Opera ist WebGL noch sehr buggy und per Standard deaktiviert.
Man kann es unter Opera:config -> User Prefs -> Enable WebGL aktivieren, wenn man den Wert auf 1 setzt.

Allerdings bleibt selbst dann der WebGL-Bereich leer.

Whiz-zarD
23.03.2013, 23:30
So, dann präsentiere ich mein Programm:

17245


Turtle - Linux (http://whiz-zard.bplaced.net/MMX_Contest/Turtle-Linux.jar)
Turtle - Windows (http://whiz-zard.bplaced.net/MMX_Contest/Turtle-Windows.jar)
Turtle - OS X (http://whiz-zard.bplaced.net/MMX_Contest/Turtle-OSX.jar)
Sourcecode (http://whiz-zard.bplaced.net/MMX_Contest/Whiz-zarD_Turtle_source.zip)


Es ist ein Editor, mit einer Demo-Funktion und SVG-Export geworden. Geschrieben mit Java 7.
Die Grafik auf der Oberfläche wird mittels JOGL erzeugt. Die JOGL-Binaries sind sehr groß, deswegen sind die jar-Dateien und recht groß.

Ich habe hierbei auf die Erweiterbarkeit und auf die Trennung von Model-View-Controller geachtet, was aber wohl an einigen Stellen mehr oder weniger gelungen ist.
Es ist also möglich, weitere Operationen hinzuzufügen. Jede Operation wurde in seiner eigenen Klasse implementiert. Es sind aber bis jetzt nur die Implementiert, die auch für den Contest vorgegeben sind.

Des weiteren gibt es eine zentrale Klasse, die alle relevanten Informationen besitzt und verwaltet.
Diese zentrale Klasse gibt den Renderern die benötigten Informationen und gibt denen bescheid, wann sie Rendern sollen.
Es ist also möglich unterschiedlichste Renderer zu implementieren. In meinem Programm habe ich zwei Entwickelt: Ein OpenGL-Renderer (GUI) und einen SVG-Renderer (SVG Export).
Außerdem können zusätzlich Listener registriert werden, die auf die Änderungen der Status-Werte reagieren. In meinem Fall sind es z.B. die Text-Ausgaben der Werte auf der GUI.
Statusänderungen, die zu einen Fehler führen, wie z.B. das Setzen eines Wertes auf 0, führen zu einer entsprechenden Exception, sodass der Entwickler jeweils auf die unterschiedlichen Exceptions reagieren kann.
Ebenfalls führt das poppen (yeah!) zu einer Exception, wenn der Stack leer ist.

Es gibt eine Demo-Klasse, die ein Fraktal erstellt. Das Fraktal wird über den Button "Demo ausführen" generiert.
Über die SVG-Export-Funktion wird das gezeichnete Bild in ein SVG-Bild gespeichert.
Das Fenster ist auf 800x600 eingestellt, aber es lässt sich beliebig skalieren.

So, viel spaß mit dem Editor. :)
Ich hoffe es läuft alles so weit. Mac OS X kann ich leider nicht testen, da ich kein OS X zur Hand habe.
Wäre schön, wenn noch jemand bescheid sagen könnte, ob es läuft, oder nicht.

Manuel
25.03.2013, 10:33
Wäre schön, wenn noch jemand bescheid sagen könnte, ob es läuft, oder nicht.Die Linuxversion läuft bei mir unter Archlinux 64bit einwandfrei.

Sehr interessanter Wettbewerb... Ich hatte mit Fraktalen bis dato noch nichts zu tun, aber nach ein wenig Einlesen interessiert mich das Thema schon etwas...

DFYX
25.03.2013, 10:55
Dann mach mit, du hast noch fast eine ganze Woche Zeit.

nudelsalat
26.03.2013, 10:20
Na dann, hier meine Endabgabe:

Zur online Version:
Pflanze (http://gebackene-ente.at/turtle/index.html?length=0.15&angle=20&ruleKey_0=E&ruleValue_0=F-p[[E]+pE]+F[+FE]-yE&ruleKey_1=F&ruleValue_1=FF&axiom=E&iterations=5&factor=0.6)
Koch Island (gebackene-ente.at/turtle/index.html?axiom=F++F++F&ruleKey_0=F&ruleValue_0=F-F++F-F&iterations=5&angle=60)
Dragon Curve (http://gebackene-ente.at/turtle/index.html?angle=90&iterations=11&axiom=FZ&ruleKey_0=Z&ruleValue_0=Z+YF&ruleKey_1=Y&ruleValue_1=FZ-Y)
Kreis (http://gebackene-ente.at/turtle/index.html?factor=0.5&angle=90&iterations=4&axiom=AF+F+F+F&ruleKey_0=F&ruleValue_0=F+F&ruleKey_1=A&ruleValue_1=A>)
Windung (http://gebackene-ente.at/turtle/index.html?factor=0.6&angle=90&iterations=9&axiom=AF+F+F+F&ruleKey_0=F&ruleValue_0=yyF+F&ruleKey_1=A&ruleValue_1=A>)

Sourcecode (gebackene-ente.at/turtle/turtle.zip)

Screenshot:

Der obige Link zur online Version führt zum selben L-System. (einzige ausnahme: es steht gerade)
http://gebackene-ente.at/turtle/turtle.png


Mittels mousedrag kann das L-System jetzt auch gedreht werden.
Alle generierten L-Systeme werden auf dieselbe größe skaliert.
Umgesetzt mit Javascript / Three.js / WebGL
Der hauptsächlich relevante Code befindet sich in page.js und in src/turtle.js.



Wäre schön, wenn noch jemand bescheid sagen könnte, ob es läuft, oder nicht.
Bei mir unter Windows7 läufts!

Whiz-zarD
26.03.2013, 10:31
Die Linuxversion läuft bei mir unter Archlinux 64bit einwandfrei.


Bei mir unter Windows7 läufts!

Sehr schön. Danke :)

Ineluki
29.03.2013, 14:38
Wie uns gerade zugetragen wurde, haben einige von euch vergessen, ihren Sourcecode mit in den Osterurlaub zu nehmen, damit sie ihn rechtzeitig bis Sonntag abgeben koennen.
Aus diesem Grunde haben Jeez, DFYX und ich uns beratschlagt, und entschieden, den Contest um eine Woche bis Sonntag, den 7. April zu verlaengern.

Ihr habt also noch eine kleine Galgenfrist, eueren Code etwas aufzuhybschen oder noch ein paar tolle Bilderchen zu generieren.

Viel Spass dabei und Frohe Ostern.

Jesus_666
31.03.2013, 01:50
So, hier kommt mein Beitrag. Ich habe nichts Aufregendes – nur eine kleine Webapp, die SVGs zeichnen kann. Ist nicht mal besonders hübsch geworden.

Ich habe ein paar Syntaxerweiterungen drin (siehe README (https://dronf.net/~jesus_666/Turtle/README)) und kann gefüllte Flächen sowie Bézierkurven zeichnen. Im Wesentlichen benutzt meine App eine Billigversion von SVG als interne Repräsentation der Zeichnung, von daher sind die Features relativ dicht daran gehalten, was einfaches SVG so kann.

Oh, und ich bin mit Lukis Syntax mehr oder weniger kompatibel. Offenbar sind unsere Koordinatensysteme gegeneinander gespiegelt und gedreht, aber ansonsten sind alle Luki-Skripte bei mir lauffähig (aber nicht umgekehrt).

Als Bild habe ich einfach mal das Logo vom klassischen Mac OS nachgezeichnet, weil mir nichts besseres eingefallen ist.

Getestet in Firefox 19 und Chromium 25. Sollte prinzipiell in jedem ES5-fähigen Browser laufen, wenn ich nicht irgendwo noch einen Bug reingehauen habe, der nur zufällig in Gecko und V8 funtkioniert.

Die Webapp (https://dronf.net/~jesus_666/Turtle/)
Der Code (7-zip; 8,8 KiB) (https://dronf.net/~jesus_666/Turtle/Turtle_Jeez.7z)
Der Code (tar/bzip2; 9,5 KiB) (https://dronf.net/~jesus_666/Turtle/Turtle_Jeez.tar.bz2)
Das Beispielbild (SVG; 1,3 KiB) (https://dronf.net/~jesus_666/Turtle/Mac%20OS.svg)

Ineluki
02.04.2013, 21:45
So ... wir wurden gerade nochmal gefragt, ob man den Contest eventuell bis zum 14.04. laufen lassen koenne, da jemandem, der teilnehmen wollte, eine Deadline dazwischen gekommen ist.
Da massive Contestverlaengerungen bei uns im Progforum ja Tradition haben, und es fuer niemanden einen Nachteil darstellt, etwas mehr Zeit zu haben, um seinen Code oder seine Praesentation zu verschoenern, haben wir uns dafuer entschieden, diesem Wunsch nachzukommen.

Neuer Stichtag ist jetzt Sonntag, der 14. April 2013. Und das ist jetzt auch wirklich die letzte Deadline, sofern wir es uns nicht wieder anders ueberlegen.

Ineluki
05.04.2013, 22:57
So ... nun ist es wohl an mir, meinen Beitrag abzugeben ...
Ich koennte nun hier einen riesigen Post verfassen, aber stattdessen habe ich den ganzen Kram uebersichtlich und strukturiert auf einer Webseite praesentiert.
http://ineluki.rpg-atelier.net/Prog/Progforum/Progforum_Contest_2013_Ineluki/Readme.html

Dort findet ihr sowohl eine Beschreibung, was ich gemacht habe, als auch die Quelltexte, den Turtle-Code, und die fertigen Graphiken. Das Lesen der Readme ist dringend empfolen !

Das gesamte Projekt kann in Einzeldateien oder als tar.bz2 heruntergeladen (http://ineluki.rpg-atelier.net/Prog/Progforum/Progforum_Contest_2013_Ineluki.tar.bz2) werden.
Da die so erstellten Graphiken recht gross sind (ca. 4 MB unkomprimiert, ca. 450 KB gzip komprimiert) verlinke ich sie hier nur.

Der von mir generierte Turtle-Code (http://ineluki.rpg-atelier.net/Prog/Progforum/Progforum_Contest_2013_Ineluki/Mona_Lisa.turtle) <- $ setzt factor auf 2, #RRGGBB setzt die Farbe auf RRGGBB
SVGZ mit Painting-Renderer und Option Speedup=10 (http://ineluki.rpg-atelier.net/Prog/Progforum/Progforum_Contest_2013_Ineluki/Mona_Lisa_painting.svgz?speedup=10) <- Sorry, keine Internet Explorer Unterstuetzung
SVGZ mit Blending-Renderer (http://ineluki.rpg-atelier.net/Prog/Progforum/Progforum_Contest_2013_Ineluki/Mona_Lisa_blending.svgz) <- Sorry, ich kann nix dafuer, dass der Internet Explorer Scheisse ist
SVGZ ohne Schnickschnack im Internet Explorer Kompatibilitätsmodus (http://ineluki.rpg-atelier.net/Prog/Progforum/Progforum_Contest_2013_Ineluki/Mona_Lisa_IE.svgz)

Alle Codes sind unter Firefox und Chrome getestet. Internet Explorer 9 funktioniert nur mit dem IE-Renderer. Opera ist ungetestet, waere also schoen, wenn mir jemand bescheid geben koennte, ob dort alles funktioniert.

Als Programmiersprache habe ich GNU Awk verwendet. Warum ? Weil ich kann und sie dafuer eigentlich gar nicht gedacht ist.
OK, in Wahrheit mag ich diese tolle Scriptsprache und wollte mit meiner Einsendung demonstrieren, dass man durchaus anspruchsvolle Dinge mit Awk anstellen und auch große Datenmengen schnell verarbeiten kann. Zwar liegt der Schwerpunkt von Awk auf Regulaeren Ausdruecken und Textverarbeitung, aber mit ein paar kleinen Tricks kann man, wie hier gezeigt, durchaus auch byteweise arbeiten. Diejenigen von euch, die die BSD-Variante von awk benutzen, haben allerdings Pech gehabt, denn selbige unterstuetzt (noch) nicht die fuer meine Farbreduktion notwendigen binaeren Operatoren AND, RSHIFT und LSHIFT. Schade.

Was mich an Awk allerdings besonders stoehrt, ist, dass in der Sprache keine lokalen Variablen vorgesehen sind. ALLE Variablen sind global. Das fuehrt natuerlich unweigerlich zu Namenskollisionen. Der einzige Trick, mit dem man dies umgehen kann, ist, lokale Variablen mit uninitialisierten und unbenutzten optionalen Funktionsparametern zu emulieren, was ich an einigen Stellen auch getan und im Quelltext kommentiert habe. Die Syntax ist ziehmlich gewoehnungsbeduerftig, aber besser als gar nichts lokales. Leider ist Awk auch nicht objektorientiert, doch fuer so ein kleines Projekt, wie dieses hier, kann man ja mal darueber hinweg sehen. Wenigstens gibt es Funktionen, von denen ich auch regen Gebrauch mache.

So, jetzt ist aber genug geschwafelt. Viel Spass beim Begutachten meiner Einsendung. Ueber kosntuktives Feedback freue ich mich natuerlich besonders.

Leana
07.04.2013, 00:17
Opera ist ungetestet, waere also schoen, wenn mir jemand bescheid geben koennte, ob dort alles funktioniert.

Ein BIld sagt mehr als tausend Worte ;)
http://share.cherrytree.at/showfile-9541/mona_lisa_opera.png
Es funktioniert allerdings nicht so ganz wie es soll, denn der Turtle wackelt immer nur an dieser Stelle hin und her:
http://share.cherrytree.at/showfile-9540/mona_lisa_anfang.png
Im Firefox läufts nicht nur schneller, der Turtle bewegt sich auch mit:
http://share.cherrytree.at/showfile-9543/mona_lisa_firefox.png
Der Turtle-Code ist schon heftig. Gibt es eigentlich einen einfachen Trick, wie man so ein Bild in Turtle-Code umsetzt? Kann mir nämlich nicht vorstellen, dass du für die Wege des Turtles die Pixel abgezählt hast :D

Ineluki
07.04.2013, 11:51
Die ppm2turtle.awk ist dazu da, den Turtle-Code des Bildes zu generieren. Wenn du in die Datei reinsiehst, findest du ausfuehrlich kommentiert, wie das Programm arbeitet. Effektiv gehe ich das ganze Bild Pixel fuer Pixel durch, ueberpruefe, ob der Pixel der aktuell zu bearbeitenden Farbe entspricht, und wenn ja, dann bewege ich die Turtle zu der entsprechdenen Position ohne Zeichnen, und mache einen kleinen Strich an Stelle des jeweiligen Pixels. Und damit der Turtle-Code nicht zu groß wird, zerlege ich die zeichenlose Bewegung der Turtle in Potenzen von 2 und und benutze die "Multipliziere $Length mit $Factor" und "Dividiere $Length mit $Factor" Befehle der Turtle um mich schneller in zuerst Y und dann X zu bewegen. Also ja, effektiv ist es im Moment Pixelzaehlen, aber automatisiert.

Es waere natuerlich schoener, wenn die Turtle zusammenhaengende Bereiche zuerst geschlossen ausmalt, aber dafuer muesste man entweder das Traveling-Salesman-Problem auf einer wirklich grossen Datenbasis loesen oder mit Contourplots arbeiten, die in diesem Beispiel ganz schoen zerklueftet und loechrig sein koennen. Das war mir dann doch viel zu viel Aufwand fuer diesen Contest.

Ineluki
14.04.2013, 22:12
Leider haben sich bisher die drei anderen, die noch was abgeben wollten, nicht gemeldet ... schade eigentlich. Aber na ja, fast eine Stunde haben sie ja noch.

Damit sich das Warten aber auf jeden Fall gelohnt hat, habe ich unter der Woche schnell noch etwas gebastelt, was ich als zweite unabhaengige Abgabe einreiche.
Da meine letzte Einsendung eher ein vektorisiertes Bitmap ist und nur spaerlich von den klassischen Turtlebefehlen gebrauch macht (ich drehe z.B. nur um 90 Grad), dachte ich mir, ich mache auch noch eine richtig turtlelastige reine Vektorgraphik. Und da mein letzter Code so viele Extentions von mir verwendet hat, hab ich diesen hier ausschliesslich mit den klassischen Befehlen gemacht.
Zum rendern meines Turtlecodes verwende ich wieder meine schon eingereichten Renderer aus der ersten Abgabe. Zum generieren des Turtlecodes hab ich wieder ein awk-Script geschrieben. So, hier jetzt also meine Abgabe, getestet mit Firefox, Chrome und IE.

Quellcode (http://ineluki.rpg-atelier.net/Prog/Progforum/highlight/highlight.php?file=../Progforum_Contest_2013_Ineluki/mandelbrot/mandelbrot.awk)
Turtlecode (http://ineluki.rpg-atelier.net/Prog/Progforum/highlight/highlight.php?file=../Progforum_Contest_2013_Ineluki/mandelbrot/mandelbrot.turtle)
Fertige Bilddatei (http://ineluki.rpg-atelier.net/Prog/Progforum/Progforum_Contest_2013_Ineluki/mandelbrot/mandelbrot.svgz)
Fertige Bilddatei kompatibel zum Internet Explorer (http://ineluki.rpg-atelier.net/Prog/Progforum/Progforum_Contest_2013_Ineluki/mandelbrot/mandelbrot_IE.svgz)

Allerdings hab ich mir nicht mehr die Muehe gemacht, die Dateien in meine HTML Dokumentation der letzten Abgabe einzupflegen. Daher liegen sie auch alle in einem extra Unterverzeichnis.

So ... damit wars das beim Contest definitiv fuer mich. Moege die beste Einsendung gewinnen. Der Umfragethread kommt dann morgen.

csg
14.04.2013, 22:14
Hier noch meine minimalistische Abgabe ( d.h, die notwendigen Anforderungen werden erfüllt ).

Im Download ist der Quellcode, sowie ( hoffendlich ) Lauffähige Binaries für windows. Wer das ganze selbst compilieren will, braucht dafür noch Irrlicht 1.8 ( http://irrlicht.sourceforge.net/ ).

download turtleG_csg_source_win32b.zip (http://share.cherrytree.at/showfile-9608/turtleg_csg_source_win32b.zip)

und noch ein finaler Screenshot mit einer erstellten Graphik:
http://share.cherrytree.at/showfile-9609/tgf.png

Als kleine Besonderheit können im Programm Variablen ( sub-turtle-graphics ) definiert und benutzt werden. Rekursionstiefe ist 10, kann aber in der defs.h beim selbstkompilieren angepasst werden.

kate@net
14.04.2013, 23:00
dfyx sitz leider noch an was anderem, das heute fertig werden soll :(
Ich dachte eigentlich, dass er mit seinem beitrag schon fertig wäre