- ベストアンサー
図形が重なりあっているかどうか
VC++で 4つの頂点座標を持つ四角形 POINT pos[4] を示すオブジェクトが重なりあっているかどうか 簡単に判定する事はできないでしょうか? 数が多いのでできるだけ負担の無い処理にしたいのですが。 それぞれの線分が交差するかどうかを 計算していく方法以外に簡単にすます方法はあるのでしょうか。 また四角形と円についても同様に判定したいです。 円については中心座標と半径と四角形の4つの線分の傾きから 円との接線を求め、その式から交わっているかどうか判定する。 と私の中学レベルの数学の知識ではこの発想なのですが なにか良い方法が他にありましたら宜しくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
大事なことを忘れてました。 本来、リージョンは図形を描画するのに使うものなので、図形が重なっているかどうかの判定は、あくまでもドット単位になります。 なので、計算上は重なっていても、重なっていないと判定される、もしくは逆もありえますので、もし使うのでしたらそれを意識して使ってください。
その他の回答 (2)
- bikkuri
- ベストアンサー率33% (23/68)
単純な事なので、すでにされている気もしますが。 重なりを精密にチェックする前に、大まかにチェックし 必要のある物だけを再チェックすると速度が向上する可能性があります。 具体的には、各図形を内包す長方形を定義し、その長方形同士で 重なりをチェックしたりします。
お礼
ご回答有難うございます。 四角形でも長方形だけというわけではありません。ひし形や台形も含む四角形です。 計算速度を高めるため四角形に特化したものを作っていますが 汎用的に多角形にも対応したものも欲しいとおもっております。
補足
>具体的には、各図形を内包す長方形を定義し、その長方形>同士で 重なりをチェックしたりします。 もうしわけあいません。勘違いしました。 四角形を内包する長方形ですね。 参考にしたいと思います。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
リージョンを使うと、 CreatePolygonRgn()で、4つの点に囲まれたリージョンを作成し、CombineRgn()で合成されたリージョンがNULLリージョンじゃなかったら重なっていない。 なんてことができますが、 >数が多いのでできるだけ負担の無い処理にしたいのですが。 ということだと厳しいかも。 >また四角形と円についても同様に判定したいです。 これもリージョンで判定可能です。 円形のリージョンは、CreateEllipticRgn()で作成します。
お礼
早速のご回答有難うございます。 POINT pos[4] と書きましたが実は独自定義でdouble型でもっています。 CreatePolygonRgn()調べましたが、大変参考になりました。