まず、円と正方形の表し方を明確にしましょう。
慣例ではsquare
、 は次のように表されます。
squarexX, squareY + height ------------ squareX+ width, squareY +height
| |
| |
squareX, squareY ------------- squareX + width, squareY
Whileは、円 と値circle
の座標で表されます。これを念頭に置いて、独自の関数をコーディングすることさえできるはずです。円には幅も高さもありません。(circleX, circleY)
radius
だから彼らのコードで:
if(circleX < squareX) distance += pow(circleX - boxX,2); //x-axis
する必要があります
if(circleX < squareX) distance += pow(circleX - squareX,2); //x-axis
正方形が円と重なっている/衝突しているかどうかを判断するための考え方は次のとおりです。
- 正方形が 2D 平面の原点にあると仮定します。そうでない場合は、原点を正方形の中心に移動できます。
- 次に、円と正方形の最も近いエッジの交点の間の距離を見つけます。この距離が半径より大きい場合は重なりません。それ以外の場合は重なります。特殊なケースとして、円が正方形の内側にある場合、いわゆる交点は円自体の中心になります。この場合、testForCollision は true を返します。
完全な関数は次のようになります。
//this function computes the distance between center of circle
//to closest point on one of the edges of square, that edge is on the
//same side as the circle
#include <algorithm>
bool testForCollision(int circleX, int circleY, int width, int height, int radius)
{
int dx = std::min(circleX, (int)(width * 0.5));
int dx1 = std::max(dx, (int)(-width *0.5));
int dy = std::min(circleY, (int)(height * 0.5));
int dy1 = std::max(dy, (int)(-height * 0.5));
return (dx1 - circleX) * (dx1 - circleX)
+ (dy1 - circleY) * (dy1 - circleY) <= radius * radius;
}
bool Collision(int circleX, int circleY, int radius,
int squareX, int squareY, int width, int height)
{
//get center of square
int center_of_square_x = squareX + width/2;
int center_of_square_y = squareY + height/2;
//if square is already at origin, test directly
if ( center_of_square_x == 0 && center_of_square_y ==0)
{
return testForCollision(circleX, circleY, width, height, radius);
}
else
{
//shift center of square to origin and update coordinates of circle
//only consider part of the situation, more to add about shifting
circleX = circleX - center_of_square_x;
circleY = circleY - center_of_square_y;
return testForCollision(circleX, circleY, width, height, radius);
}
}
このようにして、円と正方形が互いに衝突するかどうかを識別できるはずです。
編集: 1 つのテスト ケースを見てみましょう:
circleX = 60 circleY = 172 radius = 39
squareX = 120 squareY = 180 width = 72 height = 72
正方形の座標は次のとおりです(中心を含む)
120, 252 -------- 192, 252
| |
|--------156,216----|
| |
120,180 ---------192,180
(60,172) がエッジ (120,252) の左側にあることがわかります-->(120,180)、(120,180) と (60,72) の間の距離は 39 よりも大きいです。 (120,252) と (60,72) の間の距離も 39 より大きく、重複はありません。理解を深めるために、円の中心 (60,172) と半径 39 を考えると、円の中心から到達できる x と y の範囲は (60-39,60 +39) = (21,99) および ( 172-39, 172+39) = (133,211). 視覚化すると、これは正方形と重なってはいけません。
最初に原点を (156,216) に変換すると、新しい座標系の円の中心は (-96,-44) になります。それは第 3 象限にあります。testForCollision 関数を実行すると、重複がないことがわかります。
dx = min(-96,36) = -96
dx1 = max(dx, -36) = -36
dy = min(-44, 36) = -44
dy1 = max(dy,-36) = -36
distance = (-36 - (-96))^2 + (-36 - (-44))^2 = 60^2 + 8^2 > 39^2, so no overlap