randcantor.m
上传用户:cz_hongli
上传日期:2015-05-14
资源大小:1613k
文件大小:5k
源码类别:

分形几何

开发平台:

Matlab

  1. function c = randcantor(p,n,d,varargin)
  2. %RANDCANTOR  1D, 2D or 3D generalized random Cantor set
  3. %   C = RANDCANTOR(P, N, D) generates a logical D-dimensional array (with
  4. %   D=1, 2, or 3) of size N^D, containing a set of fractally-distributed 1.
  5. %   The size N must be a power of 2. C is obtained by iteratively dividing
  6. %   an initial set filled with 1 into 2^D subsets, multiplying each by 0
  7. %   with probability P (with 0<P<1). The resulting array has a fractal
  8. %   dimension DF = D + log(P)/log(2) < D.
  9. %
  10. %   If the second and third input arguments are not specified, N=256 and
  11. %   D=2 are taken by default (i.e. returns an array of size 256x256).
  12. %
  13. %   C = RANDCANTOR(P,N,D,'show') also displays the set (only for 1D and
  14. %   2D). If no output argument, this option is selected by default.
  15. %
  16. %   Example:
  17. %     c = randcantor(0.7, 1024, 2);
  18. %     boxcount(c);
  19. %
  20. %   F. Moisy
  21. %   Revision: 2.00,  Date: 2006/11/22
  22. % History:
  23. % 2001/02/26: v1.00, first version, boxdiv1.
  24. % 2006/11/22: v2.00, joined boxdiv1,2,3.
  25. error(nargchk(1,4,nargin));
  26. if nargin==1
  27.     n = 256;
  28.     d = 2;
  29. elseif nargin==2
  30.     d = 2;
  31. end
  32. switch d
  33.     case 1, c = boxdiv1(true(1,n),p);
  34.     case 2, c = boxdiv2(true(n,n),p);
  35.     case 3, c = boxdiv3(true(n,n,n),p);
  36.     otherwise, error('Dimension should be 1, 2, or 3.');
  37. end
  38. if nargout==0 || any(strncmpi(varargin,'show',1))
  39.     switch d
  40.         case 1
  41.             imagesc(~c);
  42.             set(gca,'PlotBoxAspectRatio',[40 1 1]);
  43.             set(gca,'TickLength',[0 0]);
  44.             set(gca,'YTick',[]);
  45.             colormap gray
  46.         case 2
  47.             imagesc(~c);
  48.             axis image
  49.             colormap gray
  50.         case 3
  51.             warning('No display of 3D sets. Use the syntax C = BOXDIV(...)');
  52.     end
  53. end;
  54. if nargout==0
  55.     clear c
  56. end
  57. % -----------------------  1D boxdiv ------------------------------ %
  58. function c=boxdiv1(c,p)
  59. siz = length(c);
  60. if siz==1
  61.     c=true;
  62. else
  63.     siz2 = round(siz/2);
  64.     % sub-line left
  65.     c(1:siz2) = c(1:siz2) & (rand<p);
  66.     if c(1)
  67.         c(1:siz2) = boxdiv1(c(1:siz2),p);
  68.     end
  69.     % sub-line right
  70.     c((1+siz2):siz) = c((1+siz2):siz) & (rand<p);
  71.     if c(1+siz2)
  72.         c((1+siz2):siz) = boxdiv1(c((1+siz2):siz),p);
  73.     end
  74. end
  75. % -----------------------  2D boxdiv ------------------------------ %
  76. function c=boxdiv2(c, p)
  77. siz = length(c);
  78. if siz==1
  79.     c=true;
  80. else
  81.     siz2 = round(siz/2);
  82.     % sub-square top-left
  83.     c(1:siz2, 1:siz2) = c(1:siz2, 1:siz2) & (rand<p);
  84.     if c(1,1)
  85.         c(1:siz2,1:siz2) = boxdiv2(c(1:siz2,1:siz2),p);
  86.     end
  87.     % sub-square top-right
  88.     c((1+siz2):siz,1:siz2) = c((1+siz2):siz,1:siz2) & (rand<p);
  89.     if c(1+siz2,1)
  90.         c((1+siz2):siz,1:siz2) = boxdiv2(c((1+siz2):siz,1:siz2),p);
  91.     end
  92.     % sub-square bottom-left
  93.     c(1:siz2,(1+siz2):siz) = c(1:siz2,(1+siz2):siz) & (rand<p);
  94.     if c(1,1+siz2)
  95.         c(1:siz2,(1+siz2):siz) = boxdiv2(c(1:siz2,(1+siz2):siz),p);
  96.     end
  97.     % sub-square bottom-right
  98.     c((1+siz2):siz,(1+siz2):siz) = c((1+siz2):siz,(1+siz2):siz) & (rand<p);
  99.     if c(1+siz2,1+siz2)
  100.         c((1+siz2):siz,(1+siz2):siz) = boxdiv2(c((1+siz2):siz,(1+siz2):siz),p);
  101.     end
  102. end
  103. % -----------------------  3D boxdiv ------------------------------ %
  104. function c=boxdiv3(c,p)
  105. siz = length(c);
  106. if siz==1
  107.     c=true;
  108. else
  109.     siz2 = round(siz/2);
  110.     % sub-cube top-left  front
  111.     c(1:siz2,1:siz2,1:siz2) = c(1:siz2,1:siz2,1:siz2) & (rand<p);
  112.     if c(1,1,1)
  113.         c(1:siz2,1:siz2,1:siz2) = boxdiv3(c(1:siz2,1:siz2,1:siz2),p);
  114.     end
  115.     % sub-cube top-right  front
  116.     c((1+siz2):siz,1:siz2,1:siz2) = c((1+siz2):siz,1:siz2,1:siz2) & (rand<p);
  117.     if c(1+siz2,1,1)
  118.         c((1+siz2):siz,1:siz2,1:siz2) = boxdiv3(c((1+siz2):siz,1:siz2,1:siz2),p);
  119.     end
  120.     % sub-cube bottom-left  front
  121.     c(1:siz2,(1+siz2):siz,1:siz2) = c(1:siz2,(1+siz2):siz,1:siz2) & (rand<p);
  122.     if c(1,1+siz2,1)
  123.         c(1:siz2,(1+siz2):siz,1:siz2) = boxdiv3(c(1:siz2,(1+siz2):siz,1:siz2),p);
  124.     end
  125.     % sub-cube bottom-right  front
  126.     c((1+siz2):siz,(1+siz2):siz,1:siz2) = c((1+siz2):siz,(1+siz2):siz,1:siz2) & (rand<p);
  127.     if c(1+siz2,1+siz2,1)
  128.         c((1+siz2):siz,(1+siz2):siz,1:siz2) = boxdiv3(c((1+siz2):siz,(1+siz2):siz,1:siz2),p);
  129.     end
  130.     % sub-cube top-left  bottom
  131.     c(1:siz2,1:siz2,(1+siz2):siz) = c(1:siz2,1:siz2,(1+siz2):siz) & (rand<p);
  132.     if c(1,1,1+siz2)
  133.         c(1:siz2,1:siz2,(1+siz2):siz) = boxdiv3(c(1:siz2,1:siz2,(1+siz2):siz),p);
  134.     end
  135.     % sub-cube top-right  bottom
  136.     c((1+siz2):siz,1:siz2,(1+siz2):siz) = c((1+siz2):siz,1:siz2,(1+siz2):siz) & (rand<p);
  137.     if c(1+siz2,1,1+siz2)
  138.         c((1+siz2):siz,1:siz2,(1+siz2):siz) = boxdiv3(c((1+siz2):siz,1:siz2,(1+siz2):siz),p);
  139.     end
  140.     % sub-cube bottom-left  bottom
  141.     c(1:siz2,(1+siz2):siz,(1+siz2):siz) = c(1:siz2,(1+siz2):siz,(1+siz2):siz) & (rand<p);
  142.     if c(1,1+siz2,1+siz2)
  143.         c(1:siz2,(1+siz2):siz,(1+siz2):siz) = boxdiv3(c(1:siz2,(1+siz2):siz,(1+siz2):siz),p);
  144.     end
  145.     % sub-cube bottom-right  bottom
  146.     c((1+siz2):siz,(1+siz2):siz,(1+siz2):siz) = c((1+siz2):siz,(1+siz2):siz,(1+siz2):siz) & (rand<p);
  147.     if c(1+siz2,1+siz2,1+siz2)
  148.         c((1+siz2):siz,(1+siz2):siz,(1+siz2):siz) = boxdiv3(c((1+siz2):siz,(1+siz2):siz,(1+siz2):siz),p);
  149.     end
  150. end