我正在制作一个功能,它推广了气缸功能,使气缸有盖子,可以是任何尺寸和方向。然而,在圆筒的外观上我遇到了堵塞。为了使帽子看起来正确,弯曲部分需要一组阴影,帽子需要另一组。 (并且在你要求制作3个表面之前不是一个选项)
以下是相关代码:
surface(xSurf,ySurf,zSurf,c,'EdgeColor','none','FaceLighting','phong');
如果你想看到整个代码。
感谢您的帮助,
约翰
function varargout = DrawCylinder(x,y,z,r,h,aVec,bVec,cVec,ccolor, npts)
% DrawCylinder Generate a three-dimensional cylinder
%
% DrawCylinder(x,y,z,a,b,c,aVec,bVec,CVec,ccolor, npts)
% creates a surface plot of a cylinder whose center is at (x,y,z), has
% semiaxes of length a, b, and c. The unit vectors associated with each
% semixis are aVec, bVec, and cVec and must be size 3 x 1 (column vector)
% with size of npts + 1.
%
% H = DrawCylinder(...) creates the surface plot and returns the handle H to each
% graphical object created.
%
% [X Y Z] = DrawCylinder(...) does not generate the surface plot and returns
% the data necessary to create the surface using:
% SURF(X,Y,Z);
%
% [X Y Z C] = DrawCylinder(...) does not generate the surface plot and returns
% the data necessary to create the surface using:
% SURF(X,Y,Z,C,'cdataMapping','direct');
%CREATE SURFACE FOR CYLINDER
[xCyl,yCyl,zCyl]=cylinder(1,npts);
xSurf=[zeros(1,max(size(xCyl)));xCyl;zeros(1,max(size(xCyl)))];
ySurf=[zeros(1,max(size(yCyl)));yCyl;zeros(1,max(size(yCyl)))];
zSurf=[zeros(1,max(size(zCyl)));zCyl;ones(1,max(size(zCyl)))] - 0.5;
xSurf = xSurf*r;
ySurf = ySurf*r;
zSurf = zSurf*h;
%ROTATE CYLINDER
%Make sure aVec,bVec, and cVec are column unit vectors:
if all(size(aVec)==[1,3])
aVec=aVec';
end
if all(size(bVec)==[1,3])
bVec=bVec';
end
if all(size(cVec)==[1,3])
cVec=cVec';
end
aVec=aVec/norm(aVec); %Make unit vectors
bVec=bVec/norm(bVec);
cVec=cVec/norm(cVec);
rot = [aVec,bVec,cVec]; %The rotation matrix
[iMax, jMax] = size(xSurf);
for i=1:iMax
for j=1:jMax
rotatedPt = rot*[xSurf(i,j);ySurf(i,j);zSurf(i,j)];
xSurf(i,j) = rotatedPt(1);
ySurf(i,j) = rotatedPt(2);
zSurf(i,j) = rotatedPt(3);
end
end
%TRANSLATE CYLINDER
xSurf = xSurf + x;
ySurf = ySurf + y;
zSurf = zSurf + z;
c = ccolor*ones(size(xSurf));
if nargout == 0
surface(xSurf,ySurf,zSurf,c,'EdgeColor','none','FaceLighting','phong');
elseif nargout == 1
varargout = {surface(xSurf,ySurf,zSurf,c,'EdgeColor','none','FaceLighting','phong');};
elseif nargout == 3
varargout = {xSurf ySurf zSurf};
elseif nargout == 4
varargout = {xSurf ySurf zSurf c};
end
end
编辑8/18/12:
只是你可以看到。
这就是我得到的......
这就是我想要的......
答案 0 :(得分:1)
我很确定通过“阴影”你只是意味着端盖的颜色而不是更复杂的效果。如果这样非常简单,我将举一个灰度级的例子
更改
c = ccolor*ones(size(xSurf));
到
c = (ccolor/255)*ones(size(xSurf));
c([1 3],:)=max(0,(ccolor-10))/255;
第一行用标准化的ccolor初始化c
矩阵(期望8位灰度ccolor输入,它标准化为0..1)。第二行将大写字母(第1行和第3行)更改为在0处触底的稍暗颜色,并单独留下圆柱面(第2行和第4行)。
为了确保您正确地看到结果,您需要更改nargout == 0条件,使其看起来像这样
surface(xSurf,ySurf,zSurf,c,'EdgeColor','none','FaceLighting','phong');
colormap(gray(256));
caxis([0 1]);
色彩映射只设置色彩映射,类似于8位灰度。 caxis命令非常关键。根据Matlab的表面文档
MATLAB对此数据执行线性变换以从当前色彩映射
获取颜色
出于我们的目的,这是不好的。因为我们只有两个值,所以最低值将变为0,最高值变为1.这实际上忽略了我们的ccolor输入,并给出了一个带有两个黑色大写字母的白色圆柱体。使用caxis([0 1])
可以保留整个比例和ccolor在其中的位置。
<强>更新强>
听起来我误解了你想要的东西,最简单的方法就是将'MeshStyle'设置为'row',就像这样:
表面(xSurf,ySurf,zSurf,C, 'EdgeColor', 'K', 'FaceLighting', '蓬', 'MeshStyle', '行');
这将为您提供以下结果:
还有一个中心点,但它是迄今为止产生这种效果最简单的方法。