2015-10-20 156 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