最短距离点

时间:2014-10-31 00:30:23

标签: c++ c++11

我有2个向量,一个(结构的向量1(点))用X量的点填充,另一个(结构的向量2(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 

2 个答案:

答案 0 :(得分:0)

你的代码有什么问题,你在平方之前使用abs()。 当然,在平方之前根本不需要取绝对值,但是如果你要那么你想要使用fabs,就像abs一样,并返回一个整数。这个额外的四舍五入可能是为什么没有得到正确的答案。

答案 1 :(得分: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();
    }