Primeira vez aqui? Seja bem vindo e cheque o FAQ!
x

É possível gerar carpetes que lembrem as pinturas de Mondrian usando recursão?

+1 voto
160 visitas
perguntada Mar 26, 2016 em Ciência da Computação por danielcajueiro (5,226 pontos)  

Essa é uma pintura original do Mondrian:

A imagem será apresentada aqui.

A imagem será apresentada aqui.

Compartilhe

1 Resposta

+1 voto
respondida Mar 26, 2016 por danielcajueiro (5,226 pontos)  

Sim! Veja por exemplo as pinturas abaixo que foram geradas usando recursões:

A imagem será apresentada aqui.

Mondrian Recursion

O código usado para gerar está apresentado no fim dessa resposta.

Obviamente, pode-se brincar com esse programa de várias formas (escolhendo os parâmetros) para as imagens ficarem mais parecidas com o estilo de Mondrian, ou simplesmente brincar com o programa para gerar outras coisas legais:

A imagem será apresentada aqui.

A imagem será apresentada aqui.

import matplotlib.pyplot as plt
import numpy as np


fig=plt.figure(num=None, figsize=(8, 8), dpi=80, facecolor='w', edgecolor='k')
plt.hold(True)
plt.axis([0, 1, 0, 1])
ax = plt.subplot(111) 
ax.set_xticks([])
ax.set_yticks([])
global cont
cont=0

np.random.seed(seed=10)

def paintSquare(xIni,xEnd,yIni,yEnd):
    listColor=['black','#F60000','#3713FF','#FFFF55']
    nColor=len(listColor)
    n=25
    listx=[]
    for i in range(n+1):
        listx.append(xIni+((i)/(1.0*n))*(xEnd-xIni))         


    randomInt=np.random.randint(0,nColor)        
    plt.fill_between(listx,yIni,yEnd,facecolor=listColor[randomInt])

def draw_mondrian(xIni,xEnd,yIni,yEnd,frac,generation,pVertical=0.5,pBeginning=0.5,baseSize=1/16.0):
    global cont
    cont=cont+1
    print cont
    length=np.min([xEnd-xIni,yEnd-yIni])
    if(length<baseSize):
        pass
    else:
        vertical=False
        if(np.random.uniform()<pVertical):
            vertical=True
        beginning=False    
        if(np.random.uniform()<pBeginning):
            beginning=True
        if(vertical and beginning):
            newCoord=xIni+frac*(xEnd-xIni)
            xIni1=xIni
            yIni1=yIni
            xEnd1=newCoord
            yEnd1=yEnd

            xIni2=newCoord
            yIni2=yIni
            xEnd2=xEnd
            yEnd2=yEnd

            plt.plot([newCoord,newCoord],[yIni,yEnd],'k',linewidth=3.0) 

        elif(vertical and not beginning):                                    

            newCoord=xIni+(1.0-frac)*(xEnd-xIni)
            xIni1=xIni
            yIni1=yIni
            xEnd1=newCoord
            yEnd1=yEnd

            xIni2=newCoord
            yIni2=yIni
            xEnd2=xEnd
            yEnd2=yEnd

            plt.plot([newCoord,newCoord],[yIni,yEnd],'k',linewidth=3.0)             

        elif(not vertical and beginning):       

            newCoord=yIni+frac*(yEnd-yIni)
            xIni1=xIni
            yIni1=yIni
            xEnd1=xEnd
            yEnd1=newCoord

            xIni2=xIni
            yIni2=newCoord
            xEnd2=xEnd
            yEnd2=yEnd

            plt.plot([xIni,xEnd],[newCoord,newCoord],'k',linewidth=3.0) 

        else:

            newCoord=yIni+(1-frac)*(yEnd-yIni)
            xIni1=xIni
            yIni1=yIni
            xEnd1=xEnd
            yEnd1=newCoord

            xIni2=xIni
            yIni2=newCoord
            xEnd2=xEnd
            yEnd2=yEnd

            plt.plot([xIni,xEnd],[newCoord,newCoord],'k',linewidth=3.0) 
        parameter=0.1    
        if(np.random.uniform()<1.0/(1+parameter*generation)):  
            draw_mondrian(xIni1,xEnd1,yIni1,yEnd1,frac,generation+1)
        else:
            paintSquare(xIni1,xEnd1,yIni1,yEnd1)

        if(np.random.uniform()<1.0/(1+parameter*generation)):      
            draw_mondrian(xIni2,xEnd2,yIni2,yEnd2,frac,generation+1)
        else:
            paintSquare(xIni2,xEnd2,yIni2,yEnd2)

if __name__ == '__main__':



    initialSize=1
    xIni=0
    yIni=0
    xEnd=1
    yEnd=1
    frac=1/3.0
    draw_mondrian(xIni,xEnd,yIni,yEnd,frac,0)
    plt.savefig('Mondrian')

É válido mencionar que esse problema é mencionado na página 4 do livro: Think recursively - Eric S. Roberts

...