看了一些博主用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
用于矩阵列复制,复制结果如下
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这个组合键就可以强制停止了。
有些算法不是特别好,运行较慢,请多指教