折纸痕问题 Paper Folding

    你喜欢折纸痕吗?给你一张很大的纸,对折以后再对折,再对折……每次对折都是从右往左折,因此在折了很多次以后,原先的大纸会变成一个窄窄的纸条。现在把这个纸条沿着折纸的痕迹打开,每次都只打开“一半”,即把每个痕迹做成一个直角,那么从纸的一端沿着和纸面平行的方向看过去,会看到一条美妙的曲线。我们可以发现这实际上就是分形中的中国龙。其离散迭代系统如下:

Axiom F
F = F + G
G = F – G

注:+表示逆时针转90度,-表示顺时针转90度;F和G都表示单位长度的直线段。

 

Haskell 代码:

data Dragon = Dragon `P` Dragon | Dragon `N` Dragon | F | G deriving(Show) nextDragon::Dragon->Dragon nextDragon F=F `P` G nextDragon G=F `N` G nextDragon (d1 `P` d2) =nextDragon d1 `P` nextDragon d2 nextDragon (d1 `N` d2) =nextDragon d1 `N` nextDragon d2

MATLAB代码

 

function line=symmetryfold(n) % SYMMETRYFOLD 把线段在同一平面内对折后,把所成小线段顺次展开成直角,所得的折线图形 % line = symmetryfold( n ) 输入参数n 表示折叠的次数,输出参数line 返回产生的折线 % 的坐标。 line=zeros(2,2^n+1); line(:,2)=[1;0]; for i=1:(2^n)-1 num=i; while mod(num,2)==0 num=num/2; end if mod((num+1)/2,2) rl='l'; % 沿线段方向左转 else rl='r'; % 沿线段方向左转 end line(:,i+2)=nextd(line(:,[i,i+1]),rl); end plot(line(1,:),line(2,:)); axis equal function nextpoint=nextd(curline,rl) nextpoint=curline(:,2); if curline(1,1)==curline(1,2) % x不变 if curline(2,1)

你可能感兴趣的:(组合数学)