matlab實(shí)現(xiàn)繪制玫瑰花球的示例代碼
效果如下:
原理
玫瑰繪制
要畫花球我們要先會(huì)繪制一朵花:
如何畫一朵花可以看看這篇:MATLAB 3D玫瑰花繪制
三維坐標(biāo)變化
主要用下面的坐標(biāo)變化方法:
正十二面體球
想像這里有一個(gè)正十二面體球,我們把每一面放上一朵花,也就是說每兩朵花之間夾角是pi-acos(-1/sqrt(5)),我們可以通過多次x軸旋轉(zhuǎn)和多次z軸旋轉(zhuǎn)將每朵花放到合適的角度
完整代碼
function roseBall clear;clc %曲面數(shù)據(jù)計(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
另:補(bǔ)兩張古早之前做的折紙花球:
我好像在詭異配色的道路上越走越遠(yuǎn)了。。。其實(shí)后面第二種配色還可以不是嘛 。。。
配色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 ];
后注:兩個(gè)面夾角為pi-acos(-1/sqrt(5)),同平面旋轉(zhuǎn)為了五等分要轉(zhuǎn)72度,因而yaw_z,和roll_x取值并不相同,代碼和原文描述已經(jīng)做出相應(yīng)更改。
到此這篇關(guān)于matlab實(shí)現(xiàn)繪制玫瑰花球的示例代碼的文章就介紹到這了,更多相關(guān)matlab繪制玫瑰花球內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言實(shí)現(xiàn)線性動(dòng)態(tài)(單向)鏈表的示例代碼
本文主要介紹了C語言實(shí)現(xiàn)線性動(dòng)態(tài)(單向)鏈表的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05深入剖析C語言中qsort函數(shù)的實(shí)現(xiàn)原理
這篇文章主要介紹了C語言中qsort函數(shù)的實(shí)現(xiàn)原理,本文將從回調(diào)函數(shù),qsort函數(shù)的應(yīng)用,qsort函數(shù)的實(shí)現(xiàn)原理三個(gè)方面進(jìn)行講解,并通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下2024-03-03C語言中access/_access函數(shù)的使用實(shí)例詳解
本文通過實(shí)例代碼給大家介紹了C語言中access/_access函數(shù)的使用,代碼簡單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09C語言詳解實(shí)現(xiàn)鏈?zhǔn)蕉鏄涞谋闅v與相關(guān)接口
二叉樹的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)是指,用鏈表來表示一棵二叉樹,即用鏈來指示元素的邏輯關(guān)系。通常的方法是鏈表中每個(gè)結(jié)點(diǎn)由三個(gè)域組成,數(shù)據(jù)域和左右指針域,左右指針分別用來給出該結(jié)點(diǎn)左孩子和右孩子所在的鏈結(jié)點(diǎn)的存儲(chǔ)地址2022-04-04C語言深入探究sizeof與整型數(shù)據(jù)存儲(chǔ)及數(shù)據(jù)類型取值范圍
在main函數(shù)中,sizeof是可以正常工作的,但是在自定義函數(shù)中就不可以了。所以本文將為大家詳細(xì)講解一下關(guān)鍵字sizeof、整型數(shù)據(jù)存儲(chǔ)深入、數(shù)據(jù)類型取值范圍深入2022-07-07