【发布时间】:2016-09-03 17:18:00
【问题描述】:
所以在我的代码中,我得到了点的 xyz 坐标,它应该形成一个轮廓。问题是这些点没有以正确的方式排序。当我得到坐标时,它们按上升的 x 和 y 值排序。所以首先对 x 值进行排序,如果两个点具有相同的 x 值,则按它们的 y 值排序。 z 值始终相同,因此可以忽略。 为了对点进行排序以形成轮廓,我使用了最近邻算法的一种变体。 所以这是我的排序代码:
double squareDistancePoints(const std::array<double, 3>& a, const std::array<double, 3>& b)
{
assert(a.size() == b.size());
double sum = 0;
for(size_t i = 0; i < a.size(); ++i)
sum += pow(b[i]-a[i], 2);
return sum;
}
for(auto it = matrix.begin(); it != matrix.end(); ++it)
{
auto bestIt = matrix.end();
double bestSquareDistance = DBL_MAX;
for(auto nextIt = it + 1; nextIt != matrix.end(); ++nextIt)
{
const auto squareDistance = squareDistancePoints(*it, *nextIt);
if( squareDistance < bestSquareDistance)
{
bestSquareDistance = squareDistance;
bestIt = nextIt;
}
}
if(bestIt != matrix.end())
{
std::swap(*(it + 1), *bestIt);
}
}
因此,这非常适用于标准轮廓,例如立方体或圆形。但我也有轮廓,这是行不通的。 所以这是一张未分类轮廓的图片
我已经在我的代码的想法中发现了问题。轮廓长于宽,因此排序算法也总是错误位置上的最近点。 所以正确的图片应该是这样的:
我的方法是从一个点开始,搜索最近的点,然后按照这些点给我的方向。这一切都是我手动完成的。 所以我现在的问题是我不知道如何优化我的代码,所以它在排序时遵循一个方向。 我希望有人能帮助我。如果有帮助的话,我还可以发送一个包含未排序和排序点的 .csv 文件。
【问题讨论】:
标签: c++ algorithm sorting nearest-neighbor