排序行,是封闭形状的一部分

时间:2016-12-30 11:54:38

标签: c++ algorithm sorting 3d line

我有一个结构数组,每个结构元素都包含3D空间中行的端点。

struct POINTS
{
   float xStart;
   float yStart;
   float zStart;

   float xEnd;
   float yEnd;
   float zEnd;
};

组合这些线将创建一个封闭的形状。不幸的是,线条的顺序不正确。

为了按顺序制作线条,创建闭环,我认为线点应重新排列如下:

  • 说一句,说LINE-A。
  • 找到另一条线的起点,比如LINE-X,其起点是LINE-A的终点。

    或者

  • 找到另一条线的终点,比如LINE-Y,其终点是LINE-A的起点......

但我不确定这是否是正确的解决方案。 我将非常感谢您提出合适的优化方法来解决这个问题。

[添加注释] 我的真实目的是在2D平面中创建闭合形状。因此,天才的预期也是2D平面的解决方案。

1 个答案:

答案 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