2017-12-04 24 views
5

私は、2d平面上の2つの静的な軸に整列した図形の間でオーバーラップが発生したときを検出するメソッドを(C++で)実装しています。形は四角形または円のいずれかであるため、重なりを考慮する必要がある3つのケースがあります:四角形、丸形、丸形です。正方形と円の重なりを正確に検出するアルゴリズムはありますか?

正方形と円形の円は単純ですが、正しいアルゴリズムが四角形の重なりを計算するためにオンラインであることを確かめるために苦労しています。

私は円の内側に正方形を埋め込むことができます(またはその逆)ことはおおまかな方法​​として考えていますが、これをより正確に行う最もクリーンな方法とは何かに興味がありますか?

オンラインで調べると、この質問に対する「正しい」回答があることが示唆されていますが、その回答が正確であるかどうかは明確ではありません。広場は、中心とハーフサイズで表現されていることを

bool doesSquareCircleOverlap(float squareCenterX, float squareCenterY, float squareHalfSize, float circleCenterX, float circleCenterY, float circleRadius) { 
    float x = fabs(circleCenterX - squareCenterX) - squareHalfSize; 
    float y = fabs(circleCenterY - squareCenterY) - squareHalfSize; 

    if (x>0) { 
     if (y>0) { 
      return x*x + y*y<circleRadius*circleRadius; 
     } else { 
      return x<circleRadius; 
     } 
    } else { 
     return y<circleRadius; 
    } 
} 

注:

+1

https://stackoverflow.com/questions/401847/circle-rectangle-collision-detection-intersection –

+1

さらに一般的には、円の中心に近い矩形(正方形)の最も近い点を見つけます。形状がAAの場合、これは自明です。もしそうでなければ、ドットプロダクトはこれを与えるでしょう。この距離が円の半径よりも小さい場合、衝突が存在する。 ciricleが完全に四角形内に入っていない限り、各点を(中心から半径までの各頂点の距離)含めてチェックする必要があります。 –

+0

もっともきれいな方法は、Figureに格納されている情報によって異なります。あなたの円は3点の座標でモデル化されていますか、またはあなたは中心と半径を持っていますか?あなたの四角形、idem 3点、または何かのために?あなたは私が高校の数学に戻って幸せになることを私に教えてください! – Oliv

答えて

2

は、ここで簡単かつ迅速なアルゴリズムです。

基本的に、どのようなそれがないことである:それはfabs()

  • 対称のケースを除去

    • 上の最も近い点を決定するために、円の中心がある領域原点
    • チェックにコーナーを置きます円からの正方形。これが点を閉じるとcircleRadiusよりも近い場合、オーバーラップがあります。
  • 関連する問題