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