weixin_44179497
2020-05-01 22:43
采纳率: 7.7%
浏览 132

【matlab】求帮这份代码每句话加个注释

clear;
clc;
close all;

a=150;
b=600;
m=1000;
numbers=0;
x=-600:20:600;
y=-600:20:600;
z=200:20:1200;

for i=1:length(z)
W=zeros(length(x),length(y));

for j=1:length(x)
for k=1:length(y)

d3=sqrt((x(j))^2+(y(k))^2+(z(i))^2);
theta2=acos(-(x(j))/d3);
theta1=acos((y(k))/d3/sin(theta2));

a10=a.*[1;0;0];
a20=a.*[-1/2;cos(pi/6);0];
a30=a.*[-1/2;-cos(pi/6);0];

b1=b.*[1;0;0];
b2=b.*[-1/2;cos(pi/6);0];
b3=b.*[-1/2;-cos(pi/6);0];

R=[sin(theta2),0,-cos(theta2);
cos(theta1)*cos(theta2),sin(theta1),cos(theta1)*sin(theta2);
sin(theta1)*cos(theta2),-cos(theta1),sin(theta1)*sin(theta2)];
a1=R*a10;
a2=R*a20;
a3=R*a30;

r=[x(j);y(k);z(i)];

q1=(norm(a1+r-b1));
q2=(norm(a2+r-b2));
q3=(norm(a3+r-b3));

Q1=(a1+r-b1)./(norm(a1+r-b1));
Q2=(a2+r-b2)./(norm(a2+r-b2));
Q3=(a3+r-b3)./(norm(a3+r-b3));
Q11=[0,0,1];
gamma1=acos(Q11*Q1);
gamma2=acos(Q11*Q2);
gamma3=acos(Q11*Q3);

flag_d3=(400<d3)&(d3<1000);
flag_theta1=(pi/3<theta1)&(theta1<2*pi/3);
flag_theta2=(pi/3<theta2)&(theta2<2*pi/3);
flag_q1=(600<q1)&(q1<1080);
flag_q2=(600<q2)&(q2<1080);
flag_q3=(600<q3)&(q3<1080);
flag_gamma1=(0<gamma1)&(gamma1<pi/4);
flag_gamma2=(0<gamma2)&(gamma2<pi/4);
flag_gamma3=(0<gamma3)&(gamma3<pi/4);

if (flag_d3*flag_theta1*flag_theta2*flag_q1*flag_q2*flag_q3*flag_gamma1*flag_gamma2*flag_gamma3)==1
W(k,j)=z(i);
numbers=numbers+1;
else W(k,j)=NaN;
end

end
end
surf(x,y,W);
hold on
end

shading interp;
colormap jet;
xlabel('x/(mm)');
ylabel('y/(mm)');
zlabel('z/(mm)')


  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • P Jay 2020-05-02 19:30
    已采纳

    建议自行用matlab的help函数自行查找一下命令的含义和函数的功能

    clear; %清除当前工作区的变量
    clc; %清空命令行窗口的内容
    close all; %关闭所有打开的figure
    
    a=150; %a变量赋值为150
    b=600; %b变量赋值为600
    m=1000; %m变量赋值为1000
    numbers=0; %numbers变量赋值为0
    x=-600:20:600; %创建一个从-600开始到600结束,步长为20的数组
    y=-600:20:600; %创建一个从-600开始到600结束,步长为20的数组
    z=200:20:1200; %创建一个从200开始到1200结束,步长为20的数组
    
    for i=1:length(z) %for循环,循环计数变量i从1开始,到数组z的长度大小,即循环数组z的长度这么多次
        W=zeros(length(x),length(y)); %创建行数为数组x的长度,列数为数组y的长度的二维数组,所有元素都是0
    
        for j=1:length(x) %循环
            for k=1:length(y) %循环
                %注意!!!matlab里面的数组第一个元素的索引是1,而不是像其他编程语言那样的0
                d3=sqrt((x(j))^2+(y(k))^2+(z(i))^2); %x数组的第j个元素,y数组的第k个元素,z数组的第i个元素的平方和开根号
                theta2=acos(-(x(j))/d3); %括号内是x数组的第j个元素除以d3变量再取负的值,然后反余弦arccos()这个括号内的值
                theta1=acos((y(k))/d3/sin(theta2)); %sin()正弦函数
    
                a10=a.*[1;0;0]; %因为a为标量,[1;0;0]为向量,维度不同,所以添加.,代表a与向量中的每个元素运算
                a20=a.*[-1/2;cos(pi/6);0]; %pi就是圆周率
                a30=a.*[-1/2;-cos(pi/6);0];
    
                b1=b.*[1;0;0]; %[1;0;0]  ;代表下一行,所以这是个3行1列的列向量
                b2=b.*[-1/2;cos(pi/6);0];
                b3=b.*[-1/2;-cos(pi/6);0];
    
                R=[sin(theta2),0,-cos(theta2);
                cos(theta1)*cos(theta2),sin(theta1),cos(theta1)*sin(theta2);
                sin(theta1)*cos(theta2),-cos(theta1),sin(theta1)*sin(theta2)]; %  ,代表下一个元素,这是一个3行3列的二维数组
                a1=R*a10; %数组乘法,只需R列数等于a10行数即可
                a2=R*a20;
                a3=R*a30;
    
                r=[x(j);y(k);z(i)];
    
                q1=(norm(a1+r-b1)); %norm(v)返回向量v的2-范数或欧几里德范数
                q2=(norm(a2+r-b2));
                q3=(norm(a3+r-b3));
    
                Q1=(a1+r-b1)./(norm(a1+r-b1)); 
                Q2=(a2+r-b2)./(norm(a2+r-b2));
                Q3=(a3+r-b3)./(norm(a3+r-b3));
                Q11=[0,0,1];
                gamma1=acos(Q11*Q1);
                gamma2=acos(Q11*Q2);
                gamma3=acos(Q11*Q3);
    
                flag_d3=(400<d3)&(d3<1000); %两个不等式的逻辑值相与之后的逻辑值
                flag_theta1=(pi/3<theta1)&(theta1<2*pi/3); %不等式成立则为1,1与1为1,1与0为0,0与1为0,0与0为0
                flag_theta2=(pi/3<theta2)&(theta2<2*pi/3);
                flag_q1=(600<q1)&(q1<1080);
                flag_q2=(600<q2)&(q2<1080);
                flag_q3=(600<q3)&(q3<1080);
                flag_gamma1=(0<gamma1)&(gamma1<pi/4);
                flag_gamma2=(0<gamma2)&(gamma2<pi/4);
                flag_gamma3=(0<gamma3)&(gamma3<pi/4);
    
                if (flag_d3*flag_theta1*flag_theta2*flag_q1*flag_q2*flag_q3*flag_gamma1*flag_gamma2*flag_gamma3)==1 %条件判断,如果所有flag都是1则执行
                    W(k,j)=z(i); %W的第k行第j列的元素等于z的第i个元素
                    numbers=numbers+1; %numbers自增
                else W(k,j)=NaN; %否则W的第k行第j列的元素等于z的第i个元素
                end %对应缩进位置的if结束
    
            end %最近缩进位置的for结束
        end %最近缩进位置的for结束
        surf(x,y,W); %生成曲面图,xyW对应坐标的xyz
        hold on %保持当前的坐标区,继续绘图
    end %最近缩进位置的for结束
    
    shading interp; %通过在每个线条或面中对颜色图索引或真彩色值进行插值来改变该线条或面中的颜色
                    %shading - 设置颜色阴影属性
    colormap jet; %设置当前颜色图,jet对应的色阶图如下图所示
    xlabel('x/(mm)'); %x坐标轴的标志
    ylabel('y/(mm)'); %y坐标轴的标志
    zlabel('z/(mm)') %z坐标轴的标志
    

    图片说明

    已采纳该答案
    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题