gnuplot: артефакты splot pm3d при добавлении смещения - PullRequest
2 голосов
/ 06 августа 2020

Построение сферы 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    
    

Результат:

enter image description here

With offset:

введите описание изображения здесь

1 Ответ

3 голосов
/ 07 августа 2020

Проблема в коде модели освещения. Он вычисляет нормаль поверхности для каждой четырехугольной грани поверхности pm3d, используя перекрестное произведение (v1-v0) x (v2-v0). В этом случае четырехугольники, которые касаются «полюсов» сферы, становятся вырожденными, потому что две из четырех вершин l ie точно на полюсе, оставляя только треугольник. В зависимости от того, какая из двух вершин совпадает, нормаль становится неопределенной, и расчет освещения прекращается, возвращая 0 = черный. Так что это исправимая ошибка, поскольку другой выбор вершин по-прежнему позволяет вычислить нормаль. не совсем доходит до полюсов:

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

Как бы то ни было, другой обходной путь - set pm3d interpolation 3,3. Я не уверен, почему это работает, но это может быть полезно, если та же проблема возникает при построении набора данных, который не создается на месте.

...