如何在mathematica中生成平面Cantor集的图

时间:2011-07-08 22:47:24

标签: wolfram-mathematica

我想知道是否有人可以帮我在Mathematica的飞机上绘制Cantor dust。这与Cantor set

相关联

非常感谢。

修改

我其实想要这样的东西:

enter image description here

3 个答案:

答案 0 :(得分:5)

这是一种天真的,可能不是非常优化的再现ternary Cantor set construction图形的方式:

cantorRule = Line[{{a_, n_}, {b_, n_}}] :> 
  With[{d = b - a, np = n - .1}, 
       {Line[{{a, np}, {a + d/3, np}}], Line[{{b - d/3, np}, {b, np}}]}]

Graphics[{CapForm["Butt"], Thickness[.05], 
  Flatten@NestList[#/.cantorRule&, Line[{{0., 0}, {1., 0}}], 6]}]

Ternary Cantor set

要使Cantor dust使用相同的替换规则,我们会将结果设置为特定级别,例如4:

dust4=Flatten@Nest[#/.cantorRule&,Line[{{0.,0},{1.,0}}],4]/.Line[{{a_,_},{b_,_}}]:>{a,b}

并使用它的元组

dust4 = Transpose /@ Tuples[dust4, 2];

然后我们只绘制矩形

Graphics[Rectangle @@@ dust4]

enter image description here


编辑:Cantor dust + squares

更改了规格 - >新的,但相似的解决方案(仍未优化) 将n设置为正整数,并选择1,...,n的任何子集,然后

n = 3; choice = {1, 3};
CanDChoice = c:CanD[__]/;Length[c]===n :> CanD[c[[choice]]];
splitRange = {a_, b_} :> With[{d = (b - a + 0.)/n}, 
                              CanD@@NestList[# + d &, {a, a + d}, n - 1]];

cantLevToRect[lev_]:=Rectangle@@@(Transpose/@Tuples[{lev}/.CanD->Sequence,2])

dust = NestList[# /. CanDChoice /. splitRange &, {0, 1}, 4] // Rest;

Graphics[{FaceForm[LightGray], EdgeForm[Black], 
  Table[cantLevToRect[lev], {lev, Most@dust}], 
  FaceForm[Black], cantLevToRect[Last@dust /. CanDChoice]}]

more dust

这是

的图形
n = 7; choice = {1, 2, 4, 6, 7};
dust = NestList[# /. CanDChoice /. splitRange &, {0, 1}, 2] // Rest;

以及其他一切相同:

enter image description here

答案 1 :(得分:3)

一旦可以使用以下方法。定义cantor函数:

cantorF[r:(0|1)] = r;
cantorF[r_Rational /; 0 < r < 1] := 
 Module[{digs, scale}, {digs, scale} = RealDigits[r, 3];
  If[! FreeQ[digs, 1], 
   digs = Append[TakeWhile[Most[digs]~Join~Last[digs], # != 1 &], 1];];
  FromDigits[{digs, scale}, 2]]

然后通过计算F[n/3^k]-F[(n+1/2)/3^k]

的差异来形成尘埃
With[{k = 4}, 
  Outer[Times, #, #] &[
   Table[(cantorF[(n + 1/2)/3^k] - cantorF[(n)/3^k]), {n, 0, 
     3^k - 1}]]] // ArrayPlot

enter image description here

答案 2 :(得分:1)

我喜欢递归函数,所以

cantor[size_, n_][pt_] :=
  With[{s = size/3, ct = cantor[size/3, n - 1]},
    {ct[pt], ct[pt + {2 s, 0}], ct[pt + {0, 2 s}], ct[pt + {2 s, 2 s}]}
  ]

cantor[size_, 0][pt_] := Rectangle[pt, pt + {size, size}]

drawCantor[n_] := Graphics[cantor[1, n][{0, 0}]]

drawCantor[5]

说明:size是集合适合的正方形的边长。 pt是左下角的{x,y}坐标。