首页 > 解决方案 > 我的 object::collides(object * o) 函数总是返回 true,但什么也不做

问题描述

我有一个返回布尔值的函数。这个函数在编译时似乎什么都不包含,并且总是会返回 true,同时也会跳过我放入其中的所有对 cout 或 cin 的调用。看看它实际上在做什么。发生了什么事,我该如何解决这个问题。

在我的故障排除过程中,我有,

在 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

预期结果是“碰撞”函数输出到屏幕或请求输入该字符串,这将表明它实际上正确地通过了该部分代码。但是它不这样做。无论实际相交部分是真还是假,“碰撞”函数都会返回真,同时跳过我的所有调试代码,如输出所示。

编辑:

标签: c++ooppointersbooleandynamic-cast

解决方案


所以我的问题很简单,有点“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;
}

经验教训:即使您认为一切都正常工作,但有时您却没有,您应该检查并仔细检查您正在调用的每个函数,以防您认为正在工作的那些函数中的一个实际上并没有像它一样工作应该。


推荐阅读