matlab实现的樱花林

看了一些博主用python写了樱花的程序,自己也实践了一下,画了片樱花林出来。当我分享给朋友看时,他问我能不能用Matlab实现。然后就有了下面的结果:

function [x,y,A,nxy]=shuzhi(A1,A0,x0,y0,h,xy)
%本函数用于取点
AR = deg2rad(A1+A0);
x =x0+h.*sin(AR);
y = y0+h.*cos(AR);
A = rad2deg(AR);
%检测输出
xx=xy(1,:);yy=xy(2,:);
COS = (x-x0).*(x0-xx)+(y-y0).*(y0-yy);
zb = find(COS<0);
if isempty(zb)==0
    x(zb) = x0(zb)+h(zb).*sin(AR(zb));   
    y(zb) = y0(zb)+h(zb).*cos(AR(zb));
end
nxy = [x0;y0];

上述代码用于返回每个树枝结点坐标,并且保证相连两个树枝的向量夹角大于0度小于90度

function B = jzfz(A)
[a,b]=size(A);
B = zeros(a,2*b); 
for i = 1:b
    B(:,2*i-1)=A(:,i);
    B(:,2*i)=A(:,i);
end

用于矩阵列复制,复制结果如下
jzfz函数的效果

function yhs(x0,y0,h)
A0 = 0;A1 = 0;xy=[x0;y0];
set(gcf,'color',[245,222,179]./255)
[x,y,A,nxy]=shuzhi(A1,A0,x0,y0,h,xy);
s = plot([x0,x],[y0,y],'r','LineWidth',h/10);
s.Color=[160,82,45]/255;s;
lr = [20,-20];i=1;H=h;
%颜色
sienna = [160,82,45]/255;lightcoral = [240,128,128]/255;
snow = [255,250,250]/255;
while H>3
    AA1 = 1.5.*rand(1,2^(i-1));
    AA2 = 1.5.*rand(1,2^(i-1));
    AA1 = jzfz(AA1);
    A1 = AA1.*lr;
    A0 = jzfz(A);x0 = jzfz(x);y0 = jzfz(y);
    h = h - 10*AA2;sr = find(h<0);
    h(sr)=0;
    h=jzfz(h);xy=jzfz(nxy);
    [x,y,A,nxy]=shuzhi(A1,A0,x0,y0,h,xy);
    for j = 1:length(x)
        if h(j) > 3
            if 8 <= h(j) && h(j)<= 12
                 if randi([0,2]) == 0
                     hold on
                     s = plot([x0(j),x(j)],[y0(j),y(j)],'r','LineWidth',h(j)/3);
                     s.Color=snow;s;continue
                 else
                     hold on
                     s = plot([x0(j),x(j)],[y0(j),y(j)],'r','LineWidth',h(j)/3);
                     s.Color=lightcoral;s;continue
                 end
            elseif h(j)<8
                if randi([0,1]) == 0
                     hold on
                     s = plot([x0(j),x(j)],[y0(j),y(j)],'r','LineWidth',h(j)/2);
                     s.Color=snow;s;continue
                 else
                     hold on
                     s = plot([x0(j),x(j)],[y0(j),y(j)],'r','LineWidth',h(j)/2);
                     s.Color=lightcoral;s;continue
                end
            else
                hold on
                s = plot([x0(j),x(j)],[y0(j),y(j)],'r','LineWidth',h(j)/10);
                s.Color=sienna;s;continue
            end
        end
    end
    lr=[lr,lr];i=i+1;H=max(h);
end
axis off
axis equal
axis([-600,600,-300,450]);

输入根节点和第一个枝干长度,绘出一棵樱花树图,这里建议根节点坐标位于x属于(-600,600)y属于(-300,-200)间,树枝长度位于50到80(树枝长度太大会导致运行特别慢,使电脑变卡,弱弱说一句我试过将树枝长度设置为100,然后我电脑变卡,最后强制关机了,树枝长度较小的话,图画效果不好)。
下面这句代码自接在命令行窗口使用就会得到如下的这棵樱花树。

yhs(0,-270,72)

在这里插入图片描述

clc,clear,clf
for i=1:7
    clear
    x = randi([-500,500]);
    y = randi([-300,-240]);
    h = 30-0.5*(y+210);
    yhs(x,y,h)
end
hold on
lightcoral = [240,128,128]/255;
s = randi([-600,600],1,1000);
t = randi([-300,-220],1,1000);
v = plot(s,t,'.r','LineWidth',7);
v.Color=lightcoral;s;
axis off
axis equal
axis([-600,650,-300,450]);

这里就是调用前一个函数绘制樱花林:在这里插入图片描述
这里把图窗打开为全屏的效果较好。运行这张图可能需要30秒左右,
如果遇到长时间(大于1分钟吧)没运行出来,你就点一下命令行窗口,按下ctrl+c这个组合键就可以强制停止了。
有些算法不是特别好,运行较慢,请多指教

  • 35
    点赞
  • 139
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值