如何解决如何避免 pm3d 表面遮挡它前面的其他对象?
我正在尝试绘制方程 x + y + 2z = 0 的简单线性曲面。这是我的文件:
set xrange [-4:4]
set yrange [-4:4]
set zrange [-4:4]
set xlabel 'x'
set ylabel 'y'
set zlabel 'z'
set xyplane at -4.0
unset xzeroaxis
unset yzeroaxis
unset zzeroaxis
set border 1023-128
set xtics out nomirror
set ytics out nomirror
set ztics out
set xtics add ('' -4)
set label 1 "{/:Italic x} + {/:Italic y} + 2{/:Italic z} = 0" at 4,4.2,-2 font 'Times New Roman,11'
set arrow 1 from 0,-4 to 0,4 filled
set arrow 2 from 0,-4,0 to 0,4,0 filled
set arrow 3 from -4,0 to 4,0 filled
set arrow 4 from 3.9,4.1,-2.1 to 3.6,3.6,-2.5
unset key
set pm3d lighting primary 0.5 specular 0.6
set style fill transparent solid 1 noborder
set palette defined (0 "cyan",1 "green")
unset colorbox
set pm3d depthorder
splot -x/2-y/2 with pm3d
我使用箭头来显示轴,因为它们似乎粘在 xy 平面上,移动它会导致进一步的抽动和边框问题。但现在的问题是它们被表面完全遮挡了。是否有设置允许在它们“刺穿”表面时出现在前面?我想让表面半透明,但这些设置问题更清晰。
解决方法
gnuplot> help layer
A gnuplot plot is built up by drawing its various components in a fixed order.
This order can be modified by assigning some components to a specific layer
using the keywords `behind`,`back`,or `front`. For example,to replace the
background color of the plot area you could define a colored rectangle with the
attribute `behind`.
set object 1 rectangle from graph 0,0 to graph 1,1 fc rgb "gray" behind
The order of drawing is
behind
back
the plot itself
the plot legend (`key`)
front
Within each layer elements are drawn in the order
grid,axis,and border elements
pixmaps in numerical order
所以基本上你需要给你想要出现在绘图前面的对象添加“front”属性。
,我猜你最初的想法,即用箭头或线“刺穿”一个 3D 表面在 gnuplot 中不能立即生效,因为 gnuplot 不会自动计算刺穿点。如果我错了,请纠正我,如果可能有一个简单的解决方案,请告诉我。
正如您在简单情况下所做的那样,您可以在原点处分割箭头,因为您已经知道穿刺点。但是,如果表面不规则或有多个穿孔点怎么办?
解决方案:努力创建一个分段的 3D 箭头,并让 gnuplot 根据需要自动显示和隐藏曲面。这可能与您的想法很接近。但是,当您想要更改箭头的颜色时,此解决方案会显示出惊喜。因此,仍有改进的空间。
代码:(简单版本,箭头仅沿 x、y、z 轴)
### arrows "piercing" a 3D surface
reset session
set view equal xyz
set xyplane relative 0.0
set xrange [-4:4]
set yrange [-4:4]
set zrange [-4:4]
# create 3D arrow
r = 0.01 # radius of arrow
rHead = 0.1 # radius of arrrowhead
n = 6 # corners of arrow
set print $myArrow
do for [h=-100:90] {
do for [a=360/n:360:360/n] {
print sprintf("%g %g %g",r*cos(a),r*sin(a),h/100.)
}
print ""
}
do for [h=90:100] {
do for [a=360/n:360:360/n] {
print sprintf("%g %g %g",rHead*(100-h)/10.*cos(a),\
rHead*(100-h)/10.*sin(a),h/100.)
}
print ""
}
set print
unset key
unset colorbox
set pm3d depthorder
set samples 100
set isosamples 100
set view 65,46,1.3
# function to demonstrate "piercing"
f(x,y) = (sin(x*3)/x + sin(y*3)/y - 3)/2
splot \
f(x,y) w pm3d,\
$myArrow u 1:2:($3*4):(0) w pm3d lc rgb var,\
$myArrow u 2:($3*4):1:(0) w pm3d lc rgb var,\
$myArrow u ($3*4):1:2:(0) w pm3d lc rgb var
### end of code
结果:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。