0

重複の可能性:
2つの長方形が互いに重なり合っているかどうかを判断しますか?

xとyの位置とサイズがわかっている2つの正方形があることを考えると、オブジェクトが互いに衝突するかどうかを確認したい場合に使用する式は何でしょうか。

if(   ((shapeA->getX() - shapeA->getSize()) > (player->getX() - player->getSize())
    && (shapeA->getX() + shapeA->getSize()) < (player->getX() + player->getSize()))
    && (shapeA->getY() - shapeA->getSize()  > player->getY() - player->getSize()
    && (shapeA->getY() + shapeA->getSize()) < (player->getY() + player->getSize()))
                )

これは機能しますが、奇妙に機能します(常にではありません)。私は何かが欠けているに違いない

4

4 に答える 4

4

長方形が別の長方形と交差しているか、接触しているかを確認するのは非常に簡単です。次の写真を見てください。

長方形の交差点

ご覧のとおり、([x、x + a]と[X、X + A])と([y、y + b]と[Y、Y + B])の交点が両方とも一致しない場合、2つの長方形が交差します。 t空。

struct Rectangle{
    bool intersects(const Rectangle&);

    unsigned int a; //!< width of the rectangle
    unsigned int b; //!< height of the rectangle
    unsigned int x; //!< x position
    unsigned int y; //!< y position
};

bool Rectangle::intersects(const Rectangle& oRectangle){        
    return  (x < oRectangle.x + oRectangle.a) && // [x,x+a], [X,X+A] intersection
            (oRectangle.x < x + a)            && // [x,x+a], [X,X+A] intersection
            (y < oRectangle.y + oRectangle.b) && // [y,y+b], [Y,Y+B] intersection
            (oRectangle.y < y + b);              // [y,y+b], [Y,Y+B] intersection
}

したがって、コードは次のようになります。

if(((shapeA->getX() + shapeA->getSize()) > (player->getX()) // x intersection
    && (shapeA->getX() < (player->getX() + player->getSize())) // x intersection
    && (shapeA->getY() < player->getY() + player->getSize()  // y intersection
    && (shapeA->getY() + shapeA->getSize()) > player->getY())  // y intersection
)
于 2012-05-31T10:20:26.067 に答える
2

getX / Yが正方形の左下隅を与えると仮定すると、

shapeMinX = shapeA; shapeMaxX = shapeB;
if (shapeA()->getX() > shapeB()->getX())
  swap (shapeMinX, shapeMaxX);
shapeMinY = shapeA; shapeMaxY = shapeB;
if (shapeA()->getY() > shapeB()->getY())
  swap (shapeMinY, shapeMaxY);

collision = (shapeMinX->getX()+shapeMinX->size() >= shapeMaxX()->getX) || (shapeMinX->getY()+shapeMinY->size() >= shapeMaxY()->getY);
于 2012-05-31T10:14:57.597 に答える
2

あなたは間違ったテストをします、これを試してください:

int left_bound_A=  shapeA->getX()-shapeA->getSize();
int right_bound_A= shapeA->getX()+shapeA->getSize();
int top_bound_A= shapeA->getY()-shapeA->getSize();
int bottom_bound_A= shapeA->getY()+shapeA->getSize();

int left_bound_B=  shapeB->getX()-shapeB->getSize();
int right_bound_B= shapeB->getX()+shapeB->getSize();
int top_bound_B= shapeB->getY()-shapeB->getSize();
int bottom_bound_B= shapeB->getY()+shapeB->getSize();

if( left_bound_A < right_bound_B &&
    right_bound_A > left_bound_B &&
    top_bound_A > bottom_bound_B &&
    bottom_bound_A < top_bound_B ) colide(shapeA,shapeB);

一般的な方法は、形状の交差をテストすることです。BoxまたはRectangleクラスを実装する場合、コードは次のように簡略化されます。

 Box colision= intersect( shapeA->getBoundBox(), shapeB->getBoundBox() );
 if( colision.have_positive_area() )
     colide(shapeA,shapeB,colision);
于 2012-05-31T10:29:08.480 に答える
0

はい、2つの長方形が簡単かどうかを確認する方法は簡単です。提案として、長方形のリスト内の長方形間のすべての可能な交差を計算する場合は、境界のxを増やして事前に並べ替えてから、この関係を利用して比較を開始します。この質問は役立つかもしれません

交差する長方形をすばやく非表示にすることは興味深い場合があります

于 2012-05-31T11:01:38.157 に答える