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.
62 lines
2.8 KiB
62 lines
2.8 KiB
#pragma once
|
|
|
|
#include <base/subface.hpp>
|
|
#include <container/stl_alias.hpp>
|
|
|
|
#include "flat_index_group.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_mp<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_mp<double>& u_breaks);
|
|
|
|
// 计算面积主函数
|
|
template <typename Func>
|
|
double calculate(Func&& func, int gauss_order = 3) const;
|
|
|
|
private:
|
|
const subface& m_surface; // 引用原始曲面
|
|
stl_vector_mp<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;
|
|
|
|
// 私有辅助函数
|
|
// 直线u=u_val与边界的交点
|
|
std::vector<double> find_vertical_intersections(double u_val);
|
|
|
|
bool is_point_inside_domain(double u, double v);
|
|
double newton_method(const std::function<equation_intermediate_t(double)>& F,
|
|
double v_initial,
|
|
double tolerance = 1e-8,
|
|
int max_iterations = 100);
|
|
void sort_and_unique_with_tol(std::vector<double>& vec, double epsilon = 1e-8);
|
|
};
|
|
|
|
} // namespace internal
|