Gnuplot: повторение палитры pm3d вне диапазона
План состоит в том, чтобы построить фазу 2D-комплексной функции, используя карту pm3d и непрерывную цветовую палитру. Чтобы быть более точным, палитра определяется только для [-pi, pi], тогда как сама фаза может выходить за пределы этого диапазона. Цветовая палитра должна повторяться для этих значений.
Моя текущая попытка состояла в том, чтобы заставить функцию оставаться в пределах диапазона и начинать заново с другой стороны при пересечении границы путем вычитания или добавления кратных 2* пи. Это, однако, приводило к появлению артефактов, когда в функции происходил такой скачок фазы. Обратите внимание на эти голубые пиксельные кольца на графике:
Это был код, используемый для создания этого графика:
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