zoukankan      html  css  js  c++  java
  • 【7.21】动态桌子代码

    圆形:

    L=120;  %长
    D=50;   %宽,圆桌面直径
    d=2.5;  %木板宽
    hL=L/2; %半长
    R=D/2;  %圆桌面半径
    y=-R+d/2:d:R-d/2; %长条宽度方向中心位置
    x=sqrt(R^2-y.^2); %长条中心在圆上的位置
    H=hL-x(1);        %最长腿长度,也就是最大桌子高度
      
    Tx=[x -x;x -x];Ty=[y-d/2 fliplr(y)+d/2;y+d/2 fliplr(y)-d/2]; %桌面数据
    Tx=Tx(:);Ty=Ty(:);Tz=zeros(size(Tx));
    legx=[hL*ones(size(x));hL*ones(size(x));x;x];             %桌腿数据     
    legy=[y-d/2;y+d/2;y+d/2;y-d/2];
    legz=zeros(size(legx)); 
    zhoux=[hL-H/2;hL-H/2];zhouy=[-R R];zhouz=[0;0];             %轴数据
                                
    figure(1),clf;
    h1=patch(Tx,Ty,Tz,'facecolor',[1 0.5 0],'edgecolor',[1 1 1]); %edgecolor为形状边缘线颜色
    h2=patch(legx,legy,legz,'facecolor',[1 0.5 0],'edgecolor',[1 1 1]);
    h3=patch(-legx,legy,legz,'facecolor',[1 0.5 0],'edgecolor',[1 1 1]);
    hold on
    h4=plot3(zhoux,zhouy,zhouz,'k-.');	%k表示黑色,-.表示点划线
    h5=plot3(-zhoux,zhouy,zhouz,'k-.');
    hold off
    view(3);
    
    axis equal;	%沿每个坐标轴使用相同的数据单位长度。
    axis([-hL hL -R R 0 H]); %把坐标范围移动到x=[-hl,hl],y=[-R,R],z=[0,H]之间
    axis off; %不显示坐标
    
    ddeg=2;                    %角度增量
    for deg=0:ddeg:75          %最长条桌腿相对桌面折叠角度
        zz=-H/2*sind(deg);     %轴相对桌面高度
        xx=x(1)+H/2*cosd(deg); %轴横坐标
        alldeg=atan2(-zz*ones(size(x)),xx-x); %每个条腿折叠角度
        allx=(hL-x).*cos(alldeg)+x;           %每条腿末端x坐标
        allz=-(hL-x).*sin(alldeg);            %每条腿末端z坐标
        minz=min(allz);                       %最小z坐标
        legx=[allx;allx;x;x];                 %腿x数据  
        legz=[allz;allz;zeros(size(allz));zeros(size(allz))]-minz;%t腿z数据
        set(h1,'ZData',-minz*ones(size(Tz))); %设置h1-h5 X、Y、Z方向的参量
        set(h2,'XData',legx,'ZData',legz);
        set(h3,'XData',-legx,'ZData',legz);
        set(h4,'XData',[xx;xx],'ZData',[zz;zz]-minz);
        set(h5,'XData',-[xx;xx],'ZData',[zz;zz]-minz);
        pause(0.1);
        drawnow;
    end
    

    正六边形:

    L=120; %长
    D=50; %宽,圆桌面直径
    d=2.5; %木板宽
    hL=L/2; %半长
    R=D/2; %圆桌面半径
    y=-R+d/2:d:R-d/2; %长条宽度方向中心位置
    x = R-(abs(y)/sqrt(3)) %正六边形
    H=hL-x(1); %最长腿长度,也就是最大桌子高度
    Tx=[x -x;x -x];Ty=[y-d/2 fliplr(y)+d/2;y+d/2 fliplr(y)-d/2]; %桌面数据
    Tx=Tx(:);Ty=Ty(:);Tz=zeros(size(Tx));
    legx=[hL*ones(size(x));hL*ones(size(x));x;x]; %桌腿数据
    legy=[y-d/2;y+d/2;y+d/2;y-d/2];
    legz=zeros(size(legx));
    zhoux=[hL-H/2;hL-H/2];zhouy=[-R R];zhouz=[0;0]; %轴数据
    figure(1),clf;
    h1=patch(Tx,Ty,Tz,'facecolor',[1 0.5 0],'edgecolor',[1 1 1]);
    h2=patch(legx,legy,legz,'facecolor',[1 0.5 0],'edgecolor',[1 1 1]);
    h3=patch(-legx,legy,legz,'facecolor',[1 0.5 0],'edgecolor',[1 1 1]);
    hold on
    h4=plot3(zhoux,zhouy,zhouz,'k-.');
    h5=plot3(-zhoux,zhouy,zhouz,'k-.');
    hold off
    view(3);
    axis equal;
    axis([-hL hL -R R 0 H]);
    axis off;
    ddeg=2; %角度增量
    for deg=0:ddeg:75 %最长条桌腿相对桌面折叠角度
        zz=-H/2*sind(deg); %轴相对桌面高度
        xx=x(1)+H/2*cosd(deg); %轴横坐标
        alldeg=atan2(-zz*ones(size(x)),xx-x); %每个条腿折叠角度
        allx=(hL-x).*cos(alldeg)+x; %每条腿末端x坐标
        allz=-(hL-x).*sin(alldeg); %每条腿末端z坐标
        minz=min(allz); %最小z坐标
        legx=[allx;allx;x;x]; %腿x数据
        legz=[allz;allz;zeros(size(allz));zeros(size(allz))]-minz;%t腿z数据
        set(h1,'ZData',-minz*ones(size(Tz)));
        set(h2,'XData',legx,'ZData',legz);
        set(h3,'XData',-legx,'ZData',legz);
        set(h4,'XData',[xx;xx],'ZData',[zz;zz]-minz);
        set(h5,'XData',-[xx;xx],'ZData',[zz;zz]-minz);
        pause(0.1);
        drawnow;
    end
    

      

    桌角边缘线形状动态变化:

    L=120; D=50; d=2.5; hL=L/2; R=D/2;
    y=-R+d/2:d:R-d/2;
    x=sqrt(R^2-y.^2);
    H=hL-x(1);%最长腿的长度
    chax=x-x(1);%每根木条顶点离最外面木条顶点的距离
    for h=2:5:50
    alpha=acos(h/H);
    beta=pi/2-alpha;
    caodi=sqrt(chax.^2+(H^2)/4-chax.*H*cos(beta));
    %%开槽长度
    kaicaochang=caodi-(H/2-chax);%开槽长度
    sin_gama=(H/2).*sin(beta)./(caodi);
    cos_gama=(chax.^2+caodi.^2-(H/2)^2)/(2*chax.*caodi);
    
    mutiaochang=H-chax;
    dix=-(L/2-mutiaochang.*(1+cos_gama));
    diy=y;
    diz=-mutiaochang.*sin_gama;
    
    figure(1);
    scatter3(dix,diy,50+diz,'r','LineWidth',1.5)
    xlabel('X');ylabel('Y');zlabel('Z');
    view(150,10) %控制观察角度
    pause(0.5);
    drawnow;
    grid on
    end
    

      

    Lingo求解:

    MODEL:
    MIN=l1;
    r=40;
    h=70;
    Gmax=@sqrt(r^2-(r/n)^2);
    Gmin=@sqrt(r^2-(r-r/n)^2);
    g1=Gmax-Gmin;
    l1>=h;
    @cos(alpha)=70/l1;
    g1<l1*@sin(alpha);
    EF^2=g1^2+(l1/2)^2-g1*l1*@cos(alpha);
    EF^2+g1^2>=(l1/2)^2;
    l1+Gmin>=dis;
    dis>=Gmax;
    d=r/n;
    N>3;
    N<=50;
    d>=2.5;
    END
    

      

  • 相关阅读:
    字符串 CSV解析 表格 逗号分隔值 通讯录 电话簿 MD
    Context Application 使用总结 MD
    RxJava RxPermissions 动态权限 简介 原理 案例 MD
    Luban 鲁班 图片压缩 MD
    FileProvider N 7.0 升级 安装APK 选择文件 拍照 临时权限 MD
    组件化 得到 DDComponent JIMU 模块 插件 MD
    gradlew 命令行 build 调试 构建错误 Manifest merger failed MD
    protobuf Protocol Buffers 简介 案例 MD
    ORM数据库框架 SQLite 常用数据库框架比较 MD
    [工具配置]requirejs 多页面,多入口js文件打包总结
  • 原文地址:https://www.cnblogs.com/zxhyxiao/p/9347733.html
Copyright © 2011-2022 走看看