Gnuplot: повторение палитры pm3d вне диапазона

План состоит в том, чтобы построить фазу 2D-комплексной функции, используя карту pm3d и непрерывную цветовую палитру. Чтобы быть более точным, палитра определяется только для [-pi, pi], тогда как сама фаза может выходить за пределы этого диапазона. Цветовая палитра должна повторяться для этих значений.

Моя текущая попытка состояла в том, чтобы заставить функцию оставаться в пределах диапазона и начинать заново с другой стороны при пересечении границы путем вычитания или добавления кратных 2* пи. Это, однако, приводило к появлению артефактов, когда в функции происходил такой скачок фазы. Обратите внимание на эти голубые пиксельные кольца на графике:

Phaseplot

Это был код, используемый для создания этого графика:

    set pm3d map
    set palette model HSV defined ( 0 0 1 1, 1 1 1 1 )
    set samples 100; set isosamples 100

    set xrange [-4:4]
    set yrange [-4:4]
    set cbrange [-pi:pi]

    set cblabel "Phase"

    phaseCont(u,v) = 2*pi* ((u/4)**2 + (v/4)**2)
    phaseClip(u,v) = phaseCont(u,v) - (floor(phaseCont(u,v)/(2*pi) + 0.5) * 2*pi)

    set terminal png
    set output "phaseplot.png"

    splot phaseClip(x,y) with pm3d

    unset output

Имеет смысл, что артефакты появляются при интерполяции, но, конечно, это не то, к чему я стремлюсь.

Есть ли способ создавать красивые 2D-сюжеты с повторяющимися цветными узорами?

1 ответ

Решение

Gnuplot не может определять бесконечно повторяющиеся цветовые палитры. В вашем случае мешающая интерполяция происходит из стандартной интерполяции pm3d, которая вычисляет среднее значение по всем четырем углам для определения цвета (см. show pm3d). Чтобы избежать такой интерполяции, используйте, например,

set pm3d corners2color c1

определить цвет только из одного угла. Особенно в вашем случае это не должно иметь значения, потому что вы всегда можете увеличить выборку своей функции, чтобы получить более плавные результаты:

set pm3d map
set palette model HSV defined ( 0 0 1 1, 1 1 1 1 )
set samples 500; set isosamples 500

set xrange [-4:4]
set yrange [-4:4]
set cbrange [-pi:pi]
set pm3d corners2color c1

set cblabel "Phase"

phaseCont(u,v) = 2*pi* ((u/4)**2 + (v/4)**2)
phaseClip(u,v) = phaseCont(u,v) - (floor(phaseCont(u,v)/(2*pi) + 0.5) * 2*pi)

set terminal pngcairo
set output "phaseplot.png"

splot phaseClip(x,y) with pm3d

Другие вопросы по тегам