在 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 。
之后可以通过计算交换数来定义共存性strong>,这是从1开始进行排列所需的最低限度。)点的数组> ridge 按顺序呈现在 facet 的 points 的给定数组中.2。)生成点的数组 of ridge R 本身。但我确定这里有开销。
定义共存性strong>的另一种方法是计算两个 facets 的面向方(一个由 point <构造的 / em>( facet 和 ridge 的区别)然后是 ridge 和通过简单修改 facet < / em>:将独占点移动到前面,因为它位于两个 facets 中的第一个中。)
如何执行具有固定元素顺序的两个未排序数组的交集,以便结果数组保存第一个(第二个)数组中显示的元素顺序。是否有这样的算法,时间复杂度小于 O(n 2 )?特别感兴趣的是 STL 辅助实施的可能性。
答案 0 :(得分:2)
如果我正确理解了问题,您可以使用以下方案。首先,制作原始数组的副本(称为visible_set_for_sorting
和horizon_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)
}
}