bekuiwater 2024-03-26 22:16 采纳率: 0%
浏览 11
已结题

您好,matlab求帮助!

代码如下


clear all
M = 512; %grid M*N
N = 32; 
R = 10; %纱半径
L = 512; %单织长
Wav = 30; %最大值,最高
Rows = 10; %行数(纬纱数)
Colums = 15; %列数(经纱数)
num = 4.5;
H = 64;
%% 纱线定色模型 %%
tC1 = [.98 0.8 0.2]; %纬纱颜色
tC2 = [.2, 0.8 0.92]; %经纱颜色
c1 = zeros(M,N,3);
c2 = c1;
for j = 1:3 %三维纱线颜色网格化,逐渐变色
c1(:,1:N/2,j) = repmat(linspace(1,0.3,N/2)*tC1(j), M, 1);
c1(:,N/2+1:N,j) = repmat(linspace(0.3,1,N/2)*tC1(j), M, 1);
c2(:,1:N/2,j) = repmat(linspace(0.3,1,N/2)*tC2(j), M, 1);
c2(:,N/2+1:N,j) = repmat(linspace(1,0.3,N/2)*tC2(j), M, 1);
end
%% 编织模块 %%
stru = [0 1 1; 1 1 0; 1 0 1]; %斜纹 2/1 ↗
% stru = [0 0 1 1; 0 1 1 0; 1 1 0 0; 1 0 0 1]; %另一个斜纹 2/2 ↗
% stru = [0 0 0 1 0;0 1 0 0 0;0 0 0 0 1;0 0 1 0 0;1 0 0 0 0]; %5-end warp satin step 3
[r, c] = size(stru);
[x, y, z] = cylinder(ones(1,M)*R, N-1); %纱线的三维坐标矩阵
z = z*L;
%% 纱线屈曲模型 %%
t = linspace(0,2*pi*num,M);
a = 64;
b = 42;
x1 = zeros(1,M);
x1(end-M/2-a/2+1:end-M/2+a/2) = -(1:a)/a*b;
x1(end-M/2+a/2+1:end) = -b;
x1 = repmat(x1',1,N);
y1 = Wav*sin(t);
% y1 = [y1 y1];
y1 = repmat(y1',1,N);
% y1(M/2+1:end,:) = y1(M/2+1:end,:)+R;
%% 
figure, hold on
mesh(z,y+y1+x1*5,x,c1)
% for i = 1:Rows %调用weave3d函数绘制每个编织单元
% for j = 1:Colums
% weave3d(x,y,z,c1,c2,f1,f2,[i-1 j-1], L, stru(mod(Rows-i,r)+1,mod(j-1,c)+1))
% end
% end
axis equal, axis off, hold off

运行结果如下

img

我需要将这个图形分成三部分,1和3两个部分是正弦形状,2这个部分是圆柱体。

img

最后运行出这样一个类似的图形

img

  • 写回答

12条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-03-26 22:16
    关注

    引自免费微信小程序:皆我百晓生

    为了实现您的需求,您需要分别绘制正弦波部分(1和3部分)和中间的圆柱体部分(2部分),然后将它们组合在一起在同一张图像上显示。

    首先,根据您的现有代码,正弦波部分已经定义在变量y1中,并且应用了横向偏移x1。要单独绘制这部分,您可以按照以下方式创建子图并绘制正弦波:

    % 创建一个2行1列的子图布局
    figure
    subplot(2, 1, 1)
    
    % 绘制正弦波部分
    surf(z, y+y1+x1*5, x, c1)
    axis equal, axis off
    
    % 中间部分是空的,不需要绘制,但可以添加标题
    title('正弦波部分')
    
    % 绘制圆柱体部分
    subplot(2, 1, 2)
    
    % 需要重新计算没有正弦波变形的经纬纱线坐标
    [x_cyl, y_cyl, z_cyl] = cylinder(ones(1,M)*R, N-1); %纱线的三维坐标矩阵
    z_cyl = z_cyl*L;
    
    % 绘制原始的圆柱体部分
    mesh(z_cyl, y_cyl, x_cyl, c1)
    axis equal, axis off
    title('圆柱体部分')
    
    % 将两个子图结合显示
    tight_layout
    

    需要注意的是,上述代码仅绘制了1和2部分,对于您提到的第3部分(另一侧的正弦波),它应该与第1部分是对称的,只需对y1进行相应调整后再次绘制即可。若需绘制第3部分,可以复制第一个子图的绘制代码并在第三个子图中使用镜像对称后的y1

    另外,您原有的代码中试图在一个平面上同时展示这3个部分,这可能不容易直观地看到各自的效果。通过创建子图,我们可以更好地独立展示每部分结构。如果确实需要在一张图中展示这三个不同的形态,那么可能需要采用更复杂的3D绘图技巧,比如利用patch函数拼接不同的几何形状,但这会相对复杂很多。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月28日
  • 修改了问题 3月27日
  • 创建了问题 3月26日