|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 helendcany 于 2020-7-30 10:39 编辑
8 \ J) H: w" l* H: [
' m8 w3 a5 E9 W/ t万花尺的动态模拟程序
. T& r: j. k) C G4 A3 |7 {9 d
6 d8 A; x6 g9 r& L! `7 T7 D" ~萬花尺原理:- G: O' X" ]1 x) |- S. C8 o
萬花尺有著一個普遍的公式,即
。其中,R為大圓半徑,r為小圓半徑。若這樣的k 和M存在,則稱為k圈M花尺。其中k為小圓圓心繞大圓圓心轉過的圈數,M為花瓣的個數。! [8 I% W. \ o0 @
- function flowers(a,b,r,mode,N,gifname)
- %万花尺程序
- %input -a 大圆半径 -b 小圆半径 -r 画笔距小圆圆心的距离
- % -mode :非0 表示小圆沿大圆内侧转动
- % 0 表示小圆沿大圆外侧转动
- % a = 4;b = 1.2;mode =1;r = b;%10花尺
- % a = 4;b = 2;mode =1;r = 3;%2花尺
- % a = 4;b = 1;mode =1;r = b;%4花尺
- % a = 4;b = 1.5;mode =1;r = b;%8花尺
- % a = 4;b = 0.75;mode =1;r = b;%16花尺
- % a = 4;b = 8/3;mode =1;r = b;%6花尺
- % a = 4;b = 8/9;mode =1;r = b;%9花尺
- % a = 4;b = 4/3;mode =1;r = b/2;%3花尺
- % a = 4;b = 1;mode =1;r = b/2;%4花尺
- % a = 4;b = 2;mode =1;r = b;%2花尺
- if nargin < 3,r = b;end
- if nargin < 4 || mode,mode = -1;else mode = 1;end
- if nargin < 5,N = 10;end
- if nargin < 6,gifname = 'flowers.gif';end
- [k,m] = cylnumber(a,b,N);
- t = 0:pi/200:2*k*pi;
- tt = 0:pi/200:2*pi;
- x1 = a+mode*b;
- xx = a*cos(tt); yy = a*sin(tt);
- plot(xx,yy);
- xm = a+abs(abs(r)+mode*b);
- axis equal off
- title([num2str(m),'花尺'])
- %设置颜色、标记、标记尺寸、擦除模式
- h = line('Color','k','Marker','*',...
- 'MarkerSize',1,'EraseMode','xor');
- h2 = line('Color','k','Marker','.',...
- 'MarkerSize',8,'EraseMode','xor');
- h1 = line('Color','r','Marker','.',...
- 'MarkerSize',20,'EraseMode','xor');
- n = length(t);
- if mode == -1,nk = n:-1:1;else nk = 1:n;end
- for k = 1:n
- x = x1*cos(t(k))+r*cos(x1/b*t(nk(k)));
- y = x1*sin(t(k))+r*sin(x1/b*t(nk(k)));
- x2 = x1*cos(t); y2 = x1*sin(t);
- x3 = x2(k)+b*cos(tt); y3 = y2(k)+b*sin(tt);
- hold on
- set(h,'xdata',x3,'ydata',y3); %画图、画线设置
- plot(x,y,'r.');
- set(h2,'xdata',[x x2(k)],'ydata',[y y2(k)]);
- set(h1,'xdata',[x x],'ydata',[y y]);
- axis([-xm,xm,-xm,xm]);
- try
- f = getframe;
- imind = frame2im(f); %将单帧图像转化为RGB图像
- [imind,cm] = rgb2ind(imind,256);
- if k ~= 1
- imwrite(imind,cm,gifname,'gif','WriteMode','append','DelayTime',.05)
- else
- imwrite(imind,cm,gifname,'gif','Loopcount',inf,'DelayTime',.05)
- end
- end
- pause(0.00001)
- end
- function [k,m] = cylnumber(a,b,N)
- k = 1;
- m = a/b;
- while rem(m,1) && k < N
- k = k + 1;
- m = k*a/b;
- end2 O% l" `( j" n {
v6 ^. [0 |* ?9 B- e% P1 Q5 u4 M
; N" ?2 i" g; a3 _) W
! g |9 f8 A0 D( i* V
3 K. a3 C0 i M! w. y/ P0 g5 G; l+ T2 W- Z3 V
|
|