FPS算法的邏輯為:
- 以點雲第一個點,作為查詢點,從剩余點中,取一個距離最遠的點;
- 繼續以取出來的點,作為查詢點,從剩余點中,取距離最遠的點。此時,由於已經取出來的點的個數大於1,需要考慮已經選出來的點集中的每個點。計算邏輯如下:
- 對於任意一個剩余點,計算該點到已經選中的點集中所有點的距離;
- 取最小值,作為該點到點集的距離;
- 計算出每個剩余點到點集的距離后,取距離最大的那個點。
- 重復第2步,一直采樣到目標數量N為止。
從FPS算法邏輯上看,第1步可以認為是只有一個集合的點,所以可以統一按照第2步點邏輯來實現。在PointNet++源碼中,有基於cuda的並行計算實現,實現細節可參考源碼:https://github.com/charlesq34/pointnet2/blob/42926632a3c33461aebfbee2d829098b30a23aaa/tf_ops/sampling/tf_sampling_g.cu#L105