sierpinski地毯

 

(分形做業)python

取一矩形,九等分而去其中。c++

每一份九等分去其中;循環往復。算法

     

 

方法一(傳統方法)小程序

將每一個矩形映射到三個矩形中去便可。dom

 

def big(a,times):
    k=3**times
    b=np.zeros((k,k),dtype=int)
    for i in range(k//3):
        for j in range(k//3):
            t=ct.renew(a[i][j])
            b[3*i:3*i+3,3*j:3*j+3]=t
    return b

def renew(i):
    if i==0:
        t=np.zeros((3,3),dtype=int)
        t[1][1]=1
    elif i==1:
        t=np.ones((3,3),dtype=int)
    return t

 

建立一個比以前的矩形大3倍的矩形,將原來的每塊按「若黑,中白外黑;若白,全白」的方法來處理。調試

在數據存儲裏,以黑爲0,以白爲1。恰好用分別(zeros+芯=1)與(ones)來處理,是墜吼的。 blog

每一個回合,咱們都把矩形擴大了3倍(以行數計)。圖片

只要再補上一個模塊,使輸出的矩形如你所想地大。其實我原本是不想整的 ,可是,最初的矩形是9*9像素的。。。這不影響我交做業可是這作博客就很難看了。博客

 

我會告訴你我是這麼交上去的?it

import cv2
import ct
import numpy as np
import random
def output(a,times,iii):
    k=3**(iii-times)
    n=3**iii
    p=3**times
    b=np.zeros((n,n),dtype=int)
    for i in range(p):
        for j in range(p):
            if a[i][j]==0:
                pass
            if a[i][j]==1:
                for ii in range(k):
                    for jj in range(k):
                        b[i*k+ii][j*k+jj]=1
                        b[i*k+ii][j*k+jj]=1
                        b[i*k+ii][j*k+jj]=1
    return b
def big(a,times):
    k=3**times
    b=np.zeros((k,k),dtype=int)
    for i in range(k//3):
        for j in range(k//3):
            t=ct.renew(a[i][j])
            b[3*i:3*i+3,3*j:3*j+3]=t
    return b

def renew(i):
    if i==0:
        t=np.zeros((3,3),dtype=int)
        t[1][1]=1
    elif i==1:
        t=np.ones((3,3),dtype=int)
    return t
def print(a,iii,img):
    k=3**iii
    for i in range(k):
        for j in range(k):
            if a[i][j]==0:
                img[i][j][0]=0
                img[i][j][1]=0
                img[i][j][2]=0
            if a[i][j]==1:
                img[i][j][0]=255
                img[i][j][1]=255
                img[i][j][2]=255
    return img
 
以上是ct.py爲啥用這個名字呢。。。今天大行動好吧。。。
生活鴨梨大啊,csgo卸載好幾個月了。。。
尤爲是不那麼嚴肅的小程序,我對於變量名一向不怎麼在乎。
 
實際上是很開心的一天,由於能夠用python吼吼吼。
我不知道C++更快麼?我知道,我固然知道!可是python調試很是友好啊。
想一想今天那個c++二階矩陣求逆求出inf的事情。。。痛苦啊。
或者這麼說吧,py寫出來,報錯,你大概就猜獲得上下多少行內出了問題,你打三個print基本就知道哪裏出錯了。
但c++不是,今天我printf出來一堆不知道什麼鬼,罵了幾分鐘之後發現運算錯誤根本不在這裏,我把浮點矩陣的printf抄到整型的裏了,其實問題根本不在這裏。。。
 
 
import cv2
import numpy as np
import ct
a=np.zeros((1,1),dtype=int)
times=1
for i in range(times):
    a=ct.big(a,i+1)
print(a.shape)
img=ct.cut(times)
imgg=ct.print(a,times,img)

name=str("sierpinski"+str(int(times))+".jpg")
cv2.imwrite(name,imgg)
if times<5:
    b=ct.output(a,times,5)
    imgx=ct.cut(5)
    imgggg=ct.print(b,5,imgx)
    name=str("sierpinskinew"+str(int(times))+".jpg")
    cv2.imwrite(name,imgggg)
 
什麼?你問cut在哪裏?
生成一張3**i行3**i列的圖片。
別問,問就祖傳祕方。
 
明天寫另外一半
如何用隨機數算法來實現這玩意。

 

 總之是由於能夠問心無愧地用python而高興的一天。

 

哎,你說C++,是不會用麼?算也不算。

講道理要實現沒什麼技術問題,除了,你寫三小時程序有兩小時在罵街之外。

C++使我暴躁。

你說我np(3**7,3**7)多快樂啊。上次int a[1000][1000]直接boom了。。。

替代算法有麼,固然有,但是不快樂啊2333333。

相關文章
相關標籤/搜索