私はライブラリメソッドに出くわしていません...または問題の解決策を鉢植えにしています。その理由は、問題を正確に解決することは根本的に不可能だからだと思います。
このクラスは、からGeneralPath
呼び出されたメソッドを継承します。javadoc を見ると、オブジェクトが一連の直線セグメントとしてパスをモデル化していることがわかります。このメソッドは、次のように指定されたパラメーターを受け取ります。getPathIterator
Shape2D
PathIterator
getPathIterator
flatness
平坦度 - 曲線セグメントを近似するために使用される線セグメントが元の曲線上の任意の点から逸脱できる最大距離。
ここで、見ている形状が直線セグメントで構成されている場合、パス反復子がそれらの線セグメントを提供する可能性が高くなります。ただし、形状に曲線セグメントがある場合、線セグメントは近似値にすぎません。また、正確な境界が何であるかがわからない場合、点が正確に境界上にあるかどうかをテストすることは明らかに不可能です。
線分が実際の曲線を正確にモデル化していると仮定しても、(特殊なケースを除いて) Java プリミティブ データ型 (int、double など) を使用して実際の曲線上のほとんどの点を正確に表すことができないという問題がまだあります。繰り返しになりますが、「正確さ」は問題です。
期待できる最善の方法は、ポイントが境界の小さなデルタ内にあるかどうかをテストすることだと思います...そしてflatness
そのデルタよりも小さい値を選択し、パスラインセグメントを繰り返し、各セグメントからのポイント。
注:flatness
非常に小さくすると、非常に多数の線分をテストする必要が生じることが予想されます。GeneralPath APIに固執している間、この計算上の懸念を回避する方法はないと思います。
問題を真の (つまり、直線の) 多角形に限定する場合は、単純に線分を反復し、点から線までの距離が適切なイプシロンよりも小さいかどうかをテストするだけです。 このウィキペディアのエントリは、数学を提供します。ここでは正確さが依然として懸念されることに注意してください...
非常にコストのかかる計算はありませんが、正確な平方根の計算は無料ではなく、N 辺の多角形に対して最大 N 回実行する必要があります。
それよりもうまくやること (つまり、より良くなることO(N)
) は難しいでしょう。ただし、ポリゴンが固定されていて、それに対して膨大な数のポイントをテストする場合は、四分木データ構造の事前計算を使用して解決を行うことを検討できます。四分木の事前計算にはコストがかかりますが、N が十分に大きい場合、ポイントのテストは安価になります。(平均O(log(1/epsilon))
ではなく、おおよそ最悪の場合O(N)
です。また、点が境界から離れているほど、答えは安くなります。)
しかし、私が言ったように、四分木は限られた状況でしか役に立ちません...