Моя функция object :: collides (object * o) всегда возвращает true, но ничего не делает - PullRequest
0 голосов
/ 07 января 2019

У меня есть функция, которая возвращает логическое значение. эта функция при компиляции, кажется, ничего не содержит и всегда возвращает true, а также пропускает все вызовы cout или cin, которые я в нее вставил. чтобы увидеть, что он на самом деле делает. Что происходит и как я могу решить эту проблему.

В процессе устранения неполадок у меня есть

  • использовал GDB с точкой останова на объекте :: collides, в результате была вызвана функция, но ничего не выводилось на консоль
  • Пронумеровал мои объекты и сравнил, какие объекты программа считает конфликтующими с объектами, которые сталкиваются если он проходит тест на близость, программа считает, что объекты сталкиваются, что свидетельствует о том, что она всегда возвращает 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

Ожидаемые результаты для функции «столкновения» для вывода на экран или запроса ввода для этой строки, это покажет, что она на самом деле правильно проходит этот раздел кода. однако это не делает этого. функция "collides" возвращает true независимо от того, является ли фактическая секция пересечения истинной или ложной, пропуская весь мой код отладки, как показано в выходных данных.

редактирует:

  • исправлен возврат в коллизиях
  • исправлена ​​опечатка
  • все еще не работает.
  • действительно идут мыслительные петли с комбинациями пуля / пуля, а не пуля / астероид или астероид / астероид

  • проверка getBounds заставляет меня чесать голову ...

    std :: vector asteroid :: getBounds () { // моя проблема была здесь, проверьте ваши функции чуть более внимательно: P // не возвращал вектор с чем-либо в нем. std :: vector 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;
    

    }

  • я думал, что это было реализовано правильно

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Так что моя проблема была простой и немного "дохой" момент. Во-первых, нереализованная проблема, которую мне пришлось исправить, была возвращением истины, независимо от того, была ли моя математика на самом деле выполнена правильно, но поскольку этот раздел не был затронут, это не было настоящей проблемой. Спасибо всем, кто это заметил.

Ошибка 1 (нет, если при возврате истина):

In 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;
    }
 }

Второй вопрос, и главный, после предложения от комментатора, его имя упоминается в вопросе выше, я дважды проверил свой геттер на наличие ограничивающих рамок. Низкий и вот, это была моя проблема. Хотя сначала я не принимал во внимание его советы, потому что думал, что полностью реализовал этот метод получения, это была моя проблема, и изучение ценных уроков всегда полезно.

Проблема вторая (неполная реализация 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;
}

Урок, который нужно выучить: даже если вы думаете, что у вас все работает правильно, бывают ситуации, когда вы этого не делаете, и вам следует проверять и перепроверять КАЖДУЮ функцию, которую вы вызываете, только если одна из тех функций, которые, по вашему мнению, работают, на самом деле не работает работает как надо.

0 голосов
/ 07 января 2019

Проблема возникает в этой строке:

if((frac_1>0.0)&&(frac_1<1.0)&&(frac_2>0.0)&&(frac_2<1.0)); //This semicolon here
    return true;

Установка точки с запятой в конце оператора if в основном завершает инструкцию if. То, что вы написали, эквивалентно

if((frac_1>0.0)&&(frac_1<1.0)&&(frac_2>0.0)&&(frac_2<1.0))
{
}
return true;

Исправить это довольно просто. Просто удалите точку с запятой:

if((frac_1>0.0)&&(frac_1<1.0)&&(frac_2>0.0)&&(frac_2<1.0))
    return true;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...