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)做出相應(yīng)更改。
到此這篇關(guān)于matlab實現(xiàn)繪制玫瑰花球的示例代碼的文章就介紹到這了,更多相關(guān)matlab繪制玫瑰花球內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言實現(xiàn)線性動態(tài)(單向)鏈表的示例代碼
本文主要介紹了C語言實現(xiàn)線性動態(tài)(單向)鏈表的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05深入剖析C語言中qsort函數(shù)的實現(xiàn)原理
這篇文章主要介紹了C語言中qsort函數(shù)的實現(xiàn)原理,本文將從回調(diào)函數(shù),qsort函數(shù)的應(yīng)用,qsort函數(shù)的實現(xiàn)原理三個方面進行講解,并通過代碼示例講解的非常詳細,需要的朋友可以參考下2024-03-03C語言中access/_access函數(shù)的使用實例詳解
本文通過實例代碼給大家介紹了C語言中access/_access函數(shù)的使用,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-09-09C語言詳解實現(xiàn)鏈式二叉樹的遍歷與相關(guān)接口
二叉樹的鏈式存儲結(jié)構(gòu)是指,用鏈表來表示一棵二叉樹,即用鏈來指示元素的邏輯關(guān)系。通常的方法是鏈表中每個結(jié)點由三個域組成,數(shù)據(jù)域和左右指針域,左右指針分別用來給出該結(jié)點左孩子和右孩子所在的鏈結(jié)點的存儲地址2022-04-04C語言深入探究sizeof與整型數(shù)據(jù)存儲及數(shù)據(jù)類型取值范圍
在main函數(shù)中,sizeof是可以正常工作的,但是在自定義函數(shù)中就不可以了。所以本文將為大家詳細講解一下關(guān)鍵字sizeof、整型數(shù)據(jù)存儲深入、數(shù)據(jù)類型取值范圍深入2022-07-07