最近在用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');
这时图如上图,这个结果当然使我们想要的,这个与上个程序不同地方我以标注,当然两个颜色的向量可以改变以改变颜色。
注:因为这个程序困扰了我两周的时间,在网上查了好久也没有想要的答案,所以写出来大家分享一下。