1

図形、より具体的にはGeneralPathオブジェクトに(Line2D.Doubleタイプの)任意の線分が含まれているかどうかを判断するための最も簡単/最速の(計算上の)方法を探しています。

GeneralPathには、または長方形が含まれているかどうかを判断するメソッドがありますが、線は含まれていません(私が見つけることができます)。線が斜めになることがあるので、本当に細い長方形をモデル化することはできません。ラインの1つのポイントは間違いなくシェイプの内側にありますが、残りのラインセグメントを確認する必要があります。したがって、潜在的に、線が境界エッジのいずれかと交差するかどうかを確認することもできますが、形状と線を指定すると、それがどのように見えるかはわかりません。

4

2 に答える 2

2

GeneralPathには、直線セグメントまたは2次セグメントまたはベジェセグメントが含まれていますか?これは非常に重要です。直線のアルゴリズムは最も簡単です。

パス内のすべてのポイントを繰り返し処理します。2つの連続するポイントが線の反対側にある場合、交差する可能性があります。次に、線分の終点が潜在的な交差に対して形状の内側にあるか外側にあるかを確認する必要があります。これは、2つの点(2つの連続する点によって形成される線と線)の交点を解いて、次のことを確認することで得られます。結果はラインセグメントに含まれます。

残念ながら、曲線のパスには2つの連続したポイントがあり、その間に括弧の形があります ")"。これは、同じ側の反復可能なポイントを維持しながら、ラインが通過できるものです。境界三角形(四辺形)を形成する2つの端点と1つの(二重)制御点を持つ形式を取得できる場合は、簡単な簡単な解決策を取得できます(曲線が形成された三角形/四角形の内側に収まることが保証されているため)線が三角形/四角形と交差しない限り、3/4ポイントで問題ありません)。残念ながら、これにも醜い部分があります三角形/クワッドと交差します。何も保証されていないため、詳しく確認する必要があります。残念ながら、座標系を正規化してゼロを解く以外のテクニックはわかりません。そして、それは私が見つけられないように見える本で調べたものです(または別の素敵なSOポスターが来るまで待ちます)。

...実際には、形状の曲率プロパティは回転時に不変であるため、より詳細な検査パーツでは、カーブポイント(3または4)を回転させて軸を揃えることができます。次に、細い長方形のトリックを実行します。それはおそらく最もクリーンではありませんが、最も明白なトリックです。

そういえば、そもそもすべての点を回転させてみませんか?交差点の問題全体は回転不変です。それは多くのコードを節約するでしょう。線を軸に揃え、形状に変換を適用して、生意気な長方形のトリックを実行するだけです。

于 2011-06-14T04:19:37.350 に答える
0

何かが足りない場合を除いて、パスにx1、y1とx2、y2、およびAND次の2つが含まれているかどうかを確認できないのはなぜですか。

generalPath.contains(line.getX1(),line.getY1()) &&
generalPath.contains(line.getX2(),line.getY2()) 
于 2011-06-14T05:25:55.863 に答える