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。

相关文章
相关标签/搜索