好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

如何用数学软件画一个“圣诞树”?

可以是字符的,也可以是图形的

相关问题如何用C语言画一个“圣诞树”? - 编程

回复内容: 我只是搬运 http:// codegolf.stackexchange测试数据 上的答案,原作者是Silvia (@Silvia ),用的是Mathematica。

 PD = .5;
s[t_, f_] := t^.6 - f
dt[cl_, ps_, sg_, hf_, dp_, f_, flag_] :=
    Module[{sv, basePt},
           {PointSize[ps],
            sv = s[t, f];
            Hue[cl (1 + Sin[.02 t])/2, 1, .3 + sg .3 Sin[hf sv]],
            basePt = {-sg s[t, f] Sin[sv], -sg s[t, f] Cos[sv], dp + sv};
            Point[basePt],
           If[flag,
              {Hue[cl (1 + Sin[.1 t])/2, 1, .6 + sg .4 Sin[hf sv]], PointSize[RandomReal[.01]],
               Point[basePt + 1/2 RotationTransform[20 sv, {-Cos[sv], Sin[sv], 0}][{Sin[sv], Cos[sv], 0}]]},
              {}]
          }]

frames = ParallelTable[
                       Graphics3D[Table[{
                                         dt[1, .01, -1, 1, 0, f, True], dt[.45, .01, 1, 1, 0, f, True],
                                         dt[1, .005, -1, 4, .2, f, False], dt[.45, .005, 1, 4, .2, f, False]},
                                        {t, 0, 200, PD}],
                                  ViewPoint -> Left, BoxRatios -> {1, 1, 1.3}, 
                                  ViewVertical -> {0, 0, -1},
                                  ViewCenter -> {{0.5, 0.5, 0.5}, {0.5, 0.55}}, Boxed -> False,
                                  PlotRange -> {{-20, 20}, {-20, 20}, {0, 20}}, Background -> Black],
                       {f, 0, 1, .01}];

Export["tree.gif", frames]
  
Mathematica版本:
打开一个notebook,然后长按CTRL+/,效果如下:
像不像一棵圣诞树呢? 像不像一棵圣诞树呢? 这里 有用SAS画的圣诞树,翻译成了Mathematica版的

 Clear["`*"];
ifs[prob_,A_,init_,max_]:=FoldList[#2.{#[[1]],#[[2]],1}&,init,RandomChoice[prob->A,max]];

L={{{0.03,0},{0,0.1}},{{0.85,0},{0,0.85}},{{0.8,0},{0,0.8}},{{0.2,-0.08},{0.15,0.22}},{{-0.2,0.08},{0.15,0.22}},{{0.25,-0.1},{0.12,0.25}},{{-0.2,0.1},{0.12,0.2}}};
B=Map[List,{{0,0},{0,1.5},{0,1.5},{0,0.85},{0,0.85},{0,0.3},{0,0.4}},{2}];

{A,prob,init,max}={N@Join[L,B,3],{2,60,10,7,7,7,7}/100.,{0.,2.},10^5};
pts=ifs[prob,A,init,max];//AbsoluteTiming
Graphics[{{Darker@Green,PointSize@Tiny,Point@pts},{Hue@Random[],PointSize@Large,Point@#}&/@RandomChoice[pts,200]},AspectRatio->1.5]
  
去年用R画了圣诞树送给教定量入门的教授,改了一下Wiekvoet: Merry Christmas的代码。
( 今年直接手动涂色送happy spring的卡片了,不是程序媛搞不出酷炫的东西好桑心) Wolfram Mathematica 算数学软件吧?


还有这个:


算不算抖机灵 = = 鸡汁的我
MATLAB ,名副其实的数学软件。
参考 参考 File Exchange
by Anselm Ivanovas
====================================
%

  function   christmas 
 % Anselm Ivanovas, anselm.ivanovas@student.unisg.ch 
 %Basically just a nice plot for some christmas fun. 
 %3D Plot of a hhristmas tree with some presents and snow 
 %% setup 
 snow  =  800  ;   % number of snow flakes [0 .. 5000] 

 %% draw tree 
 h  =  0  :  0.2  :  25  ;   %vertical grid 
 [  X  ,  Y  ,  Z  ]   =   cylinder  (  tree  (  h  ));   %produce a tree formed cylinder 
 Z  =  Z  *  25  ;   %scale to the right heigth 
 %add some diffusion to the surface of the tree to make it look more real 
 treeDiffusion  =  rand  (  126  ,  21  )  -  0.5  ;  %some horizontal diffusion data 
 %add diffusion to the grid points 
 for   cnt1  =  1  :  21 

 for   cnt2  =  16  :  126  %starting above the trunk 
 %get the angle to always diffuse in direction of the radius 
 angle  =  atan  (  Y  (  cnt2  ,  cnt1  )  /  X  (  cnt2  ,  cnt1  )); 
 %split the diffusion in the two coordinates, depending on the angle 
 X  (  cnt2  ,  cnt1  )=  X  (  cnt2  ,  cnt1  )  +  cos  (  angle  )  *  treeDiffusion  (  cnt2  ,  cnt1  ); 
 Y  (  cnt2  ,  cnt1  )=  Y  (  cnt2  ,  cnt1  )  +  sin  (  angle  )  *  treeDiffusion  (  cnt2  ,  cnt1  ); 
 %some Vertical diffusion for each point 
 Z  (  cnt2  ,  cnt1  )=  Z  (  cnt2  ,  cnt1  )  +  (  rand  -  0.5  )  *  0.5  ; 
 end 

 end 
 %draw the tree 
 surfl  (  X  ,  Y  ,  Z  ,  'light'  ) 
 %% View and format 
 %Use as nice green color map (darker at the bottom, lighter at the top) 
 r  =(  0.0430  :(  0.2061  /  50  ):  0.2491  )  '  ;  %red component 
 g  =(  0.2969  :(  0.4012  /  50  ):  0.6981  )  '  ;  %green component 
 b  =(  0.0625  :(  0.2696  /  50  ):  0.3321  )  '  ;  %blue component 
 map  =[  r  ,  g  ,  b  ];  %join in a map 
 for   cnt  =  1  :  6 
 %change the lower part to brown for the trunk 
 map  (  cnt  ,:)=[  77  ,  63  ,  5  ]  /  265  ; 
 end 
 colormap  (  map  )  %set the map 
 view  ([  -  37.5  ,  4  ])  %Change the view to see a little more of the Actual 3D tree 
 lighting   phong   %some nice lighting 
 shading   interp   %remove grid and smoothen the surface color 
 axis   equal   %takes care of display in the right proportion 
 axis  ([  -  10   10   -  10   10   0   30  ])   %give some more axis space (for the snow later) 
 axis   off   %but don't show axis 
 hold   on   %to draw the rest 
 title  (  'Merry Christmas 知乎er'  )  %self explaining 
 %% Presents 
 %Draw some presents around the tree (each with random color) 
 drawPresent  (  2  ,  -  4  ,  0  ,  3  ,  3  ,  2  ); 
 drawPresent  (  -  4  ,  3  ,  0  ,  2  ,  3  ,  1.5  ); 
 drawPresent  (  5  ,  3  ,  0  ,  4  ,  3  ,  3  ); 
 drawPresent  (  -  14  ,  -  5  ,  0  ,  6  ,  3  ,  1  ); 
 drawPresent  (  -  9  ,  -  10  ,  0  ,  2  ,  2  ,  2  ); 
 drawPresent  (  0  ,  4  ,  0  ,  4  ,  3  ,  3  ); 
 drawPresent  (  -  6  ,  -  13  ,  0  ,  3  ,  3  ,  3  ); 
 %% Snow 
 %create some random 3D coordinates for the snow (amount as in setup above) 
 snowX  =(  rand  (  snow  ,  1  )  *  25  -  12.5  ); 
 snowY  =(  rand  (  snow  ,  1  )  *  25  -  12.5  ); 
 snowZ  =(  rand  (  snow  ,  1  )  *  27  ); 
 %Note:Some flakes will end up IN the tree but just can't be seen then 
 plot3  (  snowX  ,  snowY  ,  snowZ  ,  'w*'  )  %plot coordinates as white snow flakes 
 hold   off  %Done 
 end   % of function 

 %% ============= private functions 
 function    r =  tree  ( h )  %Gives a profile for the tree 
 for   cnt  =  1  :  length  (  h  ) 

 if  (  h  (  cnt  )  ==  0  )  %no Width at the bottom. Ensures a "closed" trunk 
 r  (  cnt  )=  0  ; 
 end 
 %smaller radius for the trunk 
 if   (  h  (  cnt  )  >  0   &&   h  (  cnt  )    =  3  ) 
 r  (  cnt  )=  1.5  ; 
 end 
 %reduce radius gradually from 8 to 0. Note: will only work with a trunk heigth 
 %of 3 and a whole tree heigth of 25. Scale the height of the tree in 
 %the "draw tree" section, since the cylinder command will return a 1 
 %unit high cylinder anyway 
 if  (  h  (  cnt  )  >  3  ) 
 r  (  cnt  )=  8  -  (  h  (  cnt  )  -  3  )  *  0.3636  ; 
 end 
 end 
 end   % of function 
 %Draws a present with the given coordinate + size in a random color 
 %Note:Given coordinates apply to the lower front + left corner of the 
 %present (the one closest to the viewer) as seen in the plot 
 function     drawPresent  ( dx,dy,dz,scalex,scaley,scalez )   
 %the standard present coordinates 
 presentX  =[  0.5   0.5   0.5   0.5   0.5  ;   0   1   1   0   0  ;   0   1   1   0   0  ;   0   1   1   0   0  ;   0.5   0.5   0.5   0.5   0.5  ]; 
 presentY  =[  0.5   0.5   0.5   0.5   0.5  ;   0   0   1   1   0  ;   0   0   1   1   0  ;   0   0   1   1   0  ;   0.5   0.5   0.5   0.5   0.5  ]; 
 presentZ  =[  0   0   0   0   0  ;   0   0   0   0   0  ;   0.5   0.5   0.5   0.5   0.5  ;   1   1   1   1   1  ;   1   1   1   1   1  ]; 
 %draw some presents with random colors 
 %scale present and move it to the right place and get the plot handle 
 myHandle  =  surf  ((  presentX  *  scalex  +  dx  ),(  presentY  *  scaley  +  dy  ),   (  presentZ  *  scalez  +  dz  )); 
 %some random color map 
 randColorMap  (:,:,  1  )=  repmat  (  rand  ,[  5  ,  5  ]);  %r component 
 randColorMap  (:,:,  2  )=  repmat  (  rand  ,[  5  ,  5  ]);  %g component 
 randColorMap  (:,:,  3  )=  repmat  (  rand  ,[  5  ,  5  ]);  %b component 
 %Assign colormap just to the plot handle object of the present, so the tree 
 %does not change color 
 set  (  myHandle  ,  'CData'  ,  randColorMap  ) 
 shading   interp   %Nice shding + without grid 
 end   % of function 
  
Christmas Tree
R语言 能画,但是这种比较有什么意义呢..................................


  L  
     c(0.03,  0,     0  ,  0.1, 
         0.85,  0.00,  0.00, 0.85, 
         0.8,   0.00,  0.00, 0.8, 
         0.2,  -0.08,  0.15, 0.22, 
         -0.2,   0.08,  0.15, 0.22, 
         0.25, -0.1,   0.12, 0.25, 
         -0.2,   0.1,   0.12, 0.2), 
     nrow=4) 
 # ... and each row is a translation vector 
 B  
     c(0, 0, 
         0, 1.5, 
         0, 1.5, 
         0, 0.85, 
         0, 0.85, 
         0, 0.3, 
         0, 0.4), 
     nrow=2) 

 prob = c(0.02, 0.6,.08, 0.07, 0.07, 0.07, 0.07) 

 # Iterate the discrete stochastic map  
 N = 1e5 #5  #   number of iterations  
 x = matrix(NA,nrow=2,ncol=N) 
 x[,1] = c(0,2)   # initial point 
 k  

 for (i in 2:N)  
   x[,i] = crossprod(matrix(L[,k[i]],nrow=2),x[,i-1]) + B[,k[i]] # iterate  

 # Plot the iteration history  
 png('card.png') 
 par(bg='darkblue',mar=rep(0,4))     
 plot(x=x[1,],y=x[2,], 
     col=grep('green',colors(),value=TRUE), 
     axes=FALSE, 
     cex=.1, 
     xlab='', 
     ylab='' )#,pch='.') 

 bals  
 points(x=x[1,bals],y=x[2,bals]-.1, 
     col=c('red','blue','yellow','orange'), 
     cex=2, 
     pch=19 
 ) 
 text(x=-.7,y=8, 
     labels='Merry', 
     adj=c(.5,.5), 
     srt=45, 
     vfont=c('script','plain'), 
     cex=3, 
     col='gold' 
 ) 
 text(x=0.7,y=8, 
     labels='Christmas', 
     adj=c(.5,.5), 
     srt=-45, 
     vfont=c('script','plain'), 
     cex=3, 
     col='gold' 
 ) 
 dev.off() 
  

查看更多关于如何用数学软件画一个“圣诞树”?的详细内容...

  阅读:42次