как да генерирам графика на равнинен набор на Кантор в mathematica

Чудя се дали някой може да ми помогне да начертая Прах на Кантор в самолета в Mathematica. Това е свързано с набора на Cantor.

Благодаря много.

РЕДАКТИРАНЕ

Всъщност исках да имам нещо подобно:

въведете описание на изображението тук


person Qiang Li    schedule 08.07.2011    source източник


Отговори (3)


Ето един наивен и вероятно не много оптимизиран начин за възпроизвеждане на графиките за строителство на троен набор на Кантор:

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]

въведете описание на изображението тук


Редактиране: Cantor прах + квадратчета

Променени спецификации -> Ново, но подобно решение (все още не е оптимизирано).
Задайте 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]}]

още прах

Ето графиките за

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

и всичко останало същото:

въведете описание на изображението тук

person Simon    schedule 09.07.2011
comment
+1 и благодаря. Всъщност исках да имам сюжет като този, който приложих тук. Бихте ли помогнали с това? Изглежда по-трудно да се получи такъв сюжет. - person Qiang Li; 09.07.2011
comment
Благодаря много. Имам нужда от обяснение тук. Първо, мисля, че np = n - .1 трябва да бъде np = n - 1, нали? Просто сте озадачени защо кодът все още дава правилните резултати? Също какво ще кажете за този ред cantorRule = {CanD[x_,y_,z_]:>(CanD[x,z]/.cantorRule), {a_,b_}:>With[{d=(b-a)/3.},CanD@@NestList[#+d&,{a,a+d},2]]};? Не мога да разбера напълно... - person Qiang Li; 11.07.2011
comment
@QiangLi: np=n-.1 беше само за правилното разстояние на оста y в първото изображение. Тези термини се изхвърлят във второто изображение - и се използва различно правило за генериране на 3-то изображение. - person Simon; 11.07.2011
comment
@QiangLi: Що се отнася до последното cantorRule, то прави две неща. Вторият член взема двойка x-координати и връща последователност, която я разделя на 3 равни части. Те се използват за изчертаване на празните квадратчета. Първото правило след това взема тези три части и изхвърля средния член - това е, което спира цялото нещо да бъде равномерно запълнено с квадрати. Обърнете внимание, че в командата Graphics трябва ръчно да изхвърля средния член, когато чертая последните, запълнени квадрати. - person Simon; 11.07.2011
comment
@QiangLi: Промених кода си, за да го направя по-ясен и по-гъвкав. - person Simon; 11.07.2011
comment
BTW: Същите правила и NestList могат да се използват за генериране на анимация. напр. {1,3,5} анимация. (Когато правоъгълниците станат твърде малки, те не са нарисувани много добре...) - person Simon; 11.07.2011

Същият код сега хвърля 401 сървърно изключение ... моля, помогнете на serverfault.com/questions/263375/401-exception-in-java-code
person Sasha    schedule 09.07.2011

Харесвам рекурсивните функции, така че

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} координатите на долния ляв ъгъл.

person Szabolcs    schedule 09.07.2011
comment
Хубаво и чисто +1! Също така е доста лесно да промените, за да вземете произволни модели на разделяне (анимация, генерирана от код). - person Simon; 11.07.2011