You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CGAL5.6正则三角化插入带权点时locate函数报错求助

CGAL3.9迁移到5.6:正则三角化插入带权点的错误修复

问题场景

将基于CGAL3.9的代码重构到5.6版本时,向正则三角化(Regular Triangulation)插入带权点时出现编译错误,插入函数代码如下:

Vertex_handle Scene::insert_vertex(const Point& point,
                                   const FT weight,
                                   const unsigned index)
{
    Weighted_point wp(point, weight);
    Vertex_handle vertex = m_rt.insert(wp); // <-- 错误位置

    if (vertex->get_index() != -1)
        return Vertex_handle();

    vertex->set_index(index);
    return vertex;
}

错误信息

编译时提示:insert(p)调用的locate(p, lt, li, start)函数无法匹配,存在locate函数但无法将const Weighted_point(即const CGAL::Weighted_point_2<CGAL::Epick>)转换为const Point&(即const CGAL::Point_2<CGAL::Epick>)。

环境说明

  • 使用的Kernel:CGAL::Exact_predicates_inexact_constructions_kernel
  • 自定义三角化类:CTriangulation<Regular_triangulation>,其中Regular_triangulation为CGAL::Regular_triangulation_2<Kernel, TDS>(TDS为自定义顶点/面数据结构)
  • 原3.9代码使用已弃用的CGAL::Regular_triangulation_filtered_traits_2<Kernel>定义带权点,现在改为Kernel::Weighted_point_2

修复方案

1. 确保基类insert重载被正确暴露

如果你的CTriangulation是继承自Regular_triangulation_2的自定义封装类,且类中定义了自己的insert函数(例如接受普通点的版本),会导致基类中接受带权点的insert重载被隐藏。需要在CTriangulation类中添加using声明,引入基类的所有insert重载:

template <typename RT>
class CTriangulation : public RT {
public:
    // 引入基类的所有insert重载,避免被自定义insert隐藏
    using RT::insert;

    // ... 你的自定义成员函数和逻辑
};

2. 确认类型定义一致性

确保代码中使用的Weighted_point、Point、FT与正则三角化类中的类型完全一致,避免隐式转换问题:

typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;
typedef Kernel::Point_2 Point;
typedef Kernel::Weighted_point_2 Weighted_point;
typedef Kernel::FT FT;

// 正则三角化类型定义
typedef CGAL::Regular_triangulation_2<Kernel, YourCustomTDS> Regular_triangulation;
typedef Regular_triangulation::Vertex_handle Vertex_handle;

3. 验证TDS与顶点定义正确性

自定义的TDS(三角化数据结构)中的顶点类,需要符合CGAL正则三角化的要求:

  • 确保顶点类包含Weighted_point类型的成员(或通过接口提供带权点数据)
  • 自定义的get_index()和set_index()方法逻辑正确,默认构造时将index初始化为-1

关键版本差异说明

CGAL5.x中废弃了Regular_triangulation_filtered_traits_2,转而直接使用Kernel自带的traits(Kernel::Regular_triangulation_traits_2),该traits已经内置了正则三角化所需的所有谓词和构造函数,无需手动指定旧的filtered trait。此外,基类成员函数的重载规则在现代C++中更严格,需要显式引入基类重载以避免隐藏。

内容的提问来源于stack exchange,提问作者CharlineG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 23:05:17