diff --git a/cw3/zadanie 2/PipeLSystem.txt b/cw3/zadanie 2/PipeLSystem.txt new file mode 100644 index 00000000..460b47e1 --- /dev/null +++ b/cw3/zadanie 2/PipeLSystem.txt @@ -0,0 +1,25 @@ +#ignore + - \ / ^ & +#axiom +C(1,3)F(0,1)G +#rules +C(a,b) > F(x,w) : b<3 -> C(a,b+1) +C(a,b) > F(x,w) : b>=3 -> #stochastic +p=2 C(1,0) +p=1 C(2,0) +p=0.5 C(3,0) +#stochastic end +C(a,b) < F(x,w) : b>=3 -> F(a,w) +F(x,w) < F(y,w1) : x>0 -> F(x,w1) +F(x,w) : x>0 -> F(0,w) +F(x,w) < G : x==1 -> F(0,1)[+B]\(137.5)G +F(x,w) < B : x==2 -> #stochastic +p=3 B +p=1 G +#stochastic end +F(x,w) < G : x==3 -> F(x,1)W + +F(x,w) > [F(x1,w1)]F(x2,w2) -> F(x,(w1^2+w2^2)^(0.5)) +F(x,w) > F(x1, w1) -> F(x,w1) +F(x,w) > [B]F(x1,x1) -> F(x,w1) +F(x,w) > [F(x1,x1)]B -> F(x,w1) +#end rules \ No newline at end of file diff --git a/cw3/zadanie 2/TurtleContextTask.cs b/cw3/zadanie 2/TurtleContextTask.cs new file mode 100644 index 00000000..bb85abd5 --- /dev/null +++ b/cw3/zadanie 2/TurtleContextTask.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class TurtleContextTask : TurtleLSystem { + public GameObject obj; + public GameObject flower; + public GameObject leaf; + public float angle; + + private Func _roation(Vector3 axis) { + Matrix4x4 f(float[] args) { + if (args.Length == 0) { + return Matrix4x4.Rotate(Quaternion.AngleAxis(angle, axis)); + } + else { + return Matrix4x4.Rotate(Quaternion.AngleAxis(args[0], axis)); + } + } + return f; + } + + GameObject setColor(GameObject prefab, int index) { + var result = Instantiate(prefab); + switch (index) { + case 1: + result.GetComponent().material.SetColor("_Color", Color.red); + break; + case 2: + result.GetComponent().material.SetColor("_Color", Color.blue); + break; + case 3: + result.GetComponent().material.SetColor("_Color", Color.white); + break; + } + return result; + } + + protected override void initLiteralInterpretation() { + turtleInterpretation = new Dictionary>>(); + //turtleInterpretation + var transformation = Matrix4x4.Translate(new Vector3(0.0f, 0.1f, 0)) * Matrix4x4.Scale(new Vector3(0.05f, 0.1f, 0.05f)); + turtleInterpretation.Add("+", (float[] args) => new Tuple(null, _roation(Vector3.back)(args))); + turtleInterpretation.Add("-", (float[] args) => new Tuple(null, _roation(Vector3.forward)(args))); + + turtleInterpretation.Add("\\", (float[] args) => new Tuple(null, _roation(Vector3.down)(args))); + turtleInterpretation.Add("/", (float[] args) => new Tuple(null, _roation(Vector3.up)(args))); + + turtleInterpretation.Add("^", (float[] args) => new Tuple(null, _roation(Vector3.left)(args))); + turtleInterpretation.Add("&", (float[] args) => new Tuple(null, _roation(Vector3.right)(args))); + + + turtleInterpretation.Add("f", (float[] args) => new Tuple(null, Matrix4x4.Translate(Vector3.up * args[0]))); + + turtleInterpretation.Add("W", (float[] args) => new Tuple(flower, Matrix4x4.Scale(Vector3.one*0.1f))); + + turtleInterpretation.Add("B", (float[] args) => new Tuple(leaf, Matrix4x4.Scale(Vector3.one))); + + turtleInterpretation.Add("F", (float[] args) => new Tuple(setColor(obj, Mathf.FloorToInt(args[0])), transformation * Matrix4x4.Scale(new Vector3(args[1], 1.0f, args[1])))); + + //Wildcard how to represent any other symbol + turtleInterpretation.Add("*.*", (float[] args) => new Tuple(obj, transformation)); + } +}