2014-10-31 4 views
0

У меня есть 2 вектора, один (вектор1 структур (Point)) заполняется X количеством точек, а другой (vector2 of structs (PrimeTemplate)) заполняется Y количеством точек. Я хочу найти все значения ниже порога, и я чувствую, что мой код просто этого не делает. На данный момент я просто проигнорирую, если одна точка отображает более одного другого. Что мне не хватает? Я генерирую только несколько моментов, и я знаю, что я должен получать больше.Кратчайшее расстояние до точки

struct Template{ 
    int tempX; 
    int tempY; 
}; 

struct PrimeTemplate{ 
    double tempX; 
    double tempY; 
}; 

int matches = 0; 
for (int outerLoop = 0; outerLoop < vector1 .size(); outerLoop++) 
    { 
     for (int innerLoop = 0; innerLoop < vector2.size(); innerLoop++) 
     { 
      double tempEuclidianX = std::pow(abs(vector1 [outerLoop].tempX - vector2[innerLoop].tempX), 2.0); 
      double tempEuclidianY = std::pow(abs(vector1 [outerLoop].tempY - vector2[innerLoop].tempY), 2.0); 
      double Euclidian = sqrt(tempEuclidianX + tempEuclidianY); 
      if (Euclidian <= 5) //less than threshold 
      { 
       matches++; 
      } 
     } 
    } 

Пример ввода из файла будет выглядеть следующим образом (два разных файла, случайные числа) (не беспокойтесь о получении данных, все это есть)

245 21 
452 54 
124 68 
485 78 
111 29 
97 75 
78 113 
300 124 
411 101 
+1

Вы * знаете * вы должны получать больше? На основании чего? У вас есть образец ввода и ожидаемый результат, который показывает, что ваш код не делает то, что вы хотите? –

+0

Привет, Грег, у меня есть выборка. Это точка соответствия. Это выполняется в пределах 2 для циклов. поэтому игнорируйте, что совпадения никогда не сбрасываются. – snurby77

+3

Не связанный с вашей проблемой, но если вы вообще не заботитесь о производительности, вы хотите пропустить «sqrt» и сравнить с квадратом расстояния, что-то вроде 'if (deltaX * deltaX + deltaY * deltaY <= 25) соответствует ++; '. –

ответ

0

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

for (int outerLoop = 0; outerLoop < Tvector.size(); outerLoop++) 
     { 
      for (int innerLoop = 0; innerLoop < QPrimeVector.size(); innerLoop++) 
      { 
       double tempEuclidianX = std::pow((QPrimeVector[innerLoop].tempX - Tvector[outerLoop].tempX), 2.0); 
       double tempEuclidianY = std::pow((QPrimeVector[innerLoop].tempY - Tvector[outerLoop].tempY), 2.0); 
       double Euclidian = sqrt(tempEuclidianX + tempEuclidianY); 
       if (Euclidian <= THRESHOLD) //less than threshold and not taken already 
       { 
        if (Euclidian < minEuclidian) 
        { 
         minEuclidian = Euclidian; 
         if (!Tvector[outerLoop].marked) 
         { 
          matched = innerLoop; 
         } 
        } 
       } 
       if (matched != -1) 
       { 
        matches++; 
       } 
       matched = -1; 
       minEuclidian = 10; 
      } 

      if (matches > masterMatchCount) 
      { 
       masterMatchCount = matches; 
       deltaThetaMaster = deltaTheta; 
       deltaXMaster = deltaX; 
       deltaYMaster = deltaY; 
      } 
     } 
     for (int reset = 0; reset < Tvector.size(); reset++) 
     { 
      Tvector[reset].marked = false; //reset all the matches 
     } 
     QPrimeVector.clear(); 
    } 
0

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

+1

На самом деле неясно, верно это или нет. Если включен параметр [''] (http://en.cppreference.com/w/cpp/numeric/math/fabs), имеются перегрузки с плавающей запятой. Если включен только [''] (http://en.cppreference.com/w/cpp/numeric/math/abs), тогда мы имеем только целую перегрузку. –

+0

Привет, ребята, оказалось, что перед моим кодом произошла ошибка, когда он перевел все баллы. Сейчас, наверное, важны прекрасные негативные признаки. но был включен, и я ценю вклад от вас, ребята! – snurby77

+0

@ snurby77, не могли бы вы опубликовать то, что вы только что написали в качестве ответа, а затем принять его? Таким образом, другие люди, которые посещают этот вопрос и испытывают одну и ту же проблему, смогут перейти на него. –

Смежные вопросы