我有一个结构数组,每个结构元素都包含3D空间中行的端点。
struct POINTS
{
float xStart;
float yStart;
float zStart;
float xEnd;
float yEnd;
float zEnd;
};
组合这些线将创建一个封闭的形状。不幸的是,线条的顺序不正确。
为了按顺序制作线条,创建闭环,我认为线点应重新排列如下:
找到另一条线的起点,比如LINE-X,其起点是LINE-A的终点。
或者
但我不确定这是否是正确的解决方案。 我将非常感谢您提出合适的优化方法来解决这个问题。
[添加注释] 我的真实目的是在2D平面中创建闭合形状。因此,天才的预期也是2D平面的解决方案。
答案 0 :(得分:0)
主要思想 - 将所有点放到多图(其中键是点坐标,值是线的索引和开始/结束标记)。之后,您需要选择任何点作为启动,找到具有此点的行的索引并获取另一行的结尾。然后将当前行标记为已使用,并使用当前行的结束作为下次迭代的启动。
vector<POINTS> lines = generate_lines(10);
multimap<tuple<double, double, double>, pair<double, double> > M;
for (int i = 0; i < lines.size(); i++)
{
// start point
M.insert(make_pair(make_tuple(lines[i].xStart, lines[i].yStart, lines[i].zStart),
make_pair(i, 0) ) );
// end point
M.insert(make_pair(make_tuple(lines[i].xEnd, lines[i].yEnd, lines[i].zEnd),
make_pair(i, 1) ) );
}
auto coords1 = M.begin()->first;
auto pos1 = M.begin()->second;
vector<bool> used(lines.size(), false);
for (int i = 0; i < lines.size(); i++)
{
std::tuple<double, double, double> coords2 = pos1.second ? make_tuple(lines[pos1.first].xStart, lines[pos1.first].yStart, lines[pos1.first].zStart) :
make_tuple(lines[pos1.first].xEnd, lines[pos1.first].yEnd, lines[pos1.first].zEnd);
cout << pos1.first << ": " << get<0>(coords1) << " " << get<1>(coords1) << " " << get<2>(coords1) << " - "
<< get<0>(coords2) << " " << get<1>(coords2) << " " << get<2>(coords2) << endl;
used[pos1.first] = true;
pair<int, int> nextPos(-1, -1);
auto r = M.equal_range(coords2);
for (auto it = r.first; it != r.second; it++)
if (!used[it->second.first])
{
nextPos = it->second;
break;
}
if (nextPos.first == -1 && i != lines.size()-1)
{
cout << "something bad happens\n";
return 1;
}
pos1 = nextPos;
coords1 = coords2;
}
算法的复杂性为O(N * logN)。 该算法不需要端到端排序数据。
您可以在此处找到包含示例代码的完整源代码: http://ideone.com/TuzjMn