matlab实现绘制玫瑰花球的示例代码

 更新时间:2023年08月21日 10:25:42   作者:slandarer  
这篇文章主要介绍了如何利用matlab实现绘制玫瑰花球,文中的示例代码讲解详细,对我们学习Matlab有一定的帮助,需要的可以参考一下

效果如下:

在这里插入图片描述

在这里插入图片描述

原理

玫瑰绘制

要画花球我们要先会绘制一朵花:

在这里插入图片描述

如何画一朵花可以看看这篇:MATLAB 3D玫瑰花绘制

三维坐标变化

主要用下面的坐标变化方法:

正十二面体球

想像这里有一个正十二面体球,我们把每一面放上一朵花,也就是说每两朵花之间夹角是pi-acos(-1/sqrt(5)),我们可以通过多次x轴旋转和多次z轴旋转将每朵花放到合适的角度

在这里插入图片描述

完整代码

function roseBall
clear;clc
%曲面数据计算
%==========================================================================
[x,t]=meshgrid((0:24)./24,(0:0.5:575)./575.*20.*pi+4*pi);
p=(pi/2)*exp(-t./(8*pi));
change=sin(15*t)/150;
u=1-(1-mod(3.6*t,2*pi)./pi).^4./2+change;
y=2*(x.^2-x).^2.*sin(p);
r=u.*(x.*sin(p)+y.*cos(p));
h=u.*(x.*cos(p)-y.*sin(p));
%颜色映射表
%==========================================================================
hMap=(h-min(min(h)))./(max(max(h))-min(min(h)));
col=size(hMap,2);
colorList=[0.0200    0.0400    0.3900
         0    0.0900    0.5800
         0    0.1300    0.6400
    0.0200    0.0600    0.6900
         0    0.0800    0.7900
    0.0100    0.1800    0.8500
         0    0.1300    0.9600
    0.0100    0.2600    0.9900
         0    0.3500    0.9900
    0.0700    0.6200    1.0000
    0.1700    0.6900    1.0000];
% colorList=[0.2100    0.0900    0.3800
%     0.2900    0.0700    0.4700
%     0.4000    0.1100    0.4900
%     0.5500    0.1600    0.5100
%     0.7500    0.2400    0.4700
%     0.8900    0.3200    0.4100
%     0.9700    0.4900    0.3700
%     1.0000    0.5600    0.4100
%     1.0000    0.6900    0.4900
%     1.0000    0.8200    0.5900
%     0.9900    0.9200    0.6700
%     0.9800    0.9500    0.7100];
colorFunc=colorFuncFactory(colorList);
dataMap=colorFunc(hMap');
colorMap(:,:,1)=dataMap(:,1:col);
colorMap(:,:,2)=dataMap(:,col+1:2*col);
colorMap(:,:,3)=dataMap(:,2*col+1:3*col);
    function colorFunc=colorFuncFactory(colorList)
        xx=(0:size(colorList,1)-1)./(size(colorList,1)-1);
        y1=colorList(:,1);y2=colorList(:,2);y3=colorList(:,3);
        colorFunc=@(X)[interp1(xx,y1,X,'linear')',interp1(xx,y2,X,'linear')',interp1(xx,y3,X,'linear')'];
    end
%曲面旋转及绘制
%==========================================================================
surface(r.*cos(t),r.*sin(t),h+0.35,'EdgeAlpha',0.05,...
    'EdgeColor',[0 0 0],'FaceColor','interp','CData',colorMap)
hold on
surface(r.*cos(t),r.*sin(t),-h-0.35,'EdgeAlpha',0.05,...
    'EdgeColor',[0 0 0],'FaceColor','interp','CData',colorMap)
Xset=r.*cos(t);
Yset=r.*sin(t);
Zset=h+0.35;
yaw_z=pi*72/180;
roll_x=pi-acos(-1/sqrt(5));
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_x_2=[1,0,0;
     0,cos(roll_x),-sin(roll_x);
     0,sin(roll_x),cos(roll_x)];
[nX,nY,nZ]=rotateXYZ(Xset,Yset,Zset,R_x_2);
surface(nX,nY,nZ,'EdgeAlpha',0.05,...
'EdgeColor',[0 0 0],'FaceColor','interp','CData',colorMap)
for k=1:4
    [nX,nY,nZ]=rotateXYZ(nX,nY,nZ,R_z_2);
    surface(nX,nY,nZ,'EdgeAlpha',0.05,...
    'EdgeColor',[0 0 0],'FaceColor','interp','CData',colorMap)
end   
[nX,nY,nZ]=rotateXYZ(nX,nY,nZ,R_z_1);
for k=1:5
    [nX,nY,nZ]=rotateXYZ(nX,nY,nZ,R_z_2);
    surface(nX,nY,-nZ,'EdgeAlpha',0.05,...
    'EdgeColor',[0 0 0],'FaceColor','interp','CData',colorMap)
end   
%--------------------------------------------------------------------------
    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
%axes属性调整
%==========================================================================
ax=gca;
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';
ax.CameraPosition=[-6.5914  -24.1625   -0.0384];
end

另:补两张古早之前做的折纸花球:

在这里插入图片描述

在这里插入图片描述

我好像在诡异配色的道路上越走越远了。。。其实后面第二种配色还可以不是嘛 。。。

配色1:

在这里插入图片描述

配色2:

在这里插入图片描述

配色3:

在这里插入图片描述

配色4:

在这里插入图片描述

配色4的数据上下颠倒是这样的:

在这里插入图片描述

这几种颜色大家可以试试看,我真的尽力了。。。。

颜色数据:

colorList1=[0.2000    0.0800    0.4300
    0.2000    0.1300    0.4600
    0.2000    0.2100    0.5000
    0.2000    0.2800    0.5300
    0.2000    0.3700    0.5800
    0.1900    0.4500    0.6200
    0.2000    0.4800    0.6400
    0.1900    0.5400    0.6700
    0.1900    0.5700    0.6900
    0.1900    0.7500    0.7800
    0.1900    0.8000    0.8100
];
colorList2=[0.1300    0.1000    0.1600
    0.2000    0.0900    0.2000
    0.2800    0.0800    0.2300
    0.4200    0.0800    0.3000
    0.5100    0.0700    0.3400
    0.6600    0.1200    0.3500
    0.7900    0.2200    0.4000
    0.8800    0.3500    0.4700
    0.9000    0.4500    0.5400
    0.8900    0.7800    0.7900
];
colorList3=[0.3200    0.3100    0.7600
    0.3800    0.3400    0.7600
    0.5300    0.4200    0.7500
    0.6400    0.4900    0.7300
    0.7200    0.5500    0.7200
    0.7900    0.6100    0.7100
    0.9100    0.7100    0.6800
    0.9800    0.7600    0.6700
];
colorList4=[0.9500    0.2300    0.6600
    0.7500    0.2100    0.6000
    0.6200    0.2000    0.5700
    0.4500    0.1800    0.5200
    0.3200    0.2100    0.5200
    0.2700    0.3100    0.6000
    0.2500    0.3600    0.6400
    0.1900    0.4800    0.7400
];

后注:两个面夹角为pi-acos(-1/sqrt(5)),同平面旋转为了五等分要转72度,因而yaw_z,和roll_x取值并不相同,代码和原文描述已经做出相应更改。

到此这篇关于matlab实现绘制玫瑰花球的示例代码的文章就介绍到这了,更多相关matlab绘制玫瑰花球内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言实现线性动态(单向)链表的示例代码

    C语言实现线性动态(单向)链表的示例代码

    本文主要介绍了C语言实现线性动态(单向)链表的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • 一篇文章带你了解C++语法基础--字符串

    一篇文章带你了解C++语法基础--字符串

    这篇文章主要介绍了C++常用字符串分割方法实例汇总,包括了strtok函数、STL、Boost等常用的各类字符串分割方法,非常具有实用价值,需要的朋友可以参考下
    2021-08-08
  • 深入剖析C语言中qsort函数的实现原理

    深入剖析C语言中qsort函数的实现原理

    这篇文章主要介绍了C语言中qsort函数的实现原理,本文将从回调函数,qsort函数的应用,qsort函数的实现原理三个方面进行讲解,并通过代码示例讲解的非常详细,需要的朋友可以参考下
    2024-03-03
  • C语言中access/_access函数的使用实例详解

    C语言中access/_access函数的使用实例详解

    本文通过实例代码给大家介绍了C语言中access/_access函数的使用,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • C语言详解实现链式二叉树的遍历与相关接口

    C语言详解实现链式二叉树的遍历与相关接口

    二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址
    2022-04-04
  • C语言深入讲解函数的使用

    C语言深入讲解函数的使用

    各位小伙伴们,今天YU同学给大家带来的是与函数相关的知识,本篇将会带着大家初步认识和调用函数来解决一些简单的问题
    2022-04-04
  • C语言深入探究sizeof与整型数据存储及数据类型取值范围

    C语言深入探究sizeof与整型数据存储及数据类型取值范围

    在main函数中,sizeof是可以正常工作的,但是在自定义函数中就不可以了。所以本文将为大家详细讲解一下关键字sizeof、整型数据存储深入、数据类型取值范围深入
    2022-07-07
  • C语言进制转换代码分享

    C语言进制转换代码分享

    本文给大家分享的是使用C语言实现进制转换的代码,十分的简单实用,有需要的小伙伴可以参考下。
    2015-07-07
  • 使用C语言实现三子棋小游戏

    使用C语言实现三子棋小游戏

    这篇文章主要为大家详细介绍了使用C语言实现三子棋小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • C++合并二叉树的思路与示例代码

    C++合并二叉树的思路与示例代码

    二叉树大家应该都不陌生,但是合并二叉树呢?这篇文章主要给大家介绍了关于C++合并二叉树的相关资料,文中给出了两种解决的方法,大家可以根据需要选择对应的方法,需要的朋友可以参考下
    2021-08-08

最新评论