#pragma once #include namespace internal { // 每个活动子面应具有以下结构 struct parametric_plane { stl_vector_mp chain_vertices{}; // 链顶点 flat_index_group chains{}; // 链组 stl_vector_mp singularity_vertices{}; // 奇异顶点,即链的交点 stl_vector_mp polar_vertices{}; // 极性顶点,即两个连接顶点周围的最小/最大 x/y stl_vector_mp parallel_start_vertices{}; // 平行起始顶点,即边 {v, v + 1} 平行于 x/y 轴 }; class SurfaceAreaCalculator { public: // 构造函数,接受对 subface 的引用 explicit SurfaceAreaCalculator(const subface& surface); [[deprecated("Use calculate_new() instead")]] SurfaceAreaCalculator(const subface& surface, const stl_vector_map& u_breaks, double umin, double umax, double vmin, double vmax); SurfaceAreaCalculator(const subface& surface, const parametric_plane& uv_plane); // 设置 u_breaks(裁剪/分割线) void set_ubreaks(const stl_vector_map& u_breaks); // 计算面积主函数 template double calculate(Func&& func, int gauss_order = 3) const; private: const subface& m_surface; // 引用原始曲面 stl_vector_map m_u_breaks; // 分割线信息(可选) parametric_plane m_uv_plane; double Umin = 0.0; // 参数域范围 double Umax = 1.0; double Vmin = 0.0; double Vmax = 1.0; // 私有辅助函数(可扩展) template double SurfaceAreaCalculator::GaussIntegrate1D(double a, double b, Func&& func, int q) const; // 直线u=u_val与边界的交点 std::vector FindVerticalIntersectionsOCCT(double u_val, const std::vector& edges, double v_min, double v_max); bool IsPointInsideDomain(double u, double v, const std::vector& outerEdges, const std::vector& innerEdges, double u_min, double u_max, double v_min, double v_max); double integrate_over_uv(int num_samples) const; }; } // namespace internal