2016-07-06 219 views
3

代碼: 我正在使用boost_1_61_0。我正在使用GIS應用程序庫的幾何部分。這個想法是找到定義區域內的點(在這種情況下是一個矩形)。這有時候但並非總是有效。下面是一個例子,其中的點應該是在矩形內,但不是...boost :: geometry :: within對於地理座標系中的點失敗---爲什麼?

我有以下的測試案例:

#include <boost/geometry.hpp> 
#include <boost/geometry/geometries/polygon.hpp> 
#include <boost/geometry/multi/geometries/multi_polygon.hpp> 
#include <boost/geometry/geometries/register/point.hpp> 
#include <iostream> 
#include <boost/geometry/io/wkt/wkt.hpp> 

class wxPoint 
{ 
public : 
    double getx() const 
    { 
     return m_x; 
    } 
    double gety() const 
    { 
     return m_y; 
    } 
    void setx(double in) 
    { 
     m_x = in; 
    } 
    void sety(double in) 
    { 
     m_y = in; 
    } 
private: 
    double m_x; 
    double m_y; 
}; 

BOOST_GEOMETRY_REGISTER_POINT_2D_GET_SET(
    wxPoint, 
    double, 
    boost::geometry::cs::geographic<boost::geometry::degree>, 
    wxPoint::getx, 
    wxPoint::gety, 
    wxPoint::setx, 
    wxPoint::sety) 

int main() 
{ 
    boost::geometry::model::polygon<wxPoint> poly; 

    boost::geometry::read_wkt("POLYGON((0 89, 180 89, 180 0, 0 0, 0 89))", poly); 

    wxPoint point; 
    point.setx(150); 
    point.sety(88); 

    bool within = boost::geometry::within(point, poly); 


    return 0; 
} 

我希望withintrue但它是false。爲什麼它是false

+0

只需要注意,如果有人認爲在88處y的點可能有點極端,那麼它也會失敗,例如y = 50. –

回答

1

在進一步的調查,見對方的回答我的意見,看來這是提升幾何形狀如何建立你給它的多邊形的差異。

當我們給出一個0 0到180 0的點時,這個增強土地在這種情況下實際上將世界包裹在西部,而不是東部,因爲我相信你期待着。

爲了防止這種情況發生,我建議插入一個額外的點來打破經度分量大於或等於180度的任何單個頂點。這會強制按照你想要的方向而不是最短距離進行繪圖。

+0

很酷。謝謝... –

1

如果不按順時針順序放置點,則boost::geometry::within可能未定義。

嘗試boost::geometry::read_wkt("POLYGON((0 89, 0 0, 180 0, 180 89, 0 89))", poly);,而不是

+0

當然,開場帖已經是順時針方向了嗎? – Saurbaum

+0

您可能正在使用左下角的原點。大多數電腦圖形,包括提升,從左上角開始。 – Ryan

+0

我已經離開並獲取提升以嘗試嘗試,並將多邊形更改爲您建議的多邊形不會改變它的工作。更奇怪的是,只要你消除了0 0作爲多邊形中的一個點並用1取代它,它就使用任一方向。它並沒有明確地回答誰在使用方向上是正確的,但我認爲它是指向使用read_wrt或在()內構建多邊形的嚴重問題 – Saurbaum

相關問題