首页 > 解决方案 > gnuplot:添加偏移量时 splot pm3d 工件

问题描述

绘制球体with pm3d效果很好。但是,当我想给出一个偏移量时,我会得到一些我不理解的工件。任何想法为什么我在通过添加一些数字来移动坐标时会在我的球体中得到一个“黑洞”?使用 gnuplot 5.2.8 创建

代码:

### plotting artifact with splot and pm3d
reset session

set view equal xyz
set view 45,45, 2
unset tics
unset colorbox
unset key
set margins 0,0,0,0
unset border
set style fill solid 1.0 noborder
set pm3d depthorder noborder
set pm3d lighting specular 0.5

# Create a sphere prototype dataset
set parametric
set isosamples 25
set samples 25
set urange [-pi/2:pi/2]
set vrange [0:2*pi]
Radius = 1
set table $Sphere
    splot Radius*cos(u)*cos(v), Radius*cos(u)*sin(v), Radius*sin(u)
unset table
unset parametric

set palette defined (0 "#ff0000", 1 "#ff0000")
set view 153, 90

splot $Sphere u 1:2:3 w pm3d 
pause -1 "Press OK to see the next plot"
splot $Sphere u ($1+1.0):($2+2.0):($3+3.0) w pm3d 
### end of code    
    

结果:

在此处输入图像描述

带偏移量:

在此处输入图像描述

标签: gnuplot

解决方案


问题出在照明模型代码中。它使用叉积 (v1-v0)x(v2-v0) 计算 pm3d 表面的每个四边形刻面的表面法线。在这种情况下,接触球体“极点”的四边形会退化,因为四个顶点中有两个正好位于极点上,只剩下一个三角形。根据两个顶点中的哪一个重合,法线变得未定义,光照计算退出,返回 0 = 黑色。所以这是一个可修复的错误,因为不同的顶点选择仍然允许计算法线。

解决方法:限制参数变量 'u' 的范围,使四边形不会完全到达两极:

 epsilon=0.0001
 set urange [epsilon - pi/2 : pi/2 - epsilon]

对于它的价值,另一种解决方法是set pm3d interpolation 3,3. 我不确定为什么会这样,但如果在绘制不是现场生成的数据集时出现同样的问题,它可能会很有用。


推荐阅读