Matlab 三维图像绘制(2)——surface property、view、空间圆柱体
2015-11-07 16:31
477 查看
主要学习了画空间圆柱体和空间长方形的绘制方法。
有两个surface property:'FaceColor'和‘EdgeColor’;
先讲‘FaceColor’,它指定了surface画出曲面的颜色,可以是[r,g,b]的一个向量,分别表示了红绿蓝的颜色配比;
也可以是‘interp’,画出来是由z的值决定的渐变色,可以使用colormapeditor来调节颜色(在代码中写上colormapeditor即可唤出调色板);
然后是‘EdgeColor’,它会在曲面的表面画出网格,指定颜色的方法同上。
但是有一个疑问没有解决:就是如何只显示各个棱的网格线,而不是整个面的网格线??这个留待后面继续摸索吧。
surface(x,y,z)函数画出来的图像如果想要平移,可以直接在带入参数时修改。比如,沿z轴正方向平移10,就是surface(x,y,z+10);
最后有一个实现视角自动旋转的小功能:
view(az,el)中,az可以调节物体旋转的角度,el调节摄像机的俯仰角度
for i=1:120 view(i*1, 30); pause(0.01); end
代码如下:
function test() %% clear; clc; clf; z_delta = 6; %% draw head A = imread('head.jpg'); [x,y,z]=sphere(30); h0=surface(x,y,z + z_delta,'EdgeColor','none'); rotate(h0, [0,0,1], 90); set(h0,'CData',A,'FaceColor','texturemap');%texturemap纹理贴图 %% draw body % FaceColor (orange) face_color = 'interp'; %[1, 0.6, 0]; edge_color = 'b'; <pre name="code" class="plain">colormapeditor;% up board[x1,y1] = meshgrid(-1:0.1:1, -1:0.1:1);z1 = repmat(-1, 21, 21);h1=surface(x1,y1,z1 + z_delta, 'EdgeColor',edge_color,'FaceColor',face_color);% left boardx2 = repmat(1, 21, 21); y2 = repmat([-1:0.1:1],21,1);for i=1:21 for j=1:21 z2(i,j)=-1-(i-1)*0.25;
endendh2=surface(x2,y2,z2 + z_delta,'EdgeColor',edge_color,'FaceColor',face_color);% right boardx3 = repmat(-1, 21, 21);y3 = repmat([-1:0.1:1],21,1);for i=1:21 for j=1:21 z3(i,j)=-1-(i-1)*0.25; endendh3=surface(x3,y3,z3 + z_delta,'EdgeColor',edge_color,'FaceColor',face_color);%
front boardy4 = repmat(1, 21, 21); %#ok<*RPMT1>x4 = repmat([-1:0.1:1],21,1);for i=1:21 for j=1:21 z4(i,j)=-1-(i-1)*0.25; endendh4=surface(x4,y4,z4 + z_delta,'EdgeColor',edge_color,'FaceColor',face_color);% back boardy5 = repmat(-1, 21, 21);x5 = repmat([-1:0.1:1],21,1);for
i=1:21 for j=1:21 z5(i,j)=-1-(i-1)*0.25; endendh5=surface(x5,y5,z5 + z_delta,'EdgeColor',edge_color,'FaceColor',face_color);%% draw armsrobot = robot_model();r_arm = 0.3;num_of_surf = 36;for i=2:5 if mod(i,2)==1 color_arm = 'r'; else color_arm = 'b'; end [Cylinder(i),
EndPlate1(i), EndPlate2(i)] = cylinder3(robot(i).position, robot(i+1).position, r_arm, num_of_surf, color_arm, 1, 0);endfor i=7:10 if mod(i,2)==1 color_arm = 'r'; else color_arm = 'b'; end [Cylinder(i), EndPlate1(i), EndPlate2(i)] = cylinder3(robot(i).position,
robot(i+1).position, r_arm, num_of_surf, color_arm, 1, 0);end%% rotate the angle of viewgrid on;axis equal;axis fill;for i=1:120 view(i*1, 30); pause(0.01);endend
下面是由两个点画出一个空间圆柱体的代码,从CSDN上下载的别人的程序,就拿来直接用于画胳膊了。
function [Cylinder, EndPlate1, EndPlate2] = cylinder3(X1,X2,r,n,cyl_color,closed,lines) % % This function constructs a cylinder connecting two center points % % Usage : % [Cylinder EndPlate1 EndPlate2] = cylinder3(X1+20,X2,r,n,'r',closed,lines) % % Cylinder-------Handle of the cylinder % EndPlate1------Handle of the Starting End plate % EndPlate2------Handle of the Ending End plate % X1 and X2 are the 3x1 vectors of the two points % r is the radius of the cylinder % n is the no. of elements on the cylinder circumference (more--> refined) % cyl_color is the color definition like 'r','b',[0.52 0.52 0.52] % closed=1 for closed cylinder or 0 for hollow open cylinder % lines=1 for displaying the line segments on the cylinder 0 for only % surface % % Typical Inputs % X1=[10 10 10]; % X2=[35 20 40]; % r=1; % n=20; % cyl_color='b'; % closed=1; % % NOTE: There is a MATLAB function "cylinder" to revolve a curve about an % axis. This "Cylinder" provides more customization like direction and etc %%%%%%%%%% if (X1(1) > X2(1)) tmpX = X1; X1 = X2; X2 = tmpX; end % Calculating the length of the cylinder length_cyl=norm(X2-X1); % Creating a circle in the YZ plane t=linspace(0,2*pi,n)'; x2=r*cos(t); x3=r*sin(t); % Creating the points in the X-Direction x1=[0 length_cyl]; % Creating (Extruding) the cylinder points in the X-Directions xx1=repmat(x1,length(x2),1); xx2=repmat(x2,1,2); xx3=repmat(x3,1,2); % Drawing two filled cirlces to close the cylinder if closed==1 hold on EndPlate1=fill3(xx1(:,1),xx2(:,1),xx3(:,1),'r'); EndPlate2=fill3(xx1(:,2),xx2(:,2),xx3(:,2),'r'); end % Plotting the cylinder along the X-Direction with required length starting % from Origin Cylinder=mesh(xx1,xx2,xx3); % Defining Unit vector along the X-direction unit_Vx=[1 0 0]; % Calulating the angle between the x direction and the required direction % of cylinder through dot product angle_X1X2=acos( dot( unit_Vx,(X2-X1) )/( norm(unit_Vx)*norm(X2-X1)) )*180/pi; % Finding the axis of rotation (single rotation) to roate the cylinder in % X-direction to the required arbitrary direction through cross product axis_rot=cross([1 0 0],(X2-X1) ); % Rotating the plotted cylinder and the end plate circles to the required % angles if angle_X1X2~=0 % Rotation is not needed if required direction is along X rotate(Cylinder,axis_rot,angle_X1X2,[0 0 0]) if closed==1 rotate(EndPlate1,axis_rot,angle_X1X2,[0 0 0]) rotate(EndPlate2,axis_rot,angle_X1X2,[0 0 0]) end end % Till now cylinder has only been aligned with the required direction, but % position starts from the origin. so it will now be shifted to the right % position if closed==1 set(EndPlate1,'XData',get(EndPlate1,'XData')+X1(1)) set(EndPlate1,'YData',get(EndPlate1,'YData')+X1(2)) set(EndPlate1,'ZData',get(EndPlate1,'ZData')+X1(3)) set(EndPlate2,'XData',get(EndPlate2,'XData')+X1(1)) set(EndPlate2,'YData',get(EndPlate2,'YData')+X1(2)) set(EndPlate2,'ZData',get(EndPlate2,'ZData')+X1(3)) end set(Cylinder,'XData',get(Cylinder,'XData')+X1(1)) set(Cylinder,'YData',get(Cylinder,'YData')+X1(2)) set(Cylinder,'ZData',get(Cylinder,'ZData')+X1(3)) % Setting the color to the cylinder and the end plates set(Cylinder,'FaceColor',cyl_color) if closed==1 set([EndPlate1 EndPlate2],'FaceColor',cyl_color) else EndPlate1=[]; EndPlate2=[]; end % If lines are not needed making it disapear if lines==0 set(Cylinder,'EdgeAlpha',0) end
相关文章推荐
- MATLAB绘图
- 图像处理(一)——使用matlab放缩图像
- 一些图像处理函数用法(精华)
- Matlab畫地圖
- 【Matlab开发】matlab中norm范数以及向量点积、绘图设置相关
- Matlab “Out of memory”解决办法
- matlab与c/c++混合编程——c/c++调用matlab
- 数值分析 Gauss-Seidel迭代法求解线性方程组 MATLAB程序实现
- 数值分析 jacobi迭代法求解线性方程组 MATLAB程序实现
- 小记Matlab和C混合编程
- MATLAB产生各种分布的随机数
- 在外部调用Matlab引擎实现数学计算
- matlab快捷键大全
- 使用随机梯度算法对高斯核模型进行最小二乘学习法的MATLAB程序源码分析
- Matlab与C++混合编程,添加OpenCV库
- 分层K-Means+Matlab计算向量间距离
- 对给定音频文件“testshort.wav”,用matlab输出它的波形【学生创新实验室联合纳新测试题】
- MATCOM在VC++与MATLAB混合编程中的应用
- Matlab与C/C++混合编程接口及应用
- 浅谈手机sensor采集的raw图像