(分形做業)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。