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

如何确定scilab 3dplot中顶点的方向?,plot,3d,scilab,Plot,3d,Scilab,我想在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],

我想在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
结果如下:

虽然结构非常精细,但两个面上的颜色是由内而外的。我试着以不同的方式逆时针/顺时针、不同的起点等绘制受影响面的点。。但这些面孔似乎一直朝向结构内部。我找到了一种解决方法,将面的背面设置为正面(代码中的2条注释行),但我想了解scilab如何为以后的工作确定面的方向。有什么线索吗

编辑:

所以我尝试了PTRK的建议。虽然他提供的矩阵完全不同:

结果仍然是一样的。即使提供的Testscript的输出也不同:


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

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

你的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]]
这将提供所需的输出:

Scilab 6.0.0缺陷 在此版本中,如果曲面平行于笛卡尔坐标轴,则Scilab将沿坐标轴引导曲面,无论如何定义它。这就是你的问题。一种解决方法是用一个小的三角形来偏移坐标的一个,该三角形必须不太小,如下例所示

关于你的问题,如果我们想保持物体的几何结构,我们可以把它倾斜一个很小的角度:如果所有坐标旋转引起的计算成本不影响你的话,使用。这是你的脚本和倾斜的物体

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')
显示由相同节点定义但顺序相反的两个曲面的脚本

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])
clc
清楚的
xdel(winsid())
图(1)
集合(gcf(),'background',-2)
cr=颜色(“红色”)//外表面的颜色
P1=[0,0,0]//
P2=[0,1,0]
P3=[1,0,0]
F1=[P1;P2;P3]//顺时针定义曲面
F2=[P1;P3;P2]//逆时针方向
子地块(2,2,1)
plot3d(F1(:,1),F1(:,2),列表(F1(:,3),cr*表(F1(:,3)))
xstring(F1(:,1),F1(:,2),['P1','P2','P3']
标题(‘表面为[P1,P2,P3],z_P3=0’)
集合(gca(),'data_bounds',[0,1,0,1,-1,1])
子地块(2,2,2)
plot3d(F2(:,1),F2(:,2),列表(F2(:,3),cr*ones(F2(:,3)))
xstring(F2(:,1),F2(:,2),['P1','P3','P2']
标题('表面为[P1,P3,P2],z_P3=0,用Scilab 6.0.0'断开)
集合(gca(),'data_bounds',[0,1,0,1,-1,1])
子地块(2,2,3)
plot3d(F2(:,1),F2(:,2),list(F2(:,3)+[0;0;10^-7],cr*one(F2(:,3)))
xstring(F2(:,1),F2(:,2),['P1','P3','P2']
标题(‘表面为[P1,P3,P2],带| z|u P3 |<10^-8’)
集合(gca(),'data_bounds',[0,1,0,1,-1,1])
子地块(2,2,4)
plot3d(F2(:,1),F2(:,2),list(F2(:,3)+[0;0;10^-8],cr*one(F2(:,3)))
xstring(F2(:,1),F2(:,2),['P1','P3','P2']
标题(‘表面为[P1,P3,P2],z|u P3 |=10^-8,折成6.0.0’)
集合(gca(),'data_bounds',[0,1,0,1,-1,1])
Scilab 5.5.1

Scilab 6.0.0
让曲面由3个节点定义:[P1、P2、P3]。然后,您必须顺时针循环通过这些节点,以获得正确的内外方向。下面是一张解释它的图纸:

你的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]]
这将提供所需的输出:

Scilab 6.0.0缺陷 在此版本中,如果曲面平行于笛卡尔坐标轴,则Scilab将沿坐标轴引导曲面,无论如何定义它。这就是你的问题。一种解决方法是用一个小的三角形来偏移坐标的一个,该三角形必须不太小,如下例所示

关于你的问题,如果我们想保持物体的几何结构,我们可以把它倾斜一个很小的角度:如果所有坐标旋转引起的计算成本不影响你的话,使用。这是你的脚本和倾斜的物体

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')
显示由相同节点定义但顺序相反的两个曲面的脚本

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])
clc
清楚的
xdel(winsid())
图(1)
集合(gcf(),'background',-2)
cr=颜色(“红色”)//外表面的颜色
P1=[0,0,0]//
P2=[0,1,0]
P3=[1,0,0]
F1=[P1;P2;P3]//顺时针定义曲面
F2=[P1;P3;P2]//逆时针方向
子地块(2,2,1)
plot3d(F1(:,1),F1(:,2),列表(F1(:,3),cr*表(F1(:,3)))
xstring(F1(:,1),F1(:,2),['P1','P2','P3']
标题(‘表面为[P1,P2,P3],z_P3=0’)
集合(gca(),'data_bounds',[0,1,0,1,-1,1])
子地块(2,2,2)
plot3d(F2(:,1),F2(:,2),列表(F2(:,3),cr*ones(F2(:,3)))
xstring(F2(:,1),F2(:,2),['P1','P3','P2']
标题('表面为[P1,P3,P2],z_P3=0,用Scilab 6.0.0'断开)
集合(gca(),'data_bounds',[0,1,0,1,-1,1])
子地块(2,2,3)
plot3d(F2(:,1),F2(:,2),list(F2(:,3)+[0;0;10^-7],cr*one(F2(:,3)))
xstring(F2(:,1),F2(:,2),['P1','P3','P2']
标题(‘表面为[P1,P3,P2],带| z|u P3 |<10^-8’)
集合(gca(),'data_bounds',[0,1,0,1,-1,1])
子地块(2,2,4)
plot3d(F2(:,1),F2(:,2),list(F2(:,3)+[0;0;10^-8],cr*one(F2(:,3)))
xstring(F2(:,1),F2(:,2),['P1','P3','P2']
标题(‘表面为[P1,P3,P2],z|u P3 |=10^-8,折成6.0.0’)
集合(gca(),'data_bounds',[0,1,0,1,-1,1])
Scilab 5.5.1

Scilab 6.0.0

嗨!非常感谢你的回答!请看我的问题的编辑!非常感谢你!很高兴知道这毕竟是一种虫子。您明确解释了该行为并添加了解决方法