【问题标题】:Find all neighbours of a certain primitive in a CGAL::Surface_mesh在 CGAL::Surface_mesh 中查找某个图元的所有邻居
【发布时间】:2023-03-30 08:15:01
【问题描述】:

我在 cgal 中编写了一个带有树加速的小型光线追踪器(使用 CGAL::Surface_mesh Mesh)。我想找到一个命中原语的所有邻居。

Ray_intersection hit = tree.first_intersection(rays[y][x]);

if(hit)
{
    const Point& point =  boost::get<Point>(hit->first);
    const Primitive_id& primitive_id = boost::get<Primitive_id>(hit->second);
    //i need the neighbours of the hit primitive
}

我该怎么做?我找到了这个文档,但它似乎只适用于点而不是原语:

https://doc.cgal.org/latest/Spatial_searching/index.html

它搜索它的欧几里得距离而不是连接在一起。

有没有类似的东西:

std::vector<Primitive_id&> ids = getNeighoursOfPrimive(primitive_id);

就像我说的,我使用 CGAL::Surface_mesh Mesh 作为我的网格,它们只是场景中的一个网格。

【问题讨论】:

    标签: c++ cgal raytracing


    【解决方案1】:

    您可以使用vertices_around_face() 返回的范围来获取面的所有顶点,然后对于每个顶点,您可以使用halfedges_around_target() 返回的范围来获取与该顶点相关的每个面的一个半边(或者您可以这样做手动使用下一个和相反的组合)。

    【讨论】:

    • 真的关心基元,还是相邻的面?如果您想要相邻的面,并且图元是 AABB_face_graph_triangle_primitive,则图元 ID 是 boost::graph_traits::face_descriptor(即 Surface_mesh::Face_index),您可以使用类似 BGL 的函数,例如 CGAL::faces_around_face: face_descriptor fd = p_id; for(face_descriptor neigh_fd : CGAL::faces_around_face(halfedge(fd, sm), sm) // sm 是你的表面网格 { } 查看包 BGL(它需要一个数据结构来适应接口,CGAL::Surface_mesh 确实使用'graph_traits' 接口)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-29
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    相关资源
    最近更新 更多