c++ - 我的 object::collides(object * o) 函数总是返回 true,但什么也不做
问题描述
我有一个返回布尔值的函数。这个函数在编译时似乎什么都不包含,并且总是会返回 true,同时也会跳过我放入其中的所有对 cout 或 cin 的调用。看看它实际上在做什么。发生了什么事,我该如何解决这个问题。
在我的故障排除过程中,我有,
- 在 object::collides 处使用带有断点的 GDB,这导致函数被调用但没有向控制台输出任何内容
- 将我的对象编号并比较程序认为正在碰撞的对象与正在碰撞的对象。如果它通过了接近测试,则程序认为对象正在碰撞,证明它总是返回 true。
- 尝试了各种其他方法来试图弄清楚发生了什么,但都让我没有答案
在 object.cpp 中:
bool object::collides(object * other)
{
std::vector<point> a_pnt = getBounds();
std::vector<point> b_pnt = other->getBounds();
for (int i = 0; i < a_pnt.size(); i++)
{
for (int j = 0; j < b_pnt.size(); j++)
{
point v1 = a_pnt[i];
point v2 = a_pnt[(i+1)%a_pnt.size()];
point v3 = b_pnt[j];
//edit: fixed typo
point v4 = b_pnt[(j+1)%b_pnt.size()];
double num_1 = ((v3.x - v1.x) * -(v4.y - v3.y)) - (-(v4.x - v3.x) * (v3.y - v1.y));
double num_2 = ((v2.x - v1.x) * (v3.y - v1.y)) - ((v3.x - v1.x) * (v2.y - v1.y));
double den =((v2.x - v1.x) * -(v4.y - v3.y)) - (-(v4.x - v3.x) * (v2.y - v1.y));
double frac_1 = num_1 / den;
double frac_2 = num_2 / den;
//debug code start
std::cout << num_1 << "/" << den << "=" << frac_1 << std::endl;
std::cout << num_2 << "/" << den << "=" << frac_2 << std::endl;
std::cout << (frac_1 > 0.0) << " " << (frac_1 < 1.0) << " " << (frac_2 > 0.0) << " " << (frac_2 < 1.0) << std::endl;
std::cout << std::endl;
std::string hahah;
std::cin >> hahah;
//end debug code
//edit: fixed conditional
if((frac_1>0.0)&&(frac_1<1.0)&&(frac_2>0.0)&&(frac_2<1.0));
return true;
}
}
//edit: fixed conditional
return false;
}
在 mode.cpp 中的功能mode::step()
:
for (int i = 0; i<onScreen.size(); i++)
{
object * o1 = onScreen[i];
for(int j = i+1; j<onScreen.size(); j++)
{
object * o2 = onScreen[j];
if(o1->getVectorLength(o2)<50){
std::cout << "Checking collisions for objects " << i << " and " << j << std::endl;
if(o1->collides(o2))
{
std::cout << "somthing collided\n";
}
}
}
}
输出:
Checking for Collisions
Checking collisions for objects 0 and 11
somthing collided
Checking collisions for objects 1 and 8
somthing collided
Checking collisions for objects 1 and 18
somthing collided
Checking collisions for objects 1 and 26
somthing collided
预期结果是“碰撞”函数输出到屏幕或请求输入该字符串,这将表明它实际上正确地通过了该部分代码。但是它不这样做。无论实际相交部分是真还是假,“碰撞”函数都会返回真,同时跳过我的所有调试代码,如输出所示。
编辑:
- 修复了碰撞中的返回
- 修正了一个错字
- 还是不行。
确实会考虑子弹/子弹组合而不是子弹/小行星或小行星/小行星的循环
检查 getBounds 让我摸不着头脑......
std::vector asteroid::getBounds() { //我的问题在这里,更仔细地检查你的函数:P //没有返回一个包含任何东西的向量。标准::向量 t; //现在是 std::vector t = lyrs[0].pnts;
for (int i = 0; i < t.size(); i++) { double x = t[i].x+location.x; double y = t[i].y+location.y; t[i] = point{x, y, t[i].z}; } return t;
}
我认为这是正确实施的
解决方案
所以我的问题很简单,有点“doh”的时刻。首先,我必须解决的未实现的问题是返回 true,无论我的数学是否真的正确完成,但由于这部分没有被击中,这不是真正的问题。感谢那些无论如何注意到它的人。
问题一(如果返回 true,则否):
在collides.cpp中
for (int i = 0; i < a_pnt.size(); i++)
{
for (int j = 0; j < b_pnt.size(); j++)
{
...
return true;
}
}
固定为:
for (int i = 0; i < a_pnt.size(); i++)
{
for (int j = 0; j < b_pnt.size(); j++)
{
...
if((frac_1>0.0)&&(frac_1<1.0)&&(frac_2>0.0)&&(frac_2<1.0))
return true;
}
}
第二个问题,也是主要问题,根据评论者的建议,他的名字出现在上面的问题中,我仔细检查了我的 getter 的边界框。低,看哪,那是我的问题。虽然一开始我对他的建议不以为然,因为我认为我已经完全实现了那个 getter,但这是我的问题,学习有价值的课程总是一件好事。
问题二(GetBounds 实现不完整,导致返回空向量。):
在 asteroids.cpp 中:
std::vector asteroid::getBounds()
{
//my issue was here, check your functions a bit more closely :P
//wasn't returning a vector with anything in it.
std::vector<point> t;
//now it's
std::vector<point> t = lyrs[0].pnts;
for (int i = 0; i < t.size(); i++)
{
double x = t[i].x+location.x;
double y = t[i].y+location.y;
t[i] = point{x, y, t[i].z};
}
return t;
}
经验教训:即使您认为一切都正常工作,但有时您却没有,您应该检查并仔细检查您正在调用的每个函数,以防您认为正在工作的那些函数中的一个实际上并没有像它一样工作应该。
推荐阅读
- flutter - 颤振动画奇怪的行为
- google-chrome - 无法在 RHEL 7 上安装 chrome
- xcode - 更改矢量 PDF 资产的 Xcode“图像大小”
- javascript - 是否可以为 Java & JavaScript/TypeScript 创建库
- android - LazyColumn 可以与 CoordinatorLayout 一起使用吗?
- android - 如何在 Unity 中使矩形精灵粘在一侧?
- python - 使用 pach 标准化图像
- node.js - 过滤 fromdate 和 todate MongoDB
- python-3.x - 从完整的 xpath 生成 xml
- assemblyscript - Webassembly如何获取f64的指针或引用