我有std::set<std::pair<float,float>>
它代表地圖上的點(2d,x和y值),我有一個值x1和y1的點。如何按照距離點(x1,y1)的升序排列設置?如何按距離點(x1,y1)的升序對座標進行排序?
回答
std::set是一個有序的容器,並且在插入時發生排序,這取決於可以用第二個模板參數指定的排序標準。因此,使用帶有謂詞的set
,該謂詞根據到參考點的距離返回true或false。
struct DistanceCompare
{
DistanceCompare(const std::pair<float,float>& point) : point_(point) {}
bool operator()(const std::pair<float,float>& lhs,
const std::pair<float,float>& rhs) const
{
return distance2(lhs) < distance2(rhs);
};
private:
float distance2(const std::pair<float,float>& point) const
{
// calculate distance squared between point and point_
const float x = point.first - point_.first;
const float y = point.second - point_.second;
return x*x + y*y;
}
std::pair<float, float> point_;
};
....
std::pair<float,float> refPoint = ....;
DistanceCompare comp(refPoint);
std::set<std::pair<float, float>, DistanceCompare> pointSet(comp);
這足以比較平方的距離,從而避免調用std::sqrt
。
您忘記將'DistanceCompare'的實例傳遞給pointSet的構造函數。如圖所示,你的例子不會編譯,因爲'DistanceCompare'沒有默認的構造函數。 – atzz
@atzz謝謝,修正。 – juanchopanza
@juanchopanza謝謝你的回答。我添加了像你說的代碼,但是當我嘗試插入pointSet時,出現錯誤C2228錯誤:'.insert'的左側必須有class/struct/union。任何想法 ? – Damir
兩個點之間的距離可以被計算如下:
xd = x2-x1;
yd = y2-y1;
Distance = SquareRoot(xd*xd + yd*yd);
和Distance
值可以用作排序參數。
- 1. 按原點距離對座標數組進行排序
- 2. 按照Django在Amazon RDS上的距離對點進行排序
- 3. 如何按距離對Solr查詢進行排序?
- 4. 按升序對數組進行排序
- 5. 按升序對數字進行排序
- 6. 按鈕無法繪製其座標(x1,x2,y1,y2)的線圖
- 7. 如何按距離升序排序一個NSmutable數組?
- 8. 按距離排序
- 9. 算法根據距離源的距離對圖中的頂點進行排序
- 10. 如何按數字升序對對象數組進行排序?
- 11. VB如何按升序和降序對ListView進行排序
- 12. 如何按升序對字典的多個值進行排序?
- 13. 如何根據距離數據庫的距離對數組進行排序
- 14. 如何從地圖座標獲取x1,y1,x2,y2 javascript?
- 15. 如何用點(x1,y1)和角度
- 16. 你如何找到從點(x1,y1)給定的垂線的座標
- 17. Android的排序按距離
- 18. Django的按距離排序
- 19. 按距離對結果列表進行排序
- 20. 在Swift中按距離對UItableview進行排序
- 21. 在Swift中按計算距離對數組進行排序
- 22. 按距離當前位置對TableView進行排序
- 23. 如何按給定點距離排序行,mysql?
- 24. 如何使用Perl按升序對日期進行排序?
- 25. Python - 如何按升序對數值列表進行排序
- 26. 如何按升序對IntStream進行排序?
- 27. 如何按升序對多維數組輸出進行排序?
- 28. 如何按升序對文件名進行排序?
- 29. 如何按升序對Firebase鍵進行排序?
- 30. 如何在分段表視圖中對距離進行排序?
你知道如何計算距離嗎? –
編寫您自己的謂詞來檢查您添加的集合點與給定點的距離更小或更大,並使用該比較方法創建集合,集合將自動對其元素進行排序。 – MarsRover