1. 程式人生 > >MATLAB中surf與scatter3不能同時三維繪圖解決辦法

MATLAB中surf與scatter3不能同時三維繪圖解決辦法

最近在用MATLAB畫圖時遇見了一個非常有意思的事,用surf畫一個面,同時在這個fig上用scatter3畫一些點,當然這是在三維空間中,這時你會發現最後只有一個圖在fig上,當然,這裡我們用了hold on,這個的作用是保留當前的圖,也就是我畫了一個面後,hold on一下,在用scatter3畫一些點,這個理論上fig中應該有一個面和一些點,但是這兩者只有一個,我查了好多資料,看了很多文章,終於找到了解決辦法。首先來個程式:

R=random('Normal',10,25,3,30);%30個點
X=R(1,:);
Y=R(2,:);
Z=R(3,:);

%畫一個球
alpha1=0:pi/25:2*pi;
phyi=0:pi/50:pi;
R1=10;   %半徑
[alpha1,phyi]=meshgrid(alpha1,phyi);
x_o1=R1.*sin(phyi).*cos(alpha1)+100;
y_o1=R1.*sin(phyi).*sin(alpha1)+50;
z_o1=R1.*cos(phyi)+60;

P=scatter3(X,Y,Z,'^','EraseMode','background','MarkerFaceColor',[0 .0 .0]);  hold on;

surf(x_o1,y_o1,z_o1,'FaceColor','none','edgecolor','black');


複製上面程式碼雲行之後結果如圖只會看到一個圓,我們的理論結果應該是有一些點和一個圓,但是為什麼會這樣呢,鬧了半天這個是MATLAB中繪圖時渲染器有衝突,(這個解釋是我在網上查到的,不是個人瞎編),怎麼解決這個問題呢,只需改動一個語句即可,

R=random('Normal',10,25,3,30);%30個點
X=R(1,:);
Y=R(2,:);
Z=R(3,:);
%畫一個球
alpha1=0:pi/25:2*pi;
phyi=0:pi/50:pi;
R1=10;   %半徑
[alpha1,phyi]=meshgrid(alpha1,phyi);
x_o1=R1.*sin(phyi).*cos(alpha1)+100;
y_o1=R1.*sin(phyi).*sin(alpha1)+50;
z_o1=R1.*cos(phyi)+60;
myFacecolor=[0,0,0];%%與上個程式不同的地方
myColors=[1,1,1];
P=scatter3(X,Y,Z,100,myColors,'^','MarkerFaceColor',myFacecolor);hold on;
surf(x_o1,y_o1,z_o1,'FaceColor','none','edgecolor','black');

這時圖如上圖,這個結果當然使我們想要的,這個與上個程式不同地方我以標註,當然兩個顏色的向量可以改變以改變顏色。

注:因為這個程式困擾了我兩週的時間,在網上查了好久也沒有想要的答案,所以寫出來大家分享一下。