脊的方向

时间:2014-06-11 07:40:56

标签: c++ algorithm computational-geometry convex-hull

D - 维空间中给出两个单纯的(例如,D3 空间中的2维三角形 > 四面体)邻近 facets V (可见)和 H (地平线),由两个数组< strong> D D - 维 P V P H 即可。上面数组中元素的顺序是严格定义的,反过来,在空间中定义 facets 方向。比如说,他们在通用中设置的点 U (涉及几何计算)中的索引表示为两个std::list< std::size_t > facet D - 1 维边界元素(例如,D3中四面体的1维 空间)。要定义哪些对于 facets 是常见的,我只需执行以下操作:

point_list visible_set_ = visible_facet_.vertices_;
point_list horizon_set_ = horizon_facet_.vertices_;
visible_set_.sort();
horizon_set_.sort();
point_list ridge_;
std::set_intersection(visible_set_.cbegin(), visible_set_.cend(),
                      horizon_set_.cbegin(), horizon_set_.cend(),
                      std::back_inserter(ridge_));

但在执行std::sort期间,我丢失了 ridge R 共性信息,定义为ridge_以上,以及 facets 中任何一个的 ridge

之后可以通过计算交换数来定义共存性,这是从1开始进行排列所需的最低限度。)点的数组> ridge 按顺序呈现在 facet points 的给定数组中.2。)生成点的数组 of ridge R 本身。但我确定这里有开销。

定义共存性的另一种方法是计算两个 facets 面向方(一个由 point <构造的 / em>( facet ridge 的区别)然后是 ridge 和通过简单修改 facet < / em>:将独占点移动到前面,因为它位于两个 facets 中的第一个中。)

如何执行具有固定元素顺序的两个未排序数组的交集,以便结果数组保存第一个(第二个)数组中显示的元素顺序。是否有这样的算法,时间复杂度小于 O(n 2 ?特别感兴趣的是 STL 辅助实施的可能性。

2 个答案:

答案 0 :(得分:2)

如果我正确理解了问题,您可以使用以下方案。首先,制作原始数组的副本(称为visible_set_for_sortinghorizon_set_for_sorting)。然后排序他们。然后按以下方式形成交叉点:

std::set<int> intersection;
std::set_intersection(
    visible_set_for_sorting.begin(), visible_set_for_sorting.end(),
    horizon_set_for_sorting.begin(), horizon_set_for_sorting.end(),
    std::inserter(intersection, intersection.begin()));

现在您可以迭代任何原始数组(visible_set_horizon_set_),检查该点是否在intersection中,并按所需顺序形成结果列表。

std::list<int> list;
for (int p : visible_set_)
{
    if (intersection.find(p) != intersection.end())
    {
        list.push_back(p);
    }
}

复杂性不应高于O(N * log(N))。

答案 1 :(得分:1)

My version用最远点替换专属点,保持其原始可见方面的顺序。 Newfacet(根据原始qhull实现)创建结果:

point_set horizon_(horizon_facet_.vertices_.cbegin(),
                   horizon_facet_.vertices_.cend()); // n * log(n) +
auto const hend = horizon_.end();
point_list ridge_;
for (size_type const p : vertices_) { // n *
    auto const h = horizon_.find(p); // (log(n) +
    if (h == hend) {
        ridge_.push_back(apex);
    } else {
        ridge_.push_back(p);
        horizon_.erase(h); // const)
    }
}