#pragma once #include "vde/mesh/delaunay_2d.h" #include "vde/core/line.h" #include namespace vde::mesh { using core::Point2D; using core::Point3D; using core::Vector3D; /** * @brief 约束 Delaunay 三角化(CDT) * * 在标准 Delaunay 三角化基础上强制指定的约束边必须出现在三角化中。 * 通过边翻转(edge flip)反复消除与约束边相交的三角形边,直到所有 * 约束边都成为三角形边。 * * 约束边在输出三角化中一定存在(作为三角形边),但不保证满足 * 空圆性质——靠近约束边的三角形可能违反 Delaunay 条件。 * * @param points 输入 2D 点集 * @param constraints 约束边列表,每项为 {起点索引, 终点索引} * @return DelaunayResult 含约束边的三角化结果 * * @note 约束边不能相交(否则行为未定义);自相交约束需先分割交点 * @code{.cpp} * // 带孔洞的三角化:约束边标记孔洞边界 * auto result = constrained_delaunay_2d(points, * {{0,1}, {1,2}, {2,1}, {3,0}}); * @endcode * @see delaunay_2d * @ingroup mesh */ DelaunayResult constrained_delaunay_2d( const std::vector& points, const std::vector>& constraints); } // namespace vde::mesh