diff --git a/cw1 p2/7_Centaurea_cyanus.jpg b/cw1 p2/7_Centaurea_cyanus.jpg new file mode 100644 index 0000000..c46851a Binary files /dev/null and b/cw1 p2/7_Centaurea_cyanus.jpg differ diff --git a/cw1 p2/Anabaenaflosaquae_EPA.jpg b/cw1 p2/Anabaenaflosaquae_EPA.jpg new file mode 100644 index 0000000..395e38b Binary files /dev/null and b/cw1 p2/Anabaenaflosaquae_EPA.jpg differ diff --git a/cw1 p2/Screenshot 2021-03-13 at 14.29.10.png b/cw1 p2/Screenshot 2021-03-13 at 14.29.10.png new file mode 100644 index 0000000..28535d1 Binary files /dev/null and b/cw1 p2/Screenshot 2021-03-13 at 14.29.10.png differ diff --git a/cw1 p2/Screenshot 2021-03-14 at 07.32.36.png b/cw1 p2/Screenshot 2021-03-14 at 07.32.36.png new file mode 100644 index 0000000..25db776 Binary files /dev/null and b/cw1 p2/Screenshot 2021-03-14 at 07.32.36.png differ diff --git a/cw1 p2/Screenshot 2021-03-14 at 07.32.56.png b/cw1 p2/Screenshot 2021-03-14 at 07.32.56.png new file mode 100644 index 0000000..1d71131 Binary files /dev/null and b/cw1 p2/Screenshot 2021-03-14 at 07.32.56.png differ diff --git a/cw1 p2/Screenshot 2021-03-14 at 07.33.17.png b/cw1 p2/Screenshot 2021-03-14 at 07.33.17.png new file mode 100644 index 0000000..12ff339 Binary files /dev/null and b/cw1 p2/Screenshot 2021-03-14 at 07.33.17.png differ diff --git a/cw1 p2/Turtle-animation-20210312091611500.gif b/cw1 p2/Turtle-animation-20210312091611500.gif new file mode 100644 index 0000000..2d01b87 Binary files /dev/null and b/cw1 p2/Turtle-animation-20210312091611500.gif differ diff --git a/cw1 p2/Turtle-animation-20210312091653497.gif b/cw1 p2/Turtle-animation-20210312091653497.gif new file mode 100644 index 0000000..2d01b87 Binary files /dev/null and b/cw1 p2/Turtle-animation-20210312091653497.gif differ diff --git a/cw1 p2/Turtle-animation-20210313140337212.gif b/cw1 p2/Turtle-animation-20210313140337212.gif new file mode 100644 index 0000000..2d01b87 Binary files /dev/null and b/cw1 p2/Turtle-animation-20210313140337212.gif differ diff --git a/cw1 p2/Turtle-animation-20210313143359379.gif b/cw1 p2/Turtle-animation-20210313143359379.gif new file mode 100644 index 0000000..2d01b87 Binary files /dev/null and b/cw1 p2/Turtle-animation-20210313143359379.gif differ diff --git a/cw1 p2/Turtle-animation.gif b/cw1 p2/Turtle-animation.gif new file mode 100644 index 0000000..2d01b87 Binary files /dev/null and b/cw1 p2/Turtle-animation.gif differ diff --git a/cw1 p2/Unityscreen.png b/cw1 p2/Unityscreen.png new file mode 100644 index 0000000..4667355 Binary files /dev/null and b/cw1 p2/Unityscreen.png differ diff --git a/cw1 p2/Von_Koch_curve.gif b/cw1 p2/Von_Koch_curve.gif new file mode 100644 index 0000000..817590c Binary files /dev/null and b/cw1 p2/Von_Koch_curve.gif differ diff --git a/cw1 p2/bracketed zad 1.JPG b/cw1 p2/bracketed zad 1.JPG new file mode 100644 index 0000000..e58bc65 Binary files /dev/null and b/cw1 p2/bracketed zad 1.JPG differ diff --git a/cw1 p2/clock.png b/cw1 p2/clock.png new file mode 100644 index 0000000..a992411 Binary files /dev/null and b/cw1 p2/clock.png differ diff --git a/cw1 p2/cw1.html b/cw1 p2/cw1.html new file mode 100644 index 0000000..6f1137c --- /dev/null +++ b/cw1 p2/cw1.html @@ -0,0 +1,208 @@ + + + + + + + cw1 + + + + + + +

L-System

+

W tej części zajęć skupimy się na tworzeniu L-Systemów i wykorzystaniu ich do reprezentacji zjawisk przyrodniczych.

+
+

Przypomnienie L-System to system przepisywania i gramatyka formalna. Składa się z: symboli, które tworzą ciągi znaków; reguł produkcyjnych, które opisują na co należy przepisać dany znak; aksjomatu, czyli początkowego ciągu znaków; i mechanizmu, który tłumaczy ciąg znaków na reprezentacje geometryczną

+
+

Bazą dla tych zajęć jest książka Algorithmic Beauty of Plants dostępna za darmo pod linkiem lub w wyższej jakości

+

Składnia L-Systemów

+

Projekt zawiera bibliotekę, która interpretuje L-Systemy. Ich definicję pobiera z oddzielnego pliku. Ich składnie opisuję definicja L-Systemu opisującego rozwój bakterii Anabaena znajduje się w projekcie pod ścieżką Assets\LSystem\Anabaena.txt i wygląda następująco:

+
#axiom
+L
+#rules
+L->lR
+R->Lr
+l->L
+r->R
+#end rules
+

Plik należy zacząć od linii #axiom, następnie w następnej linii zamieścić ciąg początkowy. Później pomiędzy liniami #rules i #end rules umieścić instrukcje przepisywania według zasady: <znak przepisywany>-><wynik przepisania> każdy znak przed strzałką i po strzałce (z wyjątkiem reguł o których później) jest traktowany jako następny symbol. W przypadku kilku reguł, które dotyczą tego samego symbolu wykona się ta, która jest wyżej w pliku. Między reguły można dodawać komentarze, znakiem komentującym jest #. Jeżeli znak nie posiada żadnej reguły, która by go opisywała, to nie jest on zmieniany.

+

Odpal scenę LSystemFromFile, zaznacz LSystemController w panelu po prawej. Po lewej w polu L System Path wpisz Assets\LSystem\Anabaena.txt kliknij Load File, by załadować LSystem. Następnie Evaluate, by wykonać przepisanie. W scenie wyświetlą się obiekty reprezentujące symbole a w konsoli wyświetli się wynik przepisania.

+

Składnia wszystkich rozszerzeń jest zaprezentowana w pliku SampleLSystem.txt w tej chwili niektóre reguły mogą byc niezrozumiałe, ale może się on przydać później jako wzorzec.

+

Turtle Graphics

+

Turtle Graphics jest metodą tworzenia grafiki komputerowej, wykorzystuje kursor (tytułowego żółwia) wykonujący instrukcje w przestrzeni lokalnej.

+
+https://en.wikipedia.org/wiki/Turtle_graphics +
+

L-Systemy można interpretować za pomocą Turtle Graphics, poprzez przypisanie każdemu symbolowi instrukcji jaką ma wykonać żółw. Następnie żółw będzie wykonywał kolejne instrukcje czytając napis od lewej do prawej.

+

Na początek zaczniemy od prostej reprezentacji, gdzie + będzie oznaczał w kierunku zgodnym z ruchem wskazówek zegara o wskazany kąt, natomiast - w przeciwnym. Kąt zwyczajowo oznacza się grecką literą \(\delta\). Każdy inny symbol będzie oznaczał idź prosto o 1.

+

Odpal Scenę LSystem2D, załaduj plik Sierpinski.txt, ustaw kąt na 60 stopni i wykonaj kilka kroków.

+

Zadanie

+

napisz Lsystem, który będzie rysował gwiazdkę kocha

+
    +
  1. Krzywa kocha:

  2. +
+

+

+

Opis:

+
    +
  1. Podziel linię na 3 równę części
  2. +
  3. Przy środkowej części narysuj równoboczny trójkąt zwrócony na zewnątrz
  4. +
  5. Usuń środkową część pierwotnej lini
  6. +
+

Musimy z jednej lini zrobić 4 nowe, z czego pierwsza i ostatnia idą w tym samym kierunku, a dwie środkowe idą pod innym kątem (podpowiedź: dając dwa razy + lub - możesz zwiększyć kąt)

+
    +
  1. W pierwszym kroku L-Systemu utwórz trójkąt

    +
  2. +
+

Bracketed L-systems

+

W podstawowej wersji L-Systemy są pojedyńczym ciągiem znaków, by uzyskać możliwość tworzenia rozgałęzień wprowadzamy dwa specjalne znaki [ oraz ] pierwszy mówi, żeby zapamiętać obecny stan, drugi oznacza by wrócić do stanu zapamiętanym przy ostatnim znaku [. Przykładowo ciąg symboli F[+FFF][-F]FF dla \(\delta=90\) będzie reprezentowany następująco obraz

+

Zadanie

+

Wyświetl poniższe L-Systemy. Zmodyfikuj definicję drugiego, by dodstać asymetryczną roślinę.

+

Screenshot 2021-03-13 at 14.29.06 Screenshot 2021-03-13 at 14.29.10

+

Pisanie własnej interpretacji LSystemów

+

Wróćmy do sceny LSystemFromFile W tej scenie zamiast kresek pojawiają się figury reprezentujące komórki (czerwona lewa, zielona prawa, niska młoda, wysoka dorosła). Otwórz skrypt AnabeanaTurtle.cs, który odpowiada za rysowanie. Zawiera on klasę AnabeanaTurtle dziedziczącą po TurtleLSystem. TurtleLSystem jest klasą abstrakcyjną, wymaga zdefiniowania funkcji initLiteralInterpretation, w której należy opisać jak interpretować symbole.

+
    protected override void initLiteralInterpretation() {
+        turtleInterpretation = new Dictionary<string, Func<float[], Tuple<GameObject, Matrix4x4>>>();
+        //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<GameObject, Matrix4x4>(null, Matrix4x4.Rotate(Quaternion.Euler(0, 0, -angle))));
+        turtleInterpretation.Add("-", (float[] args) => new Tuple<GameObject, Matrix4x4>(null, Matrix4x4.Rotate(Quaternion.Euler(0, 0, angle))));
+
+        //Wildcard how to represent any other symbol
+        turtleInterpretation.Add("*.*", (float[] args) => new Tuple<GameObject, Matrix4x4>(obj, transformation));
+    }
+

Żeby tego dokonać należy uzupełnić słownik turtleInterpretation, którego kluczami są opisywane symbole jako stringi. Natomiast wartościami są funkcje, które przyjmują jako argument tablicę parametrów danego symbolu (o tym później) a zwracają Krotkę, której pierwszym elementem jest rysowany obiekt, natomiast drugim transformacja, jaką wykona żółw. Powyższym przykładzie obiekty są czytane z modeli a transformacja zawsze jest taka sama, czyli translacja o wektor (0.1,0,0) i skalowanie o wektor (0.1,0.1,0.1). (Skalowania nie są pamiętane przez żółwia)

+

Te funkcje są wykorzystywane przez żółwia do interpretacji ciągu symboli. Przykładowo LRr zostanie zinterpretowany następująco:

+ +

Zadanie

+

Jak wyszukasz w internecie obrazki Anabaeny, zobaczysz, że są one często powykręcane, dodaj do macierz przekształceń obroty w osi Y o losowy kąt pomiędzy -20 a 20 stopni.

+

Parametryczne L-Systemy

+

Parametryczne L-Systemy operują na symbolach parametrycznych znakach, czyli takich, które posiadają 0 lub więcej parametrów rzeczywistych. Pozwala to przechowywać różne wewnętrzne stany obiektów. Przykładowo dla modelu Anabeany powyżej rozróżniamy tylko 2 stany, młody i dorosły. Dzięki parametrycznym L-Systemom możemy opisać wiek w sposób bardziej ciągły. Przykładowo poniższy L-System komórki która rośnie i jak osiągnie odpowiedni wiek rozdziela się na dwie młode komórki

+
#axiom 
+B(1)
+#rules
+B(a) : a<2 -> B(a+0.1)
+B(a) : a>=2 -> B(1)B(1)
+#end rules
+

Parametry zapisuje się wewnątrz nawiasów po przecinku. W aksjomacie muszą one mieć wartości liczbowe. Po lewej stronie trzeba nadać parametrom nazwy (mogą mieć one więcej niż jeden znak). Symbole są identyfikowane po nazwie i liczbie znaków. Po dwukropku można podać warunki logiczne jakie musi spełnić symbol. można w tym umieszczać operacje matematyczne, dozwolone jest mnożenie, dzielenie, dodawanie i odejmowanie. podobnie w parametrach po prawej stronie

+

Zadanie

+

Napisz dla parametrycznej wersji Anabeny taką interpretację, żeby komórki rosły wraz z wiekiem.

+

Stochastyczne L-Systemy

+

Niektóre procesy biologiczne są zbyt skomplikowane albo niedostatecznie zbadane, żeby można je było je zasymulować lub zwyczajnie nie mamy potrzeby symulować mechanizmów tak dokładnie. Zamiast tego możemy skorzystać z losowości, która przybliży zachowanie natury.

+

Przykładowo możemy losowo decydować czy w roślinie wyrośnie boczna gałąź czy nie. Co realizuje poniższy L-System (znajduje się on także w pliku stochastic.txt)

+
#axiom
+B
+#rules
+B -> #stochastic
+p=3 FB
+p=1 [+FB]FB
+p=1 [-FB]FB
+p=1 F
+#stochastic end
+#rules end
+
+

W powyższym przypadku mamy symbol B, który symbolizuje merystem (część rośliny zdolną do rozwoju); F oznacza rozwiniętą gałąź. B może rozwinąć łodygę, wytworzyć gałąź po prawej, wytworzyć gałąź po lewej lub zaprzestać rozwój.

+

Odpal scenę LSystem2D załaduj stochastic.txt i odpal kilka razy od początku (żeby zresetować, kliknij Load File).

+

Reguły stochastyczne należy zacząć od słowa #stochastic. Następnie po linijce wypisać wyniki, poprzedzając je frazą p=W, gdzie W to waga danego wyniku. Wagi mogą być dowolną dodatnią liczbą rzeczywistą. Interpreter na podstawie wag przydzieli prawdopodobieństwo kolejnym wynikom. Przykładowo w powyższym L-Systemie reguły zostaną wykonane następująco:

+ +

Screenshot 2021-03-14 at 07.32.36Screenshot 2021-03-14 at 07.32.56 Screenshot 2021-03-14 at 07.33.17

+

zadanie

+

Obecnie zdarza się tak, że L-System wchodzi w ostatnią regułę na samym początku i nic nie wyrasta. Innym razem wyrasta bardzo dużo odgałęzień i całość wymyka się spod kontroli a na pewno przestaje przypominać roślinę. Pomyśl jak można zaradzić tym dwóm problemom, zmodyfikuj L-System tak, by ich uniknąć. Możesz dodać nowe symbole lub/i wykorzystać symbole parametryczne.

+

Zadanie domowe

+

Scena LSystem3D jest kopią sceny LSystem2D, korzysta ona ze skryptu Turtle3D zamiast Turtle2D (chociaż są one na razie identyczne). Dodaj do Turtle3D obsługę obrotów w trzech wymiarach za pomocą znaków:

+ +

Poza tym dla symboli L i F dodaj interpretacje kolejno jako liść i kwiat. W folderze Models są gotowe modele, ale możesz ściągnąć własne.

+

Wykorzystaj dotychczasową wiedzę i powyższą interpretację, by stworzyć L-System generujący roślinę polną jak poniższy chaber.

+
+rysunek chabra z wikipedii +
+ + diff --git a/cw1 p2/cw1.md b/cw1 p2/cw1.md new file mode 100644 index 0000000..6acb773 --- /dev/null +++ b/cw1 p2/cw1.md @@ -0,0 +1,178 @@ +# L-System + +W tej części zajęć skupimy się na tworzeniu L-Systemów i wykorzystaniu ich do reprezentacji zjawisk przyrodniczych. + +> **Przypomnienie** +> **L-System** to system przepisywania i gramatyka formalna. Składa się z: symboli, które tworzą ciągi znaków; reguł produkcyjnych, które opisują na co należy przepisać dany znak; aksjomatu, czyli początkowego ciągu znaków; i mechanizmu, który tłumaczy ciąg znaków na reprezentacje geometryczną + +Bazą dla tych zajęć jest książka Algorithmic Beauty of Plants dostępna za darmo pod [linkiem](http://algorithmicbotany.org/papers/abop/abop.lowquality.pdf) lub [w wyższej jakości](http://algorithmicbotany.org/papers/abop/abop.pdf) + +## Składnia L-Systemów + +Projekt zawiera bibliotekę, która interpretuje L-Systemy. Ich definicję pobiera z oddzielnego pliku. Ich składnie opisuję definicja L-Systemu opisującego rozwój bakterii Anabaena znajduje się w projekcie pod ścieżką `Assets\LSystem\Anabaena.txt` i wygląda następująco: + +``` +#axiom +L +#rules +L->lR +R->Lr +l->L +r->R +#end rules +``` + +Plik należy zacząć od linii `#axiom`, następnie w następnej linii zamieścić ciąg początkowy. Później pomiędzy liniami `#rules` i `#end rules` umieścić instrukcje przepisywania według zasady: +```-> ``` +każdy znak przed strzałką i po strzałce (z wyjątkiem reguł o których później) jest traktowany jako następny symbol. W przypadku kilku reguł, które dotyczą tego samego symbolu wykona się ta, która jest wyżej w pliku. Między reguły można dodawać komentarze, znakiem komentującym jest `#`. Jeżeli znak nie posiada żadnej reguły, która by go opisywała, to nie jest on zmieniany. + +Odpal scenę **LSystemFromFile**, zaznacz **LSystemController** w panelu po prawej. Po lewej w polu **L System Path** wpisz `Assets\LSystem\Anabaena.txt` kliknij **Load File**, by załadować LSystem. Następnie Evaluate, by wykonać przepisanie. W scenie wyświetlą się obiekty reprezentujące symbole a w konsoli wyświetli się wynik przepisania. + +Składnia wszystkich rozszerzeń jest zaprezentowana w pliku `SampleLSystem.txt` w tej chwili niektóre reguły mogą byc niezrozumiałe, ale może się on przydać później jako wzorzec. + +## Turtle Graphics + +Turtle Graphics jest metodą tworzenia grafiki komputerowej, wykorzystuje kursor (tytułowego żółwia) wykonujący instrukcje w przestrzeni lokalnej. + +![https://en.wikipedia.org/wiki/Turtle_graphics](Turtle-animation-20210313143359379.gif) + +L-Systemy można interpretować za pomocą Turtle Graphics, poprzez przypisanie każdemu symbolowi instrukcji jaką ma wykonać żółw. Następnie żółw będzie wykonywał kolejne instrukcje czytając napis od lewej do prawej. + +Na początek zaczniemy od prostej reprezentacji, gdzie `+` będzie oznaczał w kierunku zgodnym z ruchem wskazówek zegara o wskazany kąt, natomiast `-` w przeciwnym. Kąt zwyczajowo oznacza się grecką literą $\delta$. Każdy inny symbol będzie oznaczał idź prosto o 1. + +Odpal Scenę LSystem2D, załaduj plik `Sierpinski.txt`, ustaw kąt na 60 stopni i wykonaj kilka kroków. + +### Zadanie + +napisz Lsystem, który będzie rysował gwiazdkę kocha + +1. #### Krzywa kocha: + + + + + +Opis: + +1. Podziel linię na 3 równę części +2. Przy środkowej części narysuj równoboczny trójkąt zwrócony na zewnątrz +3. Usuń środkową część pierwotnej lini + +Musimy z jednej lini zrobić 4 nowe, z czego pierwsza i ostatnia idą w tym samym kierunku, a dwie środkowe idą pod innym kątem (podpowiedź: dając dwa razy + lub - możesz zwiększyć kąt) + +2. #### W pierwszym kroku L-Systemu utwórz trójkąt + + ![](Von_Koch_curve.gif) + +## Bracketed L-systems + +W podstawowej wersji L-Systemy są pojedyńczym ciągiem znaków, by uzyskać możliwość tworzenia rozgałęzień wprowadzamy dwa specjalne znaki `[` oraz `]` pierwszy mówi, żeby zapamiętać obecny stan, drugi oznacza by wrócić do stanu zapamiętanym przy ostatnim znaku `[`. Przykładowo ciąg symboli `F[+FFF][-F]FF` dla $\delta=90$ będzie reprezentowany następująco +![obraz](im_bracketed-5642437.jpg) + +### Zadanie + +Wyświetl poniższe L-Systemy. Zmodyfikuj definicję drugiego, by dodstać asymetryczną roślinę + +Screenshot 2021-03-13 at 14.29.06 ![Screenshot 2021-03-13 at 14.29.10](Screenshot 2021-03-13 at 14.29.10.png) + +## Pisanie własnej interpretacji LSystemów + +Wróćmy do sceny LSystemFromFile W tej scenie zamiast kresek pojawiają się figury reprezentujące komórki (czerwona lewa, zielona prawa, niska młoda, wysoka dorosła). Otwórz skrypt AnabeanaTurtle.cs, który odpowiada za rysowanie. Zawiera on klasę `AnabeanaTurtle` dziedziczącą po `TurtleLSystem`. `TurtleLSystem` jest klasą abstrakcyjną, wymaga zdefiniowania funkcji `initLiteralInterpretation`, w której należy opisać jak interpretować symbole. + +```CS + 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, Matrix4x4.Rotate(Quaternion.Euler(0, 0, -angle)))); + turtleInterpretation.Add("-", (float[] args) => new Tuple(null, Matrix4x4.Rotate(Quaternion.Euler(0, 0, angle)))); + + //Wildcard how to represent any other symbol + turtleInterpretation.Add("*.*", (float[] args) => new Tuple(obj, transformation)); + } + +``` + +Żeby tego dokonać należy uzupełnić słownik `turtleInterpretation`, którego kluczami są opisywane symbole jako stringi. Natomiast wartościami są funkcje, które przyjmują jako argument tablicę parametrów danego symbolu (o tym później) a zwracają Krotkę, której pierwszym elementem jest rysowany obiekt, natomiast drugim transformacja, jaką wykona żółw. Powyższym przykładzie obiekty są czytane z modeli a transformacja zawsze jest taka sama, czyli translacja o wektor (0.1,0,0) i skalowanie o wektor (0.1,0.1,0.1). (Skalowania nie są pamiętane przez żółwia) + +Te funkcje są wykorzystywane przez żółwia do interpretacji ciągu symboli. Przykładowo `LRr` zostanie zinterpretowany następująco: + +* żółw przesuwa się o 0.1 w osi X umieszcza bigL w punkcie (0.1,0,0) +* żółw przesuwa się o 0.1 w osi X umieszcza bigR w punkcie (0.2,0,0) (ponieważ (0.1,0,0)+(0.1,0,0)=(0.2,0,0) ) +* żółw przesuwa się o 0.1 w osi X umieszcza bigL w punkcie (0.3,0,0) + +### Zadanie + +Jak wyszukasz w internecie obrazki Anabaeny, zobaczysz, że są one często powykręcane, dodaj do macierz przekształceń obroty w osi Y o losowy kąt pomiędzy -20 a 20 stopni. + +## Parametryczne L-Systemy + +Parametryczne L-Systemy operują na symbolach parametrycznych znakach, czyli takich, które posiadają 0 lub więcej parametrów rzeczywistych. Pozwala to przechowywać różne wewnętrzne stany obiektów. Przykładowo dla modelu Anabeany powyżej rozróżniamy tylko 2 stany, młody i dorosły. Dzięki parametrycznym L-Systemom możemy opisać wiek w sposób bardziej ciągły. Przykładowo poniższy L-System komórki która rośnie i jak osiągnie odpowiedni wiek rozdziela się na dwie młode komórki + +``` +#axiom +B(1) +#rules +B(a) : a<2 -> B(a+0.1) +B(a) : a>=2 -> B(1)B(1) +#end rules +``` + +Parametry zapisuje się wewnątrz nawiasów po przecinku. W aksjomacie muszą one mieć wartości liczbowe. Po lewej stronie trzeba nadać parametrom nazwy (mogą mieć one więcej niż jeden znak). Symbole są identyfikowane po nazwie i liczbie znaków. Po dwukropku można podać warunki logiczne jakie musi spełnić symbol. można w tym umieszczać operacje matematyczne, dozwolone jest mnożenie, dzielenie, dodawanie i odejmowanie. podobnie w parametrach po prawej stronie + +### Zadanie + +Napisz dla parametrycznej wersji Anabeny taką interpretację, żeby komórki rosły wraz z wiekiem. + +## Stochastyczne L-Systemy + +Niektóre procesy biologiczne są zbyt skomplikowane albo niedostatecznie zbadane, żeby można je było je zasymulować lub zwyczajnie nie mamy potrzeby symulować mechanizmów tak dokładnie. Zamiast tego możemy skorzystać z losowości, która przybliży zachowanie natury. + +Przykładowo możemy losowo decydować czy w roślinie wyrośnie boczna gałąź czy nie. Co realizuje poniższy L-System (znajduje się on także w pliku `stochastic.txt`) + +``` +#axiom +B +#rules +B -> #stochastic +p=3 FB +p=1 [+FB]FB +p=1 [-FB]FB +p=1 F +#stochastic end +#rules end + +``` + +W powyższym przypadku mamy symbol B, który symbolizuje merystem (część rośliny zdolną do rozwoju); F oznacza rozwiniętą gałąź. B może rozwinąć łodygę, wytworzyć gałąź po prawej, wytworzyć gałąź po lewej lub zaprzestać rozwój. + +Odpal scenę `LSystem2D` załaduj `stochastic.txt` i odpal kilka razy od początku (żeby zresetować, kliknij *Load File*). + +Reguły stochastyczne należy zacząć od słowa `#stochastic`. Następnie po linijce wypisać wyniki, poprzedzając je frazą `p=W`, gdzie `W` to waga danego wyniku. Wagi mogą być dowolną dodatnią liczbą rzeczywistą. Interpreter na podstawie wag przydzieli prawdopodobieństwo kolejnym wynikom. Przykładowo w powyższym L-Systemie reguły zostaną wykonane następująco: + + * FB z prawdopodobieństwem $\frac{3}{6}$ + * [+FB]FB z prawdopodobieństwem $\frac{1}{6}$ + * [+FB]FB z prawdopodobieństwem $\frac{1}{6}$ + * F z prawdopodobieństwem $\frac{1}{6}$ + +Screenshot 2021-03-14 at 07.32.36Screenshot 2021-03-14 at 07.32.56 Screenshot 2021-03-14 at 07.33.17 + +### zadanie + +Obecnie zdarza się tak, że L-System wchodzi w ostatnią regułę na samym początku i nic nie wyrasta. Innym razem wyrasta bardzo dużo odgałęzień i całość wymyka się spod kontroli a na pewno przestaje przypominać roślinę. Pomyśl jak można zaradzić tym dwóm problemom, zmodyfikuj L-System tak, by ich uniknąć. Możesz dodać nowe symbole lub/i wykorzystać symbole parametryczne. + +## Zadanie domowe + +Scena `LSystem3D` jest kopią sceny `LSystem2D`, korzysta ona ze skryptu `Turtle3D` zamiast `Turtle2D` (chociaż są one na razie identyczne). Dodaj do `Turtle3D` obsługę obrotów w trzech wymiarach za pomocą znaków: + +* `&` obrót do góry (pitch), czyli obrót względem osi X o kąt $\delta$ +* `^` obrót do góry (pitch), czyli obrót względem osi X o kąt $-\delta$ +* `\` obrót do obrót w prawo (roll), czyli obrót względem osi Y o kąt $-\delta$ +* `/` obrót do obrót w lewo (roll), czyli obrót względem osi Y o kąt $\delta$ + +Poza tym dla symboli `L` i `F` dodaj interpretacje kolejno jako liść i kwiat. W folderze Models są gotowe modele, ale możesz ściągnąć własne. + +Wykorzystaj dotychczasową wiedzę i powyższą interpretację, by stworzyć L-System generujący roślinę polną jak poniższy chaber. + +![rysunek chabra z wikipedii](7_Centaurea_cyanus.jpg) \ No newline at end of file diff --git a/cw1 p2/im_bracketed-5640616.jpg b/cw1 p2/im_bracketed-5640616.jpg new file mode 100644 index 0000000..5e055e3 Binary files /dev/null and b/cw1 p2/im_bracketed-5640616.jpg differ diff --git a/cw1 p2/im_bracketed-5642437.jpg b/cw1 p2/im_bracketed-5642437.jpg new file mode 100644 index 0000000..5e055e3 Binary files /dev/null and b/cw1 p2/im_bracketed-5642437.jpg differ diff --git a/cw1 p2/im_bracketed.jpg b/cw1 p2/im_bracketed.jpg new file mode 100644 index 0000000..5e055e3 Binary files /dev/null and b/cw1 p2/im_bracketed.jpg differ diff --git a/cw1 p2/ph00001.png b/cw1 p2/ph00001.png new file mode 100644 index 0000000..f94261e Binary files /dev/null and b/cw1 p2/ph00001.png differ diff --git a/cw1 p2/ph00002.png b/cw1 p2/ph00002.png new file mode 100644 index 0000000..93fda98 Binary files /dev/null and b/cw1 p2/ph00002.png differ diff --git a/cw1 p2/ph00003.png b/cw1 p2/ph00003.png new file mode 100644 index 0000000..7fc9f12 Binary files /dev/null and b/cw1 p2/ph00003.png differ diff --git a/cw1 p2/ph00004.png b/cw1 p2/ph00004.png new file mode 100644 index 0000000..18ccddc Binary files /dev/null and b/cw1 p2/ph00004.png differ diff --git a/cw1 p2/ph00005.png b/cw1 p2/ph00005.png new file mode 100644 index 0000000..a72a535 Binary files /dev/null and b/cw1 p2/ph00005.png differ diff --git a/cw1 p2/ph00006.png b/cw1 p2/ph00006.png new file mode 100644 index 0000000..6e65633 Binary files /dev/null and b/cw1 p2/ph00006.png differ diff --git a/cw1 p2/ph00007.png b/cw1 p2/ph00007.png new file mode 100644 index 0000000..4ac9908 Binary files /dev/null and b/cw1 p2/ph00007.png differ diff --git a/cw1 p2/ph00008.png b/cw1 p2/ph00008.png new file mode 100644 index 0000000..2275e7e Binary files /dev/null and b/cw1 p2/ph00008.png differ diff --git a/cw1 p2/ph00009.png b/cw1 p2/ph00009.png new file mode 100644 index 0000000..b784481 Binary files /dev/null and b/cw1 p2/ph00009.png differ diff --git a/cw1 p2/render.py b/cw1 p2/render.py new file mode 100644 index 0000000..db3fcaf --- /dev/null +++ b/cw1 p2/render.py @@ -0,0 +1,7 @@ + +import os +rootdir = './' +for filename in os.listdir(rootdir): + if filename.endswith(".md"): + name = filename[:-3] + os.system(f'pandoc -s -o {name}.html {name}.md --mathjax --css style.css') \ No newline at end of file diff --git a/cw1 p2/style.css b/cw1 p2/style.css new file mode 100644 index 0000000..cf42427 --- /dev/null +++ b/cw1 p2/style.css @@ -0,0 +1,107 @@ +html { font-size: 100%; overflow-y: scroll; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; } + +body{ +color:#444; +font-family:Georgia, Palatino, 'Palatino Linotype', Times, 'Times New Roman', serif; +font-size:12px; +line-height:1.5em; +padding:1em; +margin:auto; +max-width:42em; +background:#fefefe; +} + +a{ color: #0645ad; text-decoration:none;} +a:visited{ color: #0b0080; } +a:hover{ color: #06e; } +a:active{ color:#faa700; } +a:focus{ outline: thin dotted; } +a:hover, a:active{ outline: 0; } + +::-moz-selection{background:rgba(255,255,0,0.3);color:#000} +::selection{background:rgba(255,255,0,0.3);color:#000} + +a::-moz-selection{background:rgba(255,255,0,0.3);color:#0645ad} +a::selection{background:rgba(255,255,0,0.3);color:#0645ad} + +p{ +margin:1em 0; +} + +img{ +max-width:100%; +} + +h1,h2,h3,h4,h5,h6{ +font-weight:normal; +color:#111; +line-height:1em; +} +h4,h5,h6{ font-weight: bold; } +h1{ font-size:2.5em; } +h2{ font-size:2em; } +h3{ font-size:1.5em; } +h4{ font-size:1.2em; } +h5{ font-size:1em; } +h6{ font-size:0.9em; } + +blockquote{ +color:#666666; +margin:0; +padding-left: 3em; +border-left: 0.5em #EEE solid; +} +hr { display: block; height: 2px; border: 0; border-top: 1px solid #aaa;border-bottom: 1px solid #eee; margin: 1em 0; padding: 0; } +pre, code, kbd, samp { color: #000; font-family: monospace, monospace; _font-family: 'courier new', monospace; font-size: 0.98em; } +pre { white-space: pre; white-space: pre-wrap; word-wrap: break-word; } + +b, strong { font-weight: bold; } + +dfn { font-style: italic; } + +ins { background: #ff9; color: #000; text-decoration: none; } + +mark { background: #ff0; color: #000; font-style: italic; font-weight: bold; } + +sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } +sup { top: -0.5em; } +sub { bottom: -0.25em; } + +ul, ol { margin: 1em 0; padding: 0 0 0 2em; } +li p:last-child { margin:0 } +dd { margin: 0 0 0 2em; } + +img { border: 0; -ms-interpolation-mode: bicubic; vertical-align: middle; } + +table { +border-collapse: collapse; +border-spacing: 0; +width: 100%; +} +th { border-bottom: 1px solid black; } +td { vertical-align: top; } + +@media only screen and (min-width: 480px) { +body{font-size:14px;} +} + +@media only screen and (min-width: 768px) { +body{font-size:16px;} +} + +@media print { + * { background: transparent !important; color: black !important; filter:none !important; -ms-filter: none !important; } + body{font-size:12pt; max-width:100%;} + a, a:visited { text-decoration: underline; } + hr { height: 1px; border:0; border-bottom:1px solid black; } + a[href]:after { content: " (" attr(href) ")"; } + abbr[title]:after { content: " (" attr(title) ")"; } + .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; } + pre, blockquote { border: 1px solid #999; padding-right: 1em; page-break-inside: avoid; } + tr, img { page-break-inside: avoid; } + img { max-width: 100% !important; } + @page :left { margin: 15mm 20mm 15mm 10mm; } + @page :right { margin: 15mm 10mm 15mm 20mm; } + p, h2, h3 { orphans: 3; widows: 3; } + h2, h3 { page-break-after: avoid; } +} \ No newline at end of file