使用matlab绘制七夕表白玫瑰花束

 更新时间:2023年08月21日 10:37:55   作者:slandarer  
又是一年七夕节要到了,每年一次直男审美MATLAB绘图大赛开始了,于是今年对我之前写的老代码进行了点优化组合,整了个花球变花束,感兴趣的小伙伴可以动手试一试

Hey又是一年七夕节要到了,每年一次直男审美MATLAB绘图大赛开始,真的这些代码越写越不知道咋写,又不想每年把之前的代码翻出来再发一遍,于是今年又对我之前写的老代码进行了点优化组合,整了个花球变花束:

在此祝各位成双成对和形单影只的都七夕节快乐叭!!!

先稍微说一下原理,再去给完整代码哈。

玫瑰花

玫瑰花咋画以及怎么旋转到合适的位置可以参见这篇:

matlab实现绘制玫瑰花球的示例代码_C 语言_脚本之家 (jb51.net)

写的非常详细的,可以看的时候顺手点个赞。

周围小花

是把以下这段很简单的代码进行了微调改了改颜色啥的:

rb=0:.01:1;
tb=linspace(0,2,151);
Wb=rb'*((abs((1-mod(tb*5,2))))/2+.3);
Xb=Wb.*cospi(tb);
Yb=Wb.*sinpi(tb); 
zb=@(a)(-cospi(Wb*a)+1).^.2;
Zb=zb(1.2);
g=@(i)i(:,1:30:151)/2;
plot3(g(Xb),g(Yb),g(zb(1)*2.3),'k');
surface(Xb,Yb,Zb,'EdgeColor','none');

花杆和颜色

花杆就直接用贝塞尔曲线插了一下值,让其比较顺滑且扭转了起来,颜色的话把代码中的colorList换一下的话可以自行调整,这里给点颜色数值以供参考哈:

c1=[0.5600    0.2200    0.0300
    0.6700    0.2900    0.0500
    0.8300    0.4900    0.0900
    0.8500    0.6200    0.1300
    0.8800    0.7600    0.1300
    0.9100    0.8300    0.2000
    1.0000    0.9200    0.3100];
c2=[0.1800    0.0900    0.1800
    0.3100    0.0800    0.2400
    0.5100    0.0800    0.3400
    0.6500    0.1200    0.3500
    0.8600    0.3200    0.4500];
c3=[0.1100    0.3100    0.7500
    0.3400    0.2900    0.6800
    0.5100    0.2700    0.6400
    0.5900    0.2700    0.6200
    0.7600    0.2500    0.5700];
c4=[0.1400    0.1400    0.1400
    0.2200    0.2200    0.2200
    0.4100    0.4100    0.4100
    0.6000    0.6000    0.6000
    0.7500    0.7500    0.7500
    0.8900    0.8900    0.8900];
c5=[0.3300    0.3300    0.6900
    0.5300    0.4000    0.6800
    0.6800    0.4200    0.6300
    0.7800    0.4200    0.5700
    0.9100    0.4900    0.4700
    0.9600    0.7300    0.4400];
c6=[0.5300    0.8300    0.8100
    0.5200    0.7500    0.8200
    0.4900    0.6200    0.8400
    0.4900    0.5600    0.8400
    0.4700    0.4900    0.8500
    0.4500    0.3500    0.8700
    0.9500    0.9500    0.9500];

hiahiahia奇怪的颜色增加了:

完整代码

感觉要运行的话至少需要R17b版本(17b也不算新了最新版都是更了十几代了),要把代码改的适应更之前的版本老麻烦了。。。建议大家用点比较新的版本!!不然平白无故多写老多代码新版本还不一定用的了。

function roseBouquet
figure('Units','normalized','Position',[.2,.1,.6,.7])
%曲面数据计算 ==============================================================
% 玫瑰部分 -----------------------------------------------------------------
[xr,tr]=meshgrid((0:24)./24,(0:0.5:575)./575.*20.*pi+4*pi);
pr=(pi/2)*exp(-tr./(8*pi));
cr=sin(15*tr)/150;
ur=1-(1-mod(3.6*tr,2*pi)./pi).^4./2+cr;
yr=2*(xr.^2-xr).^2.*sin(pr);
rr=ur.*(xr.*sin(pr)+yr.*cos(pr));
hr=ur.*(xr.*cos(pr)-yr.*sin(pr));
% 百合花部分 ---------------------------------------------------------------
rb=0:.01:1;
tb=linspace(0,2,151);
wb=rb'*((abs((1-mod(tb*5,2))))/2+.3);
xb=wb.*cospi(tb);
yb=wb.*sinpi(tb); 
zb=@(a)(-cospi(wb*a)+1).^.2;
Zb=zb(1.2);
g=@(i)i(:,1:30:151)/2;
%颜色映射表 ================================================================
colorList=[0.3300    0.3300    0.6900
    0.5300    0.4000    0.6800
    0.6800    0.4200    0.6300
    0.7800    0.4200    0.5700
    0.9100    0.4900    0.4700
    0.9600    0.7300    0.4400];
% colorList=[0.9176    0.7490    0.3765
%     0.9294    0.7725    0.4902
%     0.9333    0.7451    0.5961
%     0.8902    0.6980    0.5294
%     0.8784    0.6941    0.6235
%     0.9216    0.7412    0.7529
%     0.8588    0.6039    0.7686
%     0.8510    0.4706    0.6392
%     0.7608    0.2118    0.3569];
colorMapr=setColorByH(hr,colorList);
colorMapb=setColorByH(Zb,colorList.*.4+.6);
    function cMap=setColorByH(H,cList)
        X=(H-min(min(H)))./(max(max(H))-min(min(H)));
        xx=(0:size(cList,1)-1)./(size(cList,1)-1);
        y1=cList(:,1);y2=cList(:,2);y3=cList(:,3);
        cMap(:,:,1)=interp1(xx,y1,X,'linear');
        cMap(:,:,2)=interp1(xx,y2,X,'linear');
        cMap(:,:,3)=interp1(xx,y3,X,'linear');
    end
% 旋转函数预定义 ===========================================================
yaw_z=72*pi/180;
roll_x_1=pi/8;
roll_x_2=pi/9;
R_z_2=[cos(yaw_z)  , -sin(yaw_z)  , 0; sin(yaw_z)  , cos(yaw_z)  , 0; 0, 0, 1];
R_z_1=[cos(yaw_z/2), -sin(yaw_z/2), 0; sin(yaw_z/2), cos(yaw_z/2), 0; 0, 0, 1];
R_z_3=[cos(yaw_z/3), -sin(yaw_z/3), 0; sin(yaw_z/3), cos(yaw_z/3), 0; 0, 0, 1];
R_x_1=[1, 0, 0; 0, cos(roll_x_1), -sin(roll_x_1); 0, sin(roll_x_1), cos(roll_x_1)];
R_x_2=[1, 0, 0; 0, cos(roll_x_2), -sin(roll_x_2); 0, sin(roll_x_2), cos(roll_x_2)];
    function [nX,nY,nZ]=rotateXYZ(X,Y,Z,R)
        nX=zeros(size(X)); nY=zeros(size(Y)); nZ=zeros(size(Z));
        for i=1:size(X,1)
            for j=1:size(X,2)
                v=[X(i,j);Y(i,j);Z(i,j)];
                nv=R*v; nX(i,j)=nv(1); nY(i,j)=nv(2); nZ(i,j)=nv(3);
            end
        end
    end
% 绘制花杆函数预定义 ========================================================
    function drawStraw(X,Y,Z)
        [m,n]=find(Z==min(min(Z)));
        m=m(1);n=n(1);
        x1=X(m,n);y1=Y(m,n);z1=Z(m,n)+.03;
        xx=[x1,0,(x1.*cos(pi/3)-y1.*sin(pi/3))./3].';
        yy=[y1,0,(y1.*cos(pi/3)+x1.*sin(pi/3))./3].';
        zz=[z1,-.7,-1.5].';
        strawPnts=bezierCurve([xx,yy,zz],50);
        plot3(strawPnts(:,1),strawPnts(:,2),strawPnts(:,3),'Color',[88,130,126]./255,'LineWidth',2)
    end
% 贝塞尔函数 ---------------------------------------------------------------
    function pnts=bezierCurve(pnts,N)
        t=linspace(0,1,N);
        p=size(pnts,1)-1;
        coe1=factorial(p)./factorial(0:p)./factorial(p:-1:0);
        coe2=((t).^((0:p)')).*((1-t).^((p:-1:0)'));
        pnts=(pnts'*(coe1'.*coe2))';
    end
%曲面旋转及绘制 ============================================================
hold on
surface(rr.*cos(tr),rr.*sin(tr),hr+0.35,'EdgeAlpha',0.05,...
    'EdgeColor',[0 0 0],'FaceColor','interp','CData',colorMapr,'Tag','slandarer')
[nXr,nYr,nZr]=rotateXYZ(rr.*cos(tr),rr.*sin(tr),hr+0.35,R_x_1);
nYr=nYr-.4;
surface(nXr,nYr,nZr-.1,'EdgeAlpha',0.05,...
'EdgeColor',[0 0 0],'FaceColor','interp','CData',colorMapr)
drawStraw(nXr,nYr,nZr-.1)
for k=1:4
    [nXr,nYr,nZr]=rotateXYZ(nXr,nYr,nZr,R_z_2);
    surface(nXr,nYr,nZr-.1,'EdgeAlpha',0.05,...
    'EdgeColor',[0 0 0],'FaceColor','interp','CData',colorMapr)
    drawStraw(nXr,nYr,nZr-.1)
end   
% -------------------------------------------------------------------------
[nXb,nYb,nZb]=rotateXYZ(xb./2.5,yb./2.5,Zb./2.5+.32,R_x_2);
nYb=nYb-1.35;
for k=1:5
    [nXb,nYb,nZb]=rotateXYZ(nXb,nYb,nZb,R_z_2);
    surface(nXb,nYb,nZb,'EdgeColor','none','FaceColor','interp','CData',colorMapb)
    drawStraw(nXb,nYb,nZb)
end  
[nXb,nYb,nZb]=rotateXYZ(xb./2.5,yb./2.5,Zb./2.5+.32,R_x_2);
nYb=nYb-1.15;
[nXb,nYb,nZb]=rotateXYZ(nXb,nYb,nZb,R_z_1);
for k=1:5
    [nXb,nYb,nZb]=rotateXYZ(nXb,nYb,nZb,R_z_2);
    surface(nXb,nYb,nZb,'EdgeColor','none','FaceColor','interp','CData',colorMapb)
    drawStraw(nXb,nYb,nZb)
end
[nXb,nYb,nZb]=rotateXYZ(xb./2.5,yb./2.5,Zb./2.5+.32,R_x_2);
nYb=nYb-1.25;
[nXb,nYb,nZb]=rotateXYZ(nXb,nYb,nZb,R_z_3);
for k=1:5
    [nXb,nYb,nZb]=rotateXYZ(nXb,nYb,nZb,R_z_2);
    surface(nXb,nYb,nZb,'EdgeColor','none','FaceColor','interp','CData',colorMapb)
    drawStraw(nXb,nYb,nZb)
end  
[nXb,nYb,nZb]=rotateXYZ(xb./2.5,yb./2.5,Zb./2.5+.32,R_x_2);
nYb=nYb-1.25;
[nXb,nYb,nZb]=rotateXYZ(nXb,nYb,nZb,R_z_3);
[nXb,nYb,nZb]=rotateXYZ(nXb,nYb,nZb,R_z_3);
for k=1:5
    [nXb,nYb,nZb]=rotateXYZ(nXb,nYb,nZb,R_z_2);
    surface(nXb,nYb,nZb,'EdgeColor','none','FaceColor','interp','CData',colorMapb)
    drawStraw(nXb,nYb,nZb)
end  
%axes属性调整 ==============================================================
ax=gca;
ax.Position=[0,0,1,1];
grid on
ax.GridLineStyle='--';
ax.LineWidth=1.2;
ax.XColor=[1,1,1].*0.4;
ax.YColor=[1,1,1].*0.4;
ax.ZColor=[1,1,1].*0.4;
ax.DataAspectRatio=[1,1,1];
ax.DataAspectRatioMode='manual';
view(-15,35);
end

再次祝各位成双成对和形单影只的都七夕节快乐叭!!!

到此这篇关于使用matlab绘制七夕表白玫瑰花束的文章就介绍到这了,更多相关matlab绘制玫瑰花内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Qt实现文件拖拽打开加载的示例详解

    Qt实现文件拖拽打开加载的示例详解

    这篇文章主要为大家详细介绍了sh8i8yQt实现文件拖拽打开加载的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-12-12
  • C++学习之多态的使用详解

    C++学习之多态的使用详解

    这篇文章主要为大家详细介绍了C++中多态的机制以及使用,文中的示例代码讲解详细,对我们学习C++有一定的帮助,感兴趣的可以了解一下
    2022-06-06
  • C语言实现ATM系统程序的完整代码

    C语言实现ATM系统程序的完整代码

    这篇文章主要介绍了C语言实现ATM系统程序的完整代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-05-05
  • QT圆形图像剪切功能实现

    QT圆形图像剪切功能实现

    这篇文章主要介绍了QT圆形图像剪切,实现代码包括剪切代码,完整QML源码,C++代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • 深入理解C++中std::chrono库的使用

    深入理解C++中std::chrono库的使用

    在程序设计中,时间管理是一个核心概念,它不仅关系到程序的效率和性能,而且直接影响用户体验,C++作为一门高效的编程语言,提供了std::chrono库,用于精确地处理和计算时间,下面就跟随小编一起学习一下std::chrono库的使用吧
    2023-12-12
  • QML与C++交互之创建自定义对象的实现

    QML与C++交互之创建自定义对象的实现

    本文介绍了在QML中通过C++定义全局对象的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-07-07
  • C++第三方日志库log4cplus的安装与使用配置教程

    C++第三方日志库log4cplus的安装与使用配置教程

    log4cplus是C++编写的开源的日志系统,log4cplus具有线程安全、灵活、以及多粒度控制的特点,本文给大家介绍C++第三方日志库log4cplus的安装与使用教程,感兴趣的朋友一起看看吧
    2022-02-02
  • C语言折半查找法的由来及使用详解

    C语言折半查找法的由来及使用详解

    折半查找法也叫做⼆分查找,顾名思义就是把数据分成两半,再判断所查找的key在哪⼀半中,再重复上述步骤知道找到⽬标key,下面这篇文章主要给大家介绍了关于C语言折半查找法的相关资料,需要的朋友可以参考下
    2022-08-08
  • C/C++中异常处理详解及其作用介绍

    C/C++中异常处理详解及其作用介绍

    这篇文章主要介绍了C/C++中异常处理详解及其作用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • C++获取字符串最后一个单词长度的多种方法

    C++获取字符串最后一个单词长度的多种方法

    在字符串处理中,获取最后一个单词的长度是一个常见问题,这个问题在文本处理、编译原理、自然语言处理等领域都有广泛应用,本文将详细介绍多种解决该问题的方法,并分析各自的优缺点,需要的朋友可以参考下
    2026-03-03

最新评论