Awk
過濾數據以僅生成最外層的點
我有以下數據,繪製時給了我以下數據
我想用線圖只保存和繪製最外層的點。請就如何進行此操作提出建議,並就如何過濾數據提出建議
一種天真的方法,就像我對上一個問題的回答一樣, 將笛卡爾座標轉換為極座標,然後根據角度對點進行分組,並在每個組中找到半徑最大的點:
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/範圍內