我有下面的代碼,它應該計算兩個矩形之間的歐幾里得距離。我使用GCC 4.7.3編譯和Boost v1.58.0Boost多邊形:用euclidean_distance發佈
#include <iostream>
#include <cmath>
#include <boost/polygon/polygon.hpp>
#include <boost/geometry.hpp>
namespace gtl = boost::polygon;
using namespace boost::polygon::operators;
typedef gtl::rectangle_data<int> LayoutRectangle;
int main(int argc, char** argv)
{
LayoutRectangle t(16740130,29759232,16740350,29760652);
LayoutRectangle n(16808130,29980632,16808350,29982052);
std::cout << gtl::euclidean_distance(t, n) << std::endl;
std::cout << gtl::euclidean_distance(t, n, gtl::HORIZONTAL) << " "
<< gtl::euclidean_distance(t, n, gtl::VERTICAL) << std::endl;
std::cout << gtl::square_euclidean_distance(t, n) << std::endl;
std::cout << std::sqrt(gtl::square_euclidean_distance(t, n)) << std::endl;
std::cout << (int) std::sqrt(gtl::square_euclidean_distance(t, n)) << std::endl;
return 0;
}
上面的代碼產生了以下的輸出:
38022.6
67780 219980
52985328800
230185
230185
正確答案是230185.現在,如果我在euclidean_distance實施去看看()在升壓多邊形庫,我看到:
template <typename rectangle_type, typename rectangle_type_2>
typename enable_if< typename gtl_and_3<y_r_edist2, typename is_rectangle_concept<typename geometry_concept<rectangle_type>::type>::type,
typename is_rectangle_concept<typename geometry_concept<rectangle_type_2>::type>::type>::type,
typename rectangle_distance_type<rectangle_type>::type>::type
euclidean_distance(const rectangle_type& lvalue, const rectangle_type_2& rvalue) {
double val = (int)square_euclidean_distance(lvalue, rvalue);
return std::sqrt(val);
}
這看起來等同於我的代碼std::sqrt(gtl::square_eclidean_distance(t,n))
行這給正確答案(230185)。那麼爲什麼我得到38022.6與gtl::euclidean_distance()
?我在這裏沒有看到什麼?
經過一番調查後,它看起來像一個bug。 https://svn.boost.org/trac/boost/ticket/12268 – user4979733