matlab實現(xiàn)繪制玫瑰花球的示例代碼
效果如下:


原理
玫瑰繪制
要畫花球我們要先會繪制一朵花:

如何畫一朵花可以看看這篇:MATLAB 3D玫瑰花繪制
三維坐標變化
主要用下面的坐標變化方法:


正十二面體球
想像這里有一個正十二面體球,我們把每一面放上一朵花,也就是說每兩朵花之間夾角是pi-acos(-1/sqrt(5)),我們可以通過多次x軸旋轉(zhuǎn)和多次z軸旋轉(zhuǎn)將每朵花放到合適的角度

完整代碼
function roseBall
clear;clc
%曲面數(shù)據(jù)計算
%==========================================================================
[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
%曲面旋轉(zhuǎn)及繪制
%==========================================================================
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屬性調(diào)整
%==========================================================================
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的數(shù)據(jù)上下顛倒是這樣的:

這幾種顏色大家可以試試看,我真的盡力了。。。。
顏色數(shù)據(jù):
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)),同平面旋轉(zhuǎn)為了五等分要轉(zhuǎn)72度,因而yaw_z,和roll_x取值并不相同,代碼和原文描述已經(jīng)做出相應更改。
到此這篇關于matlab實現(xiàn)繪制玫瑰花球的示例代碼的文章就介紹到這了,更多相關matlab繪制玫瑰花球內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C語言中查找字符在字符串中第n次出現(xiàn)位置的幾種方法
在C語言中,查找一個字符在字符串中第i次出現(xiàn)的位置是一個常見的需求,可以通過多種方法實現(xiàn),下面我將結(jié)合搜索結(jié)果,為你詳細介紹幾種主流方法,并提供一個可直接使用的函數(shù),需要的朋友可以參考下2026-01-01

