From 891dc6ae34b9641cfbcfa6648962ef3ac5ff3714 Mon Sep 17 00:00:00 2001 From: Klafyvel Date: Tue, 5 Dec 2017 14:54:44 +0100 Subject: [PATCH] Ajout des fichiers. --- .gitignore | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 1 + lsystem.py | 89 +++++++++++++++++++++++++++++++++++++++ test.py | 55 ++++++++++++++++++++++++ 4 files changed, 266 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 lsystem.py create mode 100644 test.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..50ff9b6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,121 @@ + +# Created by https://www.gitignore.io/api/vim,python + +### Python ### +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ + +### Vim ### +# swap +[._]*.s[a-v][a-z] +[._]*.sw[a-p] +[._]s[a-v][a-z] +[._]sw[a-p] +# session +Session.vim +# temporary +.netrwhist +*~ +# auto-generated tag files +tags + +# End of https://www.gitignore.io/api/vim,python diff --git a/README.md b/README.md new file mode 100644 index 0000000..01fe1bf --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +#TD de SDA : découverte de Python diff --git a/lsystem.py b/lsystem.py new file mode 100644 index 0000000..3a69868 --- /dev/null +++ b/lsystem.py @@ -0,0 +1,89 @@ +import matplotlib.pyplot as plt +import numpy as np +import random as rd + +## Question 1 +def genere(regles, L0, n): + L = L0 + for i in range(n): + new_res = "" + for j in L: + new_res += regles.get(j, j) + L = new_res + return L + +## Question 2 +class Tortue: + def __init__(self, angle, i=1): + """ Initialise la tortue en (0,0) avec un angle de `angle`.""" + plt.figure(i) + plt.axis('equal') + self.angle = angle + self.pos = (0,0) + + self.stack = [] + + def avance(self, r): + """ Avance la torue de `r` unités. """ + x,y = self.pos + self.pos = ( + x + r*np.cos(self.angle), + y + r*np.sin(self.angle) + ) + plt.plot([x, self.pos[0]], [y, self.pos[1]], 'r') + + def tourne(self, a): + """ Tourne la tortue d'un angle a. """ + self.angle += a + + def push(self): + """ Mémorise l'état courrant. """ + self.stack.append((self.pos, self.angle)) + + def pop(self): + """ Retourne au précédent état mémorisé. """ + self.pos, self.angle = self.stack.pop(-1) + + def trace(self, s, alpha): + """ Trace la chaîne de caractères s. """ + plt.autoscale() + for c in s: + if c == '+': + self.tourne(alpha) + elif c == '-': + self.tourne(-alpha) + elif c == '[': + self.push() + elif c == ']': + self.pop() + else: + self.avance(1) + + +## Question 5 +def genere2(regles, L0, n): + L = L0 + for i in range(n): + new_res = "" + for j in L: + regle = regles.get(j, [j]) + new_res += regle[rd.randint(0,len(regle)-1)] + L = new_res + return L + +## Question 5 +def genere3(regles, L0, n): + L = L0 + for i in range(n): + new_res = "" + for j in L: + regle = regles.get(j, [(1,j)]) + poids_total = sum(map(lambda x:x[0], regle)) + tirage = rd.uniform(0,poids_total-1) + k = 0 + while tirage > 0: + tirage -= regle[k][0] + k += 1 + new_res += regle[k-1][1] + L = new_res + return L diff --git a/test.py b/test.py new file mode 100644 index 0000000..492070d --- /dev/null +++ b/test.py @@ -0,0 +1,55 @@ +import numpy as np +import matplotlib.pyplot as plt +import lsystem as ls + +L1 = ls.genere({"A": "A−B+A+B−A", "B": "BB"}, "A−B−B", 1) +print("L1 = " + L1) +assert(L1 == "A−B+A+B−A−BB−BB") +L2 = ls.genere({"A": "A−B+A+B−A", "B": "BB"}, "A−B−B", 2) +assert(L2 == "A−B+A+B−A−BB+A−B+A+B−A+BB−A−B+A+B−A−BBBB−BBBB") + +plt.close('all') +t = ls.Tortue(0) +for i in range(4): + t.avance(20) + t.tourne(np.pi/2) + +plt.show() + +plt.close('all') +t = ls.Tortue(0) +s = ls.genere({"A":"A-B+A+B-A", "B":"BB"},"A−B−B", 5) +t.trace(s,2*np.pi/3) +plt.show() + +plt.close('all') +t = ls.Tortue(0) +s = ls.genere({"A":"A-A++A-A", "B":"BB"},"A++A++A", 4) +t.trace(s,np.pi/3) +plt.show() + +plt.close('all') +t = ls.Tortue(0) +s = ls.genere({"A":"A[+A]A[-A]A"},"A", 3) +t.trace(s,22*np.pi/180) +plt.show() + +plt.close('all') +t = ls.Tortue(0) +s = ls.genere({"A":"B[+A][-A]BA", "B":"BB"},"A", 4) +t.trace(s,25*np.pi/180) +plt.show() + +plt.close('all') +t = ls.Tortue(0) +s = ls.genere({"A":"A+b-AA+A+AA+Ab+AA-B+AA-A-AA-Ab-AAA", "b":"bbb"},"A", 2) +t.trace(s,np.pi/2) +plt.show() + +plt.close('all') +for i in range(5): + t = ls.Tortue(0, i) + s = ls.genere3({"A":[(2,"A[+A]A[-A]A"), (1,"A[+A]A"), (1,"A[-A]A")]},"A", 5) + t.trace(s,np.pi/6) + plt.show() +