【发布时间】:2022-01-17 09:34:10
【问题描述】:
下面的函数应该确定movingBall结构的两个对象是否相互“接触”
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 坐标,它们将水平对齐,但最左边的球的最右边的点不会接触到最右边的球的最左边的点。
附图说明了这个推理。当我实现代码时,并没有达到我想要的结果。程序无法正确检测两个圆之间的交点。
【问题讨论】:
-
这是一种非常复杂的测试两个圆是否接触的方法。为什么不只测试它们的中心之间的距离是否小于或等于 r1 + r2?或者更好的是,距离的平方小于或等于 r1*r1 + r2*r2... 所以你不需要计算任何平方根。
-
更正:
sq(dist) <= sq(r1 + r2)
标签: c++ arrays vector graphics geometry