您当前的位置: 首页 >  matlab

slandarer

暂无认证

  • 0浏览

    0关注

    248博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

MATLAB 画一株会害羞的含羞草

slandarer 发布时间:2020-12-05 22:51:44 ,浏览量:0

在这里插入图片描述 鼠标在叶子或花朵处滑动就可使其收缩。 完整代码:

function mimose
t1=0:pi/100:pi+2*pi/100;
y=5*abs(sin(t1).^(1/2));
y(t1>pi)=-y(t1>pi);

t1=t1.*cos(pi/9)-y.*sin(pi/9);
y=t1.*sin(pi/9)+y.*cos(pi/9);
T=[];
Y=[];
for i=1:20
    T=[T,(i-1)*(pi+2*pi/100)+t1];
    Y=[Y,y];   
end
L=length(T);
t2=linspace(pi/8,pi-2*pi/5,L);
Y=Y.*sin(t2);

X=T.*cos(pi)-Y.*sin(pi);
Y=T.*sin(pi)+Y.*cos(pi);
X=X-min(X);

X=X.*0.8;
Y=Y.*1.5;


fig=figure('units','pixels',...
        'position',[500 100 500 500],...
        'Numbertitle','off',...
        'Color',[1 1 1],...
        'resize','off',...
        'visible','on',...
        'name','mimose',...
         'menubar','none');

ax=axes('Units','pixels',...
        'parent',fig,...  
        'Color',[0.2667    0.4039    0.2745],...
        'Position',[0 0 500 500],...
        'XLim',[0 100],...
        'YLim',[0 100],...
        'XColor',[1 1 1],...
        'YColor',[1 1 1]);
hold(ax,'on')
%plot(ax,X+20,Y+50)

drawBranch([20,0],[50,10])
drawBranch([20,0],[35,12])
drawBranch([0,0],[15,45])
drawBranch([4,0],[0,20])

leaf.l1=drawLeaf([50,10]+1.*[cos(pi/1.7),sin(pi/1.7)],pi/1.7,X,Y,0.8,1);
leaf.l2=drawLeaf([50,10]+1.*[cos(-pi/8),sin(-pi/8)],-pi/8,X,Y,0.8,1);
leaf.l3=drawLeaf([50,10]+1.*[cos(pi/12),sin(pi/12)],pi/12,X,Y,1,1);
leaf.l4=drawLeaf([50,10]+1.*[cos(pi/3),sin(pi/3)],pi/3,X,Y,1,1);
leaf.l5=drawLeaf([0,45]+1.*[cos(pi/3),sin(pi/3)],pi/3,X,Y,1,1);
leaf.l6=drawLeaf([0,30]+1.*[cos(pi/5),sin(pi/5)],pi/5,X,Y,1,1);

flower.fl1=drawFlower([35,12]);
flower.fl2=drawFlower([20,5]);

fps=25;
mitimer=timer('ExecutionMode', 'fixedRate', 'Period',1/fps, 'TimerFcn', @miMove);
start(mitimer)
    function miMove(~,~)
        for ii=1:6
            if leaf.(['l',num2str(ii)]).ratio0.6
                    flower.(['fl',num2str(ii)]).ratio=flower.(['fl',num2str(ii)]).ratio-0.2;
                end
            end
        end
    end

    function bool=closeLeaf(pos1,pos2,pos3)
        pL=pos1+(pos2-pos1).*0.1;
        pR=pos1+(pos2-pos1).*0.9;
        lTotal=norm(pL-pos3)+norm(pR-pos3);
        bool=lTotalpi);
t1=t1.*cos(pi/9)-y.*sin(pi/9);
y=t1.*sin(pi/9)+y.*cos(pi/9);

% 将多个压扁倾斜的半圆弧曲线拼接
T=[];
Y=[];
for i=1:20
    T=[T,(i-1)*(pi+2*pi/100)+t1];
    Y=[Y,y];   
end

% 乘以一个类似弧形曲线让每片小叶子不一样长
L=length(T);
t2=linspace(pi/8,pi-2*pi/5,L);
Y=Y.*sin(t2);

% 旋转并调整比例
X=T.*cos(pi)-Y.*sin(pi);
Y=T.*sin(pi)+Y.*cos(pi);
X=X-min(X);
X=X.*0.8;
Y=Y.*1.5;


% 创建figure及axes=========================================================
fig=figure('units','pixels',...
        'position',[500 100 500 500],...
        'Numbertitle','off',...
        'Color',[1 1 1],...
        'resize','off',...
        'visible','on',...
        'name','mimose',...
         'menubar','none');

ax=axes('Units','pixels',...
        'parent',fig,...  
        'Color',[0.2667    0.4039    0.2745],...
        'Position',[0 0 500 500],...
        'XLim',[0 100],...
        'YLim',[0 100],...
        'XColor',[1 1 1],...
        'YColor',[1 1 1]);
hold(ax,'on')
%plot(ax,X+20,Y+50)

% 调用后面定义的函数绘图===================================================
% 绘制树枝
drawBranch([20,0],[50,10])
drawBranch([20,0],[35,12])
drawBranch([0,0],[15,45])
drawBranch([4,0],[0,20])

% 绘制树叶
leaf.l1=drawLeaf([50,10]+1.*[cos(pi/1.7),sin(pi/1.7)],pi/1.7,X,Y,0.8,1);
leaf.l2=drawLeaf([50,10]+1.*[cos(-pi/8),sin(-pi/8)],-pi/8,X,Y,0.8,1);
leaf.l3=drawLeaf([50,10]+1.*[cos(pi/12),sin(pi/12)],pi/12,X,Y,1,1);
leaf.l4=drawLeaf([50,10]+1.*[cos(pi/3),sin(pi/3)],pi/3,X,Y,1,1);
leaf.l5=drawLeaf([0,45]+1.*[cos(pi/3),sin(pi/3)],pi/3,X,Y,1,1);
leaf.l6=drawLeaf([0,30]+1.*[cos(pi/5),sin(pi/5)],pi/5,X,Y,1,1);

% 绘制花朵
flower.fl1=drawFlower([35,12]);
flower.fl2=drawFlower([20,5]);

% 鼠标移动回调=============================================================
fps=25;
mitimer=timer('ExecutionMode', 'fixedRate', 'Period',1/fps, 'TimerFcn', @miMove);
start(mitimer)

    % 花朵树叶回缩函数
    function miMove(~,~)
        for ii=1:6
            if leaf.(['l',num2str(ii)]).ratio0.6
                    flower.(['fl',num2str(ii)]).ratio=flower.(['fl',num2str(ii)]).ratio-0.2;
                end
            end
        end
    end

    % 距离检测函数,叶子形状近乎于椭圆,当距离俩焦点和小于一定值认为足够近
    % 若足够近返回TRUE 否则返回FALSE
    function bool=closeLeaf(pos1,pos2,pos3)
        pL=pos1+(pos2-pos1).*0.1;
        pR=pos1+(pos2-pos1).*0.9;
        lTotal=norm(pL-pos3)+norm(pR-pos3);
        bool=lTotal            
关注
打赏
1664692598
查看更多评论
0.0517s