Dessiner "Dessiner une fougère par programme" en Python

J'ai profité de la série "Dessin de fougère par programmation" et l'ai également écrite en Python.

Résultat de sortie

Screenshot_from_2014-05-27 00:35:50.png

Code source

Version d'appel récursif

import random

N = 20
xm = 0
ym = 0.5
h = 0.6

width = 500
height = 500

W1x = lambda x, y: 0.836 * x + 0.044 * y
W1y = lambda x, y: -0.044 * x + 0.836 * y + 0.169
W2x = lambda x, y: -0.141 * x + 0.302 * y
W2y = lambda x, y: 0.302 * x + 0.141 * y + 0.127
W3x = lambda x, y: 0.141 * x - 0.302 * y
W3y = lambda x, y: 0.302 * x + 0.141 * y + 0.169
W4x = lambda x, y: 0
W4y = lambda x, y: 0.175337 * y

def f(im, k, x, y):
    if 0 < k:
        f(im, k - 1, W1x(x, y), W1y(x, y))
        if random.random() < 0.3:
            f(im, k - 1, W2x(x, y), W2y(x, y))
        if random.random() < 0.3:
            f(im, k - 1, W3x(x, y), W3y(x, y))
        if random.random() < 0.3:
            f(im, k - 1, W4x(x, y), W4y(x, y))
    else:
        s = 490
        im.putpixel((int(x * s + width * 0.5), int(height - y * s)), (0, 128, 0))

if __name__ == '__main__':
    from PIL import Image
    im = Image.new("RGB", (width, height), (255, 255, 255))
    f(im, N, 0, 0)
    im.show()

C'est un peu peu attrayant car la fonction f () transmet les arguments liés à l'image et la logique de dessin doit être écrite à l'intérieur de la fonction, alors j'ai essayé d'utiliser un peu plus Pythonic.

Appel récursif + version générateur

import random

N = 20
xm = 0
ym = 0.5
h = 0.6

width = 500
height = 500

W1x = lambda x, y: 0.836 * x + 0.044 * y
W1y = lambda x, y: -0.044 * x + 0.836 * y + 0.169
W2x = lambda x, y: -0.141 * x + 0.302 * y
W2y = lambda x, y: 0.302 * x + 0.141 * y + 0.127
W3x = lambda x, y: 0.141 * x - 0.302 * y
W3y = lambda x, y: 0.302 * x + 0.141 * y + 0.169
W4x = lambda x, y: 0
W4y = lambda x, y: 0.175337 * y

def f(k, x, y):
    if 0 < k:
        for p in f(k - 1, W1x(x, y), W1y(x, y)):
            yield p
        if random.random() < 0.3:
            for p in f(k - 1, W2x(x, y), W2y(x, y)):
                yield p
        if random.random() < 0.3:
            for p in f(k - 1, W3x(x, y), W3y(x, y)):
                yield p
        if random.random() < 0.3:
            for p in f(k - 1, W4x(x, y), W4y(x, y)):
                yield p
    else:
        s = 490
        yield x * s + width * 0.5, height - y * s

if __name__ == '__main__':
    from PIL import Image
    im = Image.new("RGB", (width, height), (255, 255, 255))
    for p in f(N, 0, 0):
        im.putpixel((int(p[0]), int(p[1])), (0, 128, 0))
    im.show()

Résumé

Recommended Posts

Dessiner "Dessiner une fougère par programme" en Python
Sortie "Dessiner fougère par programmation" dans le processus de dessin en Python
Dessiner un graphique avec python
Dessiner "Dessiner une fougère par programmation" en Python - Aucune récurrence + Version du générateur -
Dessiner une forme d'onde mp3 en Python
Dessinez le disque de Poancare en Python
Dessiner la fonction Yin en python
Dessinez un cœur en Python
Dessinez des ondes sinusoïdales avec Blender Python
Dessinez des nœuds de manière interactive avec Plotly (Python)
Dessinez une matrice de diagramme de dispersion avec python
Dessinez un diagramme CNN en Python
Quadtree en Python --2
CURL en Python
Métaprogrammation avec Python
Python 3.3 avec Anaconda
Géocodage en python
SendKeys en Python
Méta-analyse en Python
Unittest en Python
Dessinez Nozomi Sasaki dans Excel avec python
Discord en Python
Dessiner un cœur avec Python Partie 2 (SymPy Edition)
DCI en Python
tri rapide en python
nCr en python
N-Gram en Python
Programmation avec Python
Plink en Python
Constante en Python
FizzBuzz en Python
Sqlite en Python
Étape AIC en Python
Dessinez une structure arborescente en Python 3 à l'aide de graphviz
LINE-Bot [0] en Python
CSV en Python
Assemblage inversé avec Python
Réflexion en Python
Constante en Python
nCr en Python.
format en python
Scons en Python 3
Puyopuyo en python
python dans virtualenv
PPAP en Python
Quad-tree en Python
Réflexion en Python
Chimie avec Python
Hashable en Python
DirectLiNGAM en Python
LiNGAM en Python
Aplatir en Python
Aplatir en python
Dessiner un graphique d'une fonction quadratique en Python
Dessiner des lignes de contour qui apparaissent dans les manuels (Python)
Dessinez des graphiques dans Julia ... Laissez les graphiques à Python
[Python] Comment dessiner un histogramme avec Matplotlib
Liste triée en Python
AtCoder # 36 quotidien avec Python