
私は以下を持っていますデータ、プロットすると、次の結果が表示されます。
線プロットとして保存し、最も外側の点だけをプロットしたいと思います。これを行う方法を提案し、データをフィルタリングする方法を提案します。
答え1
次のような素朴なアプローチ私の答え前の質問に関しては、 デカルト座標を極座標に変換、角度に基づいて点をグループ化し、各グループの半径が最も大きい点を探します。
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は機能しません)。
角度グループ値でソートされた最大半径値シュワルツ変換cut
、前の回答からわかるように、最後にソートキーが削除されます。
結果をプロットします。
改善提案:ポイントのグループ化非常に基本的なこれをより慎重に行う必要があるかもしれません。これを行う方法の議論はhttps://math.stackexchange.com/