• ベストアンサー

図形が重なりあっているかどうか

VC++で 4つの頂点座標を持つ四角形 POINT pos[4] を示すオブジェクトが重なりあっているかどうか 簡単に判定する事はできないでしょうか? 数が多いのでできるだけ負担の無い処理にしたいのですが。 それぞれの線分が交差するかどうかを 計算していく方法以外に簡単にすます方法はあるのでしょうか。 また四角形と円についても同様に判定したいです。 円については中心座標と半径と四角形の4つの線分の傾きから 円との接線を求め、その式から交わっているかどうか判定する。 と私の中学レベルの数学の知識ではこの発想なのですが なにか良い方法が他にありましたら宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

大事なことを忘れてました。 本来、リージョンは図形を描画するのに使うものなので、図形が重なっているかどうかの判定は、あくまでもドット単位になります。 なので、計算上は重なっていても、重なっていないと判定される、もしくは逆もありえますので、もし使うのでしたらそれを意識して使ってください。

sha-girl
質問者

お礼

早速のご回答有難うございます。 POINT pos[4] と書きましたが実は独自定義でdouble型でもっています。 CreatePolygonRgn()調べましたが、大変参考になりました。

その他の回答 (2)

  • bikkuri
  • ベストアンサー率33% (23/68)
回答No.3

単純な事なので、すでにされている気もしますが。 重なりを精密にチェックする前に、大まかにチェックし 必要のある物だけを再チェックすると速度が向上する可能性があります。 具体的には、各図形を内包す長方形を定義し、その長方形同士で 重なりをチェックしたりします。

sha-girl
質問者

お礼

ご回答有難うございます。 四角形でも長方形だけというわけではありません。ひし形や台形も含む四角形です。 計算速度を高めるため四角形に特化したものを作っていますが 汎用的に多角形にも対応したものも欲しいとおもっております。

sha-girl
質問者

補足

>具体的には、各図形を内包す長方形を定義し、その長方形>同士で 重なりをチェックしたりします。 もうしわけあいません。勘違いしました。 四角形を内包する長方形ですね。 参考にしたいと思います。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

リージョンを使うと、 CreatePolygonRgn()で、4つの点に囲まれたリージョンを作成し、CombineRgn()で合成されたリージョンがNULLリージョンじゃなかったら重なっていない。 なんてことができますが、 >数が多いのでできるだけ負担の無い処理にしたいのですが。 ということだと厳しいかも。 >また四角形と円についても同様に判定したいです。 これもリージョンで判定可能です。 円形のリージョンは、CreateEllipticRgn()で作成します。

関連するQ&A

専門家に質問してみよう