Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 最短到点距离_C++_C++11 - Fatal编程技术网

C++ 最短到点距离

C++ 最短到点距离,c++,c++11,C++,C++11,我有两个向量,一个(结构的向量1(点))填充X个点,另一个(结构的向量2(PrimeTemplate))填充Y个点。我希望找到低于阈值的所有值,我觉得我的代码不能做到这一点。现在我将忽略一个点是否映射到多个其他点。我错过了什么?我只得到了几分,我知道我应该得到更多 struct Template{ int tempX; int tempY; }; struct PrimeTemplate{ double tempX; double tempY; }; int

我有两个向量,一个(结构的向量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++;
            }
        }
    }

代码的错误在于在平方前使用了abs()。
当然,在进行平方运算之前根本不需要取绝对值,但是如果要取绝对值,则需要使用fabs,就像abs取并返回整数一样。这个额外的四舍五入可能是我们没有得到正确答案的原因。

这是我用来计算一对情侣之间最短距离的方法。它在文本文件中循环并加载您看到的向量。事实证明,点的问题是在我的实施之前,这是一些生物特征点的标准化代码

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();
    }
for(int-outerLoop=0;outerLoop
你知道你应该得到更多吗?基于什么?您是否有示例输入和预期输出,表明您的代码没有达到您想要的效果?嗨,Greg,我有示例输出。这是点匹配。这也是在2个for循环中运行的。所以忽略匹配永远不会重置。这与您的问题无关,但是如果您关心性能,您希望跳过
sqrt
并与距离的平方进行比较,类似于
if(deltaX*deltaX+deltaY*deltaY性能不是什么大问题,但我们欢迎用另一种方式来看待它!我会尝试一下!也许更多的信息会有所帮助。比如,结构点的定义、示例输入等。实际上不清楚这是真是假。如果包含,则会有浮点重载。如果仅包含包括在内,那么我们只有整数重载。嗨,伙计们,原来我的代码在翻译所有的点时有一个问题。我想可爱的负号现在很重要。但是被包括在内了,我感谢你们的输入!@snurby77,你介意把你刚才写的作为答案发布,然后接受吗?那是y、 其他访问此问题并遇到相同问题的人将能够直接跳到它。抱歉,让我继续,我忘记了此问题
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();
    }