gpt4 book ai didi

Matlab:设置单面着色

转载 作者:行者123 更新时间:2023-12-01 14:06:58 24 4
gpt4 key购买 nike

我正在制作一个泛化圆柱体函数的函数,这样圆柱体就有盖子,可以是任何尺寸和方向。但是,从圆柱体的外观来看,我遇到了麻烦。为了让帽子看起来正确,弯曲部分需要一组阴影,而帽子需要另一组。 (在你问之前制作 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

编辑 2012 年 8 月 18 日:

只是为了让你能看到。

这就是我得到的...

This is what I am getting

这就是我想要的......

And this is what I want

最佳答案

我敢肯定,“阴影”只是指端盖的颜色,而不是更复杂的效果。如果是这样,那就很简单了,我将举一个灰度示例

改变

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]);

colormap只是设置colormap,类似于8位灰度。 caxis 命令相当关键。根据Matlab的表面文档

MATLAB performs a linear transformation on this data to obtain colors from the current colormap

为了我们的目的,这是不好的。由于我们只有两个值,最低值将更改为 0,最高值将更改为 1。这实际上忽略了我们的 ccolor 输入并给出了一个带有两个黑色盖子的白色圆柱体。使用 caxis([0 1]) 保留完整比例和 ccolor 在其中的位置。

更新:

听起来我误解了你想要的东西,实现非常接近你想要的效果的最简单方法是将“MeshStyle”设置为“row”,如下所示:

表面(xSurf、ySurf、zSurf、c、'EdgeColor'、'k'、'FaceLighting'、'phong'、'MeshStyle'、'row');

这将为您提供以下结果:capped_cylinder

仍然有一个中心点,但这是迄今为止产生该效果的最简单方法。

关于Matlab:设置单面着色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12014883/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com