线上的箭头

时间:2017-12-19 11:03:45

标签: gnuplot

我有电场线的功能:

main ▶ Oj.load '{"number": 12.12345678910111213141516123456789123456789}'
#⇒{
#  "number" => 12.12345678910111213141516123456789123456789
# }
main ▶ Oj.load('{"number": 12.12345678910111213141516}')["number"].class
#⇒ BigDecimal < Numeric

如何在此曲线上放置箭头,在x = 2的位置进行定位? Oj

1 个答案:

答案 0 :(得分:1)

如何实现这一目标的一种方法如下:

set isosamples 200, 200
set contour base
unset  surface
set cntrparam levels incremental -2,0.2,2

set xr [-4:4]
set yr [-3:3]

x_ref = 2

f(x,y) = (y*(1+1/(x**2 + y**2)))
g(x,y) = 2*x*y / ( (x*x + y*y)**2 + (x*x + y*y) - 2*y*y )

set table 'meta.levels.dat'
splot f(x, y)

set table 'meta.pnts.dat'
splot f(x_ref, y)

unset key
unset table
set terminal pngcairo enhanced size 600, 400
set output 'fig.png'

set style arrow 1 head filled size screen 0.01,30 fixed lc rgb 'dark-red'

set size ratio -1

delta = 0.01

plot \
    'meta.levels.dat' w l lc rgb 'black', \
    'meta.pnts.dat' every 1:1:0:0:0:0 u (x_ref-delta):($2-g(x_ref,$2)*delta):(delta):(g(x_ref,$2)*delta) with vectors as 1

策略是:

  1. 首先在上面的脚本中生成感兴趣的函数(f(x,y))的轮廓,并通过set table
  2. 将它们保存到文件中
  3. 选择x的值(例如x_ref=2),生成f(x_ref, y)的轮廓。由于此函数不依赖于x,因此生成的轮廓将只是与x-轴平行的线,因此为了绘制与f(x,y)的轮廓相交的点,一个可以只取每个块的第一个点(每个轮廓)并用x绘制它 - 坐标设置为x_ref
  4. 使用formula作为隐式函数的导数,计算轮廓的斜率(此导数在上面定义为g(x,y)
  5. 最后,一个人具有箭头的位置以及它们的斜率,以便可以使用例如with vectors样式直接绘制它。在上方,delta参数指定x方向的小位移 - 这是为了achieve只有箭头可见。
  6. 最后,图表看起来像: enter image description here