代码之家  ›  专栏  ›  技术社区  ›  Stefan Schallmeiner

如何确定scilab 3dplot中顶点的方向?

  •  1
  • Stefan Schallmeiner  · 技术社区  · 9 年前

    我想在scilab(3d)中绘制一个简单的对象。为了理解scilab在这方面的工作方式,我编写了以下示例:

    xx = [[2;2;1;3;],[2;2;3;3],[2;2;3;1],[2;2;1;1],[1;3;3;1],[3;3;3;3],[3;3;1;1],[1;1;1;1],[1;2;2;3],[1;1;2;2],[3;2;2;3],[3;2;2;1]]
    
    yy = [[2;2;1;1;],[2;2;1;3],[2;2;3;3],[2;2;3;1],[1;1;1;1],[1;3;3;1],[3;3;3;3],[3;1;1;3],[1;2;2;1],[1;3;2;2],[1;2;2;3],[3;2;2;3]]
    
    zz = [[0;0;1;1;],[0;0;1;1],[0;0;1;1],[0;0;1;1],[1;1;2;2],[1;1;2;2],[1;2;2;1],[1;1;2;2],[2;3;3;2],[2;2;3;3],[2;3;3;2],[2;3;3;2]]
    
    col = ones(12,1)*3
    
    plot3d(xx,yy,list(zz,col))
    //h = get("hdl")
    //h.hiddencolor = -1 // backside and frontside same color
    

    结果如下:

    scilab output for matrices

    scilab plot output

    也许这是某种版本/系统问题?我正在Windows 10上使用Scilab 6.0.0。

    1 回复  |  直到 8 年前
        1
  •  0
  •   PTRK    9 年前

    假设曲面由3个节点定义:[P1,P2,P3]。然后你必须顺时针在这些节点之间循环,以获得正确的内外方向。下面是一张解释它的图纸:

    Scilab_facet

    你的3个多边形是按上下文顺序定义的,y=1,y=3,x=1。绘制4点多边形时,要将旋转从顺时针切换到逆时针,只需交换第2和第4个节点或第1和第3个节点。

    xx = [[2;2;1;3;],[2;2;3;3],[2;2;3;1],[2;2;1;1],[1;1;3;3],[3;3;3;3],[3;3;1;1],[1;1;1;1],[1;2;2;3],[1;1;2;2],[3;2;2;3],[3;2;2;1]]
    
    yy = [[2;2;1;1;],[2;2;1;3],[2;2;3;3],[2;2;3;1],[1;1;1;1],[1;1;3;3],[3;3;3;3],[3;3;1;1],[1;2;2;1],[1;3;2;2],[1;2;2;3],[3;2;2;3]]
    
    zz = [[0;0;1;1;],[0;0;1;1],[0;0;1;1],[0;0;1;1],[1;2;2;1],[1;2;2;1],[1;2;2;1],[1;2;2;1],[2;3;3;2],[2;2;3;3],[2;3;3;2],[2;3;3;2]]
    

    这将提供所需的输出: good_3d_object

    在此版本中,如果曲面平行于笛卡尔轴,则Scilab将沿该轴引导曲面, 一 通过一个小的三角形,它必须 ,如下例所示。

    rotation matrix

    clc
    clear
    xdel(winsid())
    
    xx = [[2;2;1;3;],[2;2;3;3],[2;2;3;1],[2;2;1;1],[1;1;3;3],[3;3;3;3],[3;3;1;1],[1;1;1;1],[1;2;2;3],[1;1;2;2],[3;2;2;3],[3;2;2;1]]
    
    yy = [[2;2;1;1;],[2;2;1;3],[2;2;3;3],[2;2;3;1],[1;1;1;1],[1;1;3;3],[3;3;3;3],[3;3;1;1],[1;2;2;1],[1;3;2;2],[1;2;2;3],[3;2;2;3]]
    
    zz = [[0;0;1;1;],[0;0;1;1],[0;0;1;1],[0;0;1;1],[1;2;2;1],[1;2;2;1],[1;2;2;1],[1;2;2;1],[2;3;3;2],[2;2;3;3],[2;3;3;2],[2;3;3;2]]
    
    col = ones(12,1)*3
    
    figure(1)
    set(gcf(),'background',-2)
    subplot(2,1,1)
    plot3d(xx,yy,list(zz,col))
    title('Object with surfaces orthogonal to cartesian axis')
    subplot(2,1,2)
    // t is angle in radian showing the tilt
    t = %pi/10000
    c = cos(t)
    s = sin(t)
    rot = [1,0,0;0,c,-s;0,s,c]*[c,0,s;0,1,0;-s,0,c]*[c,-s,0;s,c,0;0,0,1]
    for i=1:size(xx,1)
      for j = 1:size(xx,2)
       xyz=(rot*[xx(i,j);yy(i,j);zz(i,j)])
       x(i,j)=xyz(1)
       y(i,j)=xyz(2)
       z(i,j)=xyz(3)
      end
    end
    plot3d(x,y,list(z,col))
    title('Object with surfaces tildted by an angle of '+string(t)+' rad')
    

    object

    显示由相同节点定义但顺序相反的两个曲面的脚本。

    clc
    clear
    xdel(winsid())
    
    figure(1)
    set(gcf(),'background',-2)
    cr=color('red') // color of the outside surface
    
    P1 = [0,0,0] //
    P2 = [0,1,0]
    P3 = [1,0,0]
    
    F1 = [P1;P2;P3] // defining surface clockwise
    F2 = [P1;P3;P2] //                  counterclockwise
    
    subplot(2,2,1)
    plot3d(F1(:,1),F1(:,2),list(F1(:,3),cr*ones(F1(:,3))))
    xstring(F1(:,1),F1(:,2),['P1','P2','P3']) 
    title('surface is [P1,P2,P3] with z_P3=0')
    set(gca(),'data_bounds',[0,1,0,1,-1,1])
    
    subplot(2,2,2)
    plot3d(F2(:,1),F2(:,2),list(F2(:,3),cr*ones(F2(:,3))))
    xstring(F2(:,1),F2(:,2),['P1','P3','P2'])
    title('surface is [P1,P3,P2] with z_P3=0, broken with Scilab 6.0.0')
    set(gca(),'data_bounds',[0,1,0,1,-1,1])
    
    subplot(2,2,3)
    plot3d(F2(:,1),F2(:,2),list(F2(:,3)+[0;0;10^-7],cr*ones(F2(:,3))))
    xstring(F2(:,1),F2(:,2),['P1','P3','P2'])
    title('surface is [P1,P3,P2] with |z_P3| < 10^-8')
    set(gca(),'data_bounds',[0,1,0,1,-1,1])
    
    subplot(2,2,4)
    plot3d(F2(:,1),F2(:,2),list(F2(:,3)+[0;0;10^-8],cr*ones(F2(:,3))))
    xstring(F2(:,1),F2(:,2),['P1','P3','P2'])
    title('surface is [P1,P3,P2] with |z_P3| = 10^-8, broken in 6.0.0')
    set(gca(),'data_bounds',[0,1,0,1,-1,1])
    

    Scilab 5.5.1

    Examples

    Examples