线上的箭头

问题描述 投票:1回答:1

我有电场线的功能:

set isosamples 55, 55
set contour base
set cntrparam levels incremental -1.6,0.2,1.6
unset  surface
splot [-4:4] [-2.2:2.2] (y*(1+1/(x**2 + y**2)))

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

gnuplot
1个回答
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. 对于选择的x值(例如x_ref=2),生成f(x_ref, y)的轮廓。由于此函数不依赖于x,因此生成的轮廓将只是与x-axis平行的线,因此为了绘制与f(x,y)的轮廓相交的点,可以只取每个块的第一个点(每个轮廓)并用x坐标设置为x_ref绘制它。
  3. 使用formula作为隐函数的导数,计算轮廓的斜率(该导数在上面定义为g(x,y)
  4. 最后,一个人具有箭头的位置以及它们的斜率,以便可以使用例如with vectors样式直接绘制它。在上面,delta参数指定x方向的小位移 - 这是为了achieve,箭头的唯一可见。

最后,图表看起来像:enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.