ポイントが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);
上記のコードの実行後、ret1
とret2
は両方ともtrue
. しかし、私は持っているでしょうret1 != ret2
。
ret1 != ret2
一般に、いつでも機能する必要がありますtestPoint
(ここでは、ポイントが正確に境界線上にある場合やポリゴンが縮退している場合など、境界線のケースは考慮しません...)
に渡すためにさまざまな戦略を試しましboost::geometry::within
たが、必要なものが得られませんでした。
内部のドキュメントには穴のあるポリゴンの例があるboost::geometry
ため、必要な機能または類似の機能が のどこかに実装されているようです。しかし、私は自分の場合にそれを使用する方法を理解していません。
非常に簡単な回避策もあります。輪郭の向きを決定するコードを書くだけです。within
次に、輪郭の向きに応じて、関数の結果を否定するか否定します。しかし、boost::geometry
すでに実装されている場合は、複製したくありません。