脊的方向

Orientation of ridge

本文关键字:方向      更新时间:2023-10-16

D空间给定两个简单的(例如,二维三角形面在D3 空间对于四面体)相邻的切面V(可见)和H(水平),由D D维 p V p H两个数组定义。上述数组中元素的顺序是严格定义的,相应地,在空间中定义facet 方向。例如,他们在通称U点(涉及几何计算)的通称集合中的指标表示为两个std::list< std::size_t >facetD - 1维边界元素(例如,四面体在D3 空间中的一维)。要定义哪些对于两个切面是共同的,我可以简单地做以下操作:

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执行期间,我丢失了关于R共向性的信息,定义为上面的ridge_,以及任何两个的相同的

共方向性可以通过计算交换数来定义,这最少需要执行从1.)的数组的排列,按照它在的给定数组中呈现的顺序到2.)R本身产生的的数组。但是我确定这里有开销

另一种定义共方向性的方法是计算两个facet的一个面向的正方形(一个由排他构造(facet的差异),然后是,另一个由facet的简单修改生成:将排他点移到前面,因为它位于两个facet中的第一个)

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

如果我理解正确,您可以使用以下方案。首先,复制原始数组(称为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);
    }
}

复杂度不应高于0 (N*log(N))

我的版本将独占点替换为最远点,保持其在原始可见facet中的顺序。Newfacet(根据原始船体实现)创建的结果:

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)
    }
}