Awk

過濾數據以僅生成最外層的點

  • May 3, 2021

我有以下數據,繪製時給了我以下數據在此處輸入圖像描述

我想用線圖只保存和繪製最外層的點。請就如何進行此操作提出建議,並就如何過濾數據提出建議

一種天真的方法,就像對上一個問題的回答一樣, 將笛卡爾座標轉換為極座標,然後根據角度對點進行分組,並在每個組中找到半徑最大的點:

awk -v OFS='\t' '
   {
       t = int(atan2($2,$1)*10)
       r = sqrt($1*$1+$2*$2)
   }

   r > maxr[t] { maxr[t] = r; data[t] = $0 }

   END { for (t in maxr) print t, data[t] }' data.in |
sort -k 1,1g | cut -f 2- >data.out

這計算與 的角度atan2(),然後將其乘以 10 並截斷小數位,產生一個t介於 -30 和 31 之間的值 。這t用作分組值,並且maxr數組保存r每個此類角度組的最大值(半徑) (並且該data數組保存相應的原始輸入數據)。

將角度乘以小於 10 的數字並截斷小數會最終產生“更大的組”和更少的不同點。乘以更大的值會進一步細分組,但最終會導致鋸齒狀線圖(例如,值 20 並不真正起作用)。

最大半徑值按其在Schwartzian 變換中的角度組值排序,如上一個答案所示,排序鍵cut在最後被刪除。

繪製結果:

在此處輸入圖像描述

改進建議:點的分組非常基本,您可能需要更仔細地執行此操作。討論如何做到這一點屬於https://math.stackexchange.com/範圍內

引用自:https://unix.stackexchange.com/questions/647835