extract explicit mesh with topology information from implicit surfaces with boolean operations, and do surface/volume integrating on them.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

69 lines
3.2 KiB

#pragma once
#include <primitive_process/interface/base/subface.hpp>
namespace internal
{
// 每个活动子面应具有以下结构
struct parametric_plane {
stl_vector_mp<Eigen::Vector2d> chain_vertices{}; // 链顶点
flat_index_group chains{}; // 链组
stl_vector_mp<uint32_t> singularity_vertices{}; // 奇异顶点,即链的交点
stl_vector_mp<uint32_t> polar_vertices{}; // 极性顶点,即两个连接顶点周围的最小/最大 x/y
stl_vector_mp<uint32_t> 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<double>& 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<double>& u_breaks);
// 计算面积主函数
template <typename Func>
double calculate(Func&& func, int gauss_order = 3) const;
private:
const subface& m_surface; // 引用原始曲面
stl_vector_map<double> 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 <typename Func>
double SurfaceAreaCalculator::GaussIntegrate1D(double a, double b, Func&& func, int q) const;
// 直线u=u_val与边界的交点
std::vector<double> FindVerticalIntersectionsOCCT(double u_val,
const std::vector<Handle(Geom2d_Curve)>& edges,
double v_min,
double v_max);
bool IsPointInsideDomain(double u,
double v,
const std::vector<Handle(Geom2d_Curve)>& outerEdges,
const std::vector<Handle(Geom2d_Curve)>& innerEdges,
double u_min,
double u_max,
double v_min,
double v_max);
double integrate_over_uv(int num_samples) const;
};
} // namespace internal