0

ポイントがboost::geometryでポリゴン内にあるかどうかを判断したい。

関数boost::geometry::withinと typeを使用boost::geometry::linear_ring<boost::geometry::point_2d>して輪郭を指定します。

輪郭の向きを考慮する必要がなければ、すべて正常に機能します。
しかし、私の場合、オリエンテーションを説明したいと思います。つまり、特定の輪郭の内部領域がその境界によって制限され、有限であると見なされる場合、逆輪郭の内部領域は無限である必要があります-初期輪郭の領域を補完します。

within関数で輪郭の方向を考慮することは可能ですか?

次のコードで表現できます。

// Create contour which defines square
boost::geometry::linear_ring<boost::geometry::point_2d> contour;
contour.push_back(boost::geometry::point_2d(4, 2));
contour.push_back(boost::geometry::point_2d(2, 2));
contour.push_back(boost::geometry::point_2d(2, 4));
contour.push_back(boost::geometry::point_2d(4, 4));
contour.push_back(boost::geometry::point_2d(4, 2));

// Create contour which defines square with opposite direction.
boost::geometry::linear_ring<boost::geometry::point_2d> contourInverted = contour;
std::reverse(contourInverted.begin(), contourInverted.end());

// Specify point inside square
boost::geometry::point_2d testPoint(3, 3);

// Perform tests
bool ret1 = boost::geometry::within(testPoint, contour);
bool ret2 = boost::geometry::within(testPoint, contourInverted);

上記のコードの実行後、ret1ret2は両方ともtrue. しかし、私は持っているでしょうret1 != ret2

ret1 != ret2一般に、いつでも機能する必要がありますtestPoint(ここでは、ポイントが正確に境界線上にある場合やポリゴンが縮退している場合など、境界線のケースは考慮しません...)

に渡すためにさまざまな戦略を試しましboost::geometry::withinたが、必要なものが得られませんでした。

内部のドキュメントには穴のあるポリゴンの例があるboost::geometryため、必要な機能または類似の機能が のどこかに実装されているようです。しかし、私は自分の場合にそれを使用する方法を理解していません。

非常に簡単な回避策もあります。輪郭の向きを決定するコードを書くだけです。within次に、輪郭の向きに応じて、関数の結果を否定するか否定します。しかし、boost::geometryすでに実装されている場合は、複製したくありません。

4

2 に答える 2

2

私の知る限り、Boost.GeometryもBoost.Polygonも、定義した「無限」の領域では機能しません。穴のあるポリゴンや、そのようなポリゴンのセットでも機能します。

ユニバースを制限する大きな長方形を追加することを検討してください。次に、そのような長方形の穴として反転輪郭を定義できます。

ところで、多くの場合、ボックスを輪郭に変換することを避けることができます。Boost.Geometry は、ボックスを (正方向の) 輪郭であるかのように使用できるアダプター「box_view」を提供します。

任意の輪郭の向きに関しては、おそらく最も簡単な方法はその面積を計算することです。一方、整形式リングの場合、方向はコンパイル時に認識され、 meta-functions によって提供され traits::point_orderます。詳細はこちらを参照してください

于 2013-11-16T06:01:50.140 に答える