entropia brainstorming
authorJoachim Breitner <mail@joachim-breitner.de>
Sun, 8 Feb 2009 22:23:14 +0000 (23:23 +0100)
committerJoachim Breitner <mail@joachim-breitner.de>
Sun, 8 Feb 2009 22:23:14 +0000 (23:23 +0100)
DSL-Ideen.txt [new file with mode: 0644]
src/Lseed/Data/Functions.hs [new file with mode: 0644]

diff --git a/DSL-Ideen.txt b/DSL-Ideen.txt
new file mode 100644 (file)
index 0000000..67b667b
--- /dev/null
@@ -0,0 +1,71 @@
+
+Knopse "" -> Zweig Stamm
+Stamm "" -> Stamm "", Abzweitung "1. Gabelung" (Zweig "Ast")
+
+
+Stamm :: Zweig
+Ast :: Zweig
+
+Knopse -> Stamm
+Stamm -> Stamm T Ast
+
+
+Informationen:
+ * Teilbaum
+ * Lichtmenge
+ * Totale Lichtmenge
+ * Länge
+ * Totale Länge
+ * Richtung
+ * User-Tag
+
+Ausgabe:
+ * Gewichtug
+ * Priorität
+ * Eine Änderung
+   - Zweig verlängern
+   - Abzweigung einfügen (Z l -> Z l1 / Abzw / Z l2, l = l1 + l2)
+ * Jeweils mit User-Tag
+
+Semantik:
+ Alle anwendbaren Regeln von höchster Priorität werden genommen, pro Stelle per Gewichtung ausgelost.
+ Alle Regeln brauchen gleich lang (x), haben Kosten (C(Rule)), Gesamtanwendungsdauer: (Lichtmenge - y*Pflanzengröße)/Sum(C(Rule)) * x
+
+
+Syntax:
+
+Regel "Bei Licht Verlängern", Priorität 1, Gewicht 4:
+Ast (Licht > 10, 6 < Länge < 8) => Länge := 12, Tag "Blubb"
+
+Regel "Bei Licht Verlängern", Priorität 1, Gewicht 4:
+ Zweigung
+  Ast
+   Knospe
+  Ast 
+   Zweigung
+    Ast (Licht > 10, 6 < Länge < 8) => Länge := 12, Tag "Blubb"
+     x
+    Knospe
+
+Regel "Langes Verzweigen", Priorität 2, Gewicht 4:
+ Zweigung (-90° < Winkel < 90°)
+  Ast
+   Knospe
+  Ast 
+   Zweigung (Tag == "Hier weitermachen")
+    Ast (Licht > 10, Länge == 12) => Verzweigen 50% 30° "Vorher" "Verzweigung" "Nacher"
+     x
+    Knospe
+
+In Klammern: 
+ * Arithmetrik
+ * Vergleiche
+ * Boolsche Ausdrücke
+ * Variablen (Licht, Gesamtlicht, Länge, Gesamtlänge, Richtung (Radians 0..\pi), Winkel, Usertag)
+
+Rechts:
+ * UserTag 
+ * Länge := Zahl
+   Länge += Zahl
+   Länge += Zahl%
+ * Verzweige Zahl% Winkel° [Tag1 Tag2 Tag3]
diff --git a/src/Lseed/Data/Functions.hs b/src/Lseed/Data/Functions.hs
new file mode 100644 (file)
index 0000000..d9f1b2c
--- /dev/null
@@ -0,0 +1,36 @@
+module Lseed.Data.Functions where
+
+import Lseed.Data
+import Data.Monoid
+
+-- | Puts the length of the current segment in the additional information field
+--   Pieces without length ('Bud', 'Fork') receive a zero.
+plantPieceLengths :: Plant () -> Plant Double
+plantPieceLengths (Bud ()) =
+       Bud 0
+plantPieceLengths (Stipe () len p1) =
+       Stipe len len (plantPieceLengths p1)
+plantPieceLengths (Fork () angle p1 p2) =
+       Fork 0 angle (plantPieceLengths p1) (plantPieceLengths p2)
+
+plantSubpieceLength :: Plant () -> Plant Double
+plantSubpieceLength = fmap getSum . subPieceAccumulate . fmap Sum . plantPieceLengths
+
+extractOutmost :: Plant a -> a
+extractOutmost (Bud x) = x
+extractOutmost (Stipe x _ _) = x
+extractOutmost (Fork x _ _ _) = x
+
+subPieceAccumulate :: Monoid m => Plant m -> Plant m
+subPieceAccumulate p = go p
+  where go (Bud x) = (Bud x)
+        go (Stipe x len p1) = let p1' = go p1
+                                  x' = x `mappend` extractOutmost p1'
+                              in  Stipe x' len p1'
+        go (Fork x angle p1 p2) = let p1' = go p1
+                                      p2' = go p2
+                                      x' = x `mappend`
+                                           extractOutmost p1' `mappend`
+                                          extractOutmost p2'
+                                  in  Fork x' angle p1' p2'
+