下面的函式應該確定移動球結構的兩個物件是否相互“接觸”
bool areBallstouching(movingBall one, movingBall two)
{
int xMin, xMax, yMin, yMax;
int TxMin, TxMax, TyMin, TyMax;
xMin = one.xPosition - one.radius;
xMax = one.xPosition one.radius;
yMin = one.yPosition - one.radius;
yMax = one.yPosition one.radius;
//===================================
TxMin = two.xPosition - two.radius;
TxMax = two.xPosition two.radius;
TyMin = two.yPosition - two.radius;
TyMax = two.yPosition two.radius;
//=======================================
vector <int> xrange, yrange, Txrange, Tyrange;
bool xtouch = false; bool ytouch = false;
for (int i = xMin; i < xMax; i )
{
xrange.push_back(i);
}
for (int i = yMin; i < yMax; i )
{
yrange.push_back(i);
}
for (int i = TxMin; i < TxMax; i )
{
Txrange.push_back(i);
}
for (int i = TyMin; i < TyMax; i )
{
Tyrange.push_back(i);
}
for (int i = 0; i < xrange.size(); i )
for (int j = 0; j < Txrange.size(); j )
if (xrange[i] == Txrange[j])
xtouch = true;
for (int i = 0; i < yrange.size()-1; i )
for (int j = 0; j < Tyrange.size()-1; j )
if (yrange[i] == Tyrange[j])
ytouch = true;
if (xtouch == true && ytouch == true)
{
return true;
}
else
{
return false;
}
}
我推斷球只有在共享任何兩個坐標時才能相互接觸。如果它們僅共享一個 x 坐標,則它們將垂直對齊,但最頂部球的底部點不會接觸最底部球的頂部點。如果它們僅共享一個 y 坐標,則它們將水平對齊,但最左側球的最右側點不會接觸最右側球的最左側點。

附圖說明了這一推理。當我實作代碼時,并沒有達到我想要的結果。該程式無法正確檢測兩個圓之間的交點。
uj5u.com熱心網友回復:
從數學上講,兩個圓接觸的點會將它們的中心位置分開的距離等于兩個半徑的總和。它跟隨:
- 如果中心之間的距離小于半徑之和,則圓相交;
- 如果中心之間的距離大于半徑之和,則圓不會相交(或接觸)。
因此,您只需要使用基本的畢達哥拉斯進行簡單的距離計算。
float dx = two.xPosition - one.xPosition;
float dy = two.yPosition - one.yPosition;
float distsq = dx * dx dy * dy; // square distance between centers
float r = one.radius two.radius; // sum of radii
float rsq = r * r;
bool intersect_or_touch = (distsq <= rsq);
請注意,上面我們可以在平方距離和平方半徑的域中進行操作,以避免需要使用sqrt計算。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/380358.html
