内容介绍
MATLAB中并没有直接画斜圆柱的方法,我百度了一下,解决方案是用齐次矩阵做坐标变换,然后用fill3、surf函数画变换后的点。我改写了一下百度到的代码,因为源代码写的有点……功能单一。原理就不多介绍了,下面先看效果。
效果
这里用了图片编辑器里面的相机工具来增强画面的质感,可以自己调,也可以百度一下怎么在代码里面加,我比较懒就没去查了。
代码
代码能力有限,如果有更好更高效的的写法可以帮我更新一下,记得@我学习一下,谢谢。
代码片
.
function Getcolumn(axis,r)
%Getcolumn 此函数为画一般圆柱
% axis:轴线上的端点坐标,n*6 [plx ply plz pux puy puz;...],n为圆柱的个数
% r: 圆柱的半径,1*n
column_num = size(axis,1);%圆柱数量
Hight = sqrt(sum((axis(:,1:3)-axis(:,4:6)).*(axis(:,1:3)-axis(:,4:6)),2)); % 各个圆柱的高度 n*1
axis_vec = (axis(:,4:6) - axis(:,1:3))./Hight; % 各个圆柱的单位向量 n*3
% 获取转换矩阵
for i = 1:column_num
avi = axis_vec(i,:);
trans(:,:,i) = [ [null(avi) avi' axis(i,1:3)'];0 0 0 1 ];
end
% 标准圆柱面的点云
x = repmat(cos((1:50)*2*pi/50),column_num,1).*r'; % n*50
y = repmat(sin((1:50)*2*pi/50),column_num,1).*r'; % n*50
z = ones(column_num,50).*Hight; % n*50
x = [x x(:,1)];
y = [y y(:,1)];
z = [z z(:,1)];
for i = 1:column_num
lp(:,:,i) = trans(:,:,i)*[x(i,:);y(i,:);zeros(1,51);ones(1,51)];
up(:,:,i) = trans(:,:,i)*[x(i,:);y(i,:);z(i,:);ones(1,51)];
end
point_cloud = [lp;up];
% 绘图
color = rand(column_num,3);%不想要随机颜色的话可以自己根据圆柱的数量自己一个一个的设置,但比较麻烦。
for j = 1:column_num
s = surf([point_cloud(1,:,j);point_cloud(5,:,j)],[point_cloud(2,:,j);...
point_cloud(6,:,j)],[point_cloud(3,:,j);point_cloud(7,:,j)],'FaceColor',color(j,:));
s.EdgeColor = 'none';
hold on
fill3(point_cloud(1,:,j),point_cloud(2,:,j),point_cloud(3,:,j),color(j,:));
fill3(point_cloud(5,:,j),point_cloud(6,:,j),point_cloud(7,:,j),color(j,:));
end
hold off
end