2015-10-20 149 views
4

我想创建一个像Gnuplot中的箭头线一样的流线,我已经有了我需要的数据点,所以我认为我的问题与this post说不一样,并且与this post不同,因为我已经获取了stramlines 。如何在Gnuplot中创建简化的箭头线?

我所做的是这样的:

have done

因此,红线是矢量显示流场和绿线是简化引导读者通量的方向。所有的大蓝箭头都是我的目标是在GNUPLOT中绘制。我已经知道如何绘制中间箭头,因为this post已经显示,但是如果我想绘制更多箭头,我需要做什么代码?

更详细的,我怎么能画出这样的:

aim

我在这里提供我的数据文件:

velocity.txt是矢量流场的数据为“指数,X,Y ,VX,VY,粒子数”

line.txt为流线型数据为 “X,Y”

和My克nu文件是bleow:

set terminal postscript eps size 108,16 enhanced font "Arial-Bold,100" 
set output 'vector.eps' 

unset key 
set tics 
set colorbox 
set border 0 
set xtics 2 
#set xlabel 'x' 
#set ylabel 'y' 


set xrange [0:108] 
set yrange [0:16] 
#set cbrange [0:40] 

set nolabel 
set style line 4 lt 2 lc rgb "green" lw 2 

plot 'velcoity.txt' u 2:3:(250*$4):(250*$5) with vectors lc 1,'line.txt' u 1:2 ls 4 

谢谢!

回答

3

要沿着一条线绘制箭头,您可以再次使用vectors绘图样式,就像您已经在流场中一样。

但要获得正确的阴谋,你必须考虑几个要点:

  1. 通常gnuplot的限制箭头头的大小箭头长度的一小部分。所以,如果你想绘制一个带有箭头的连续线,箭头本身的长度应该很短。为了避免箭头头的缩小,使用size ... fixed选项,这是仅因为5.0版

  2. 你只有轨迹,xy值,该行的。要提取箭头方向,最简单的方法是使用两个相邻点之间的差异(或者距离两点或三点)。

  3. 您可以在using声明中提取这些差异。由于伪代码,我们可以做到以下几点:

    if rownumber modulo 10 == 0: 
        save x and y values 
    else if rownumber modulo 10 == 1: 
        draw arrow from previous point to current point, only with a head 
    else 
        ignore the point. 
    

    using声明把这个伪代码给出如下:

    ev = 10 
    avg = 1 
    sc = 0.1 
    plot 'line.txt' u (prev_x = (int($0)%ev == 0 ? $1 : prev_x), prev_y = (int($0)%ev == 0 ? $2 : prev_y), int($0)%ev == avg ? $1 : 1/0):2:(sc*(prev_x-$1)):(sc*(prev_y-$2)) w vectors backhead size 2,20,90 fixed ls 4 
    

    为了让事情变得更灵活,我介绍了一些变量:ev告诉您计算两个箭头之间的差值,avg用于计算箭头方向的两点之间的距离,以及箭头的长度。

作为进一步的改进,您可以使用流场的箭头长度来着色流场向量。这给下面的脚本

reset 
unset key 
set tics 
set colorbox 
set border 0 
set xtics 2 

set autoscale xfix 
set autoscale yfix 
set autoscale cbfix 
set style line 4 lt 2 lc rgb "green" lw 2 
ev=30 
avg=3 
sc=0.1 
field_scale=500 
plot 'velcoity.txt' u 2:3:(field_scale*$4):(field_scale*$5):(sqrt($4**2+$5**2)) with vectors size 1,15,45 noborder lc palette,\ 
    'line.txt' u 1:2 ls 4 w l,\ 
    '' u (prev_x = (int($0)%ev == 0 ? $1 : prev_x), prev_y = (int($0)%ev == 0 ? $2 : prev_y), int($0)%ev == avg ? $1 : 1/0):2:(sc*(prev_x-$1)):(sc*(prev_y-$2)) w vectors backhead size 2,20,90 fixed ls 4 

有了结果(qt终端):

enter image description here

+0

呀,谢谢@克里斯托夫,即作品!你的回答非常有帮助和有用! – sikisis