83 lines
2.4 KiB
C++
83 lines
2.4 KiB
C++
#pragma once
|
||
#include "vde/curves/nurbs_surface.h"
|
||
#include "vde/curves/nurbs_curve.h"
|
||
#include "vde/core/aabb.h"
|
||
#include <vector>
|
||
#include <functional>
|
||
|
||
#include <utility>
|
||
|
||
namespace vde::curves {
|
||
|
||
/**
|
||
* @brief 曲面-曲面求交结果
|
||
*
|
||
* 包含交线上离散采样点的 3D 坐标及其在两曲面上的参数坐标,
|
||
* 以及可选的拟合 NURBS 曲线。
|
||
*
|
||
* @ingroup curves
|
||
*/
|
||
struct IntersectionCurve {
|
||
/// 交线采样点(3D 空间坐标)
|
||
std::vector<core::Point3D> points;
|
||
/// 各采样点在曲面 A 上的参数坐标 (u1, v1)
|
||
std::vector<std::pair<double, double>> params_a;
|
||
/// 各采样点在曲面 B 上的参数坐标 (u2, v2)
|
||
std::vector<std::pair<double, double>> params_b;
|
||
/// 沿交线采样点拟合的 NURBS 曲线(可选)
|
||
};
|
||
|
||
/**
|
||
* @brief 两 NURBS 曲面求交
|
||
*
|
||
* 算法:递归子分 AABB 剔除 → 叶节点种子搜索 → Newton 精化 + 交线追踪 →
|
||
* 弦长参数化 NURBS 拟合。
|
||
*
|
||
* @param surf_a 曲面 A
|
||
* @param surf_b 曲面 B
|
||
* @param max_depth 最大递归深度(默认 5)
|
||
* @param tolerance 3D 空间收敛容差(默认 1e-4)
|
||
* @return 交线列表(无交则空)
|
||
*
|
||
* @note 本实现为工业级近似算法,适用于一般 CAD 场景。
|
||
* 对奇异情况(切线接触、边界交线等)可能丢线。
|
||
* @code{.cpp}
|
||
* auto curves = intersect_surfaces(cyl, sphere, 6, 1e-5);
|
||
* for (auto& c : curves) {
|
||
* for (auto& p : c.points) { // 使用交线上的点 }
|
||
* }
|
||
* @endcode
|
||
* @ingroup curves
|
||
*/
|
||
[[nodiscard]] std::vector<IntersectionCurve> intersect_surfaces(
|
||
const NurbsSurface& surf_a,
|
||
const NurbsSurface& surf_b,
|
||
int max_depth = 5,
|
||
double tolerance = 1e-4);
|
||
|
||
/**
|
||
* @brief 平面与 NURBS 曲面求交
|
||
*
|
||
* 使用等值线追踪法:在曲面参数域上采样 signed_distance,
|
||
* 追踪零等值线得到交线。
|
||
*
|
||
* @param surf NURBS 曲面
|
||
* @param point 截平面上一点
|
||
* @param normal 截平面法向(自动归一化)
|
||
* @param grid_res 参数域网格分辨率(默认 32)
|
||
* @return 交线列表(通常为一条)
|
||
*
|
||
* @code{.cpp}
|
||
* // 用 Z=0 平面截圆柱
|
||
* auto curves = intersect_plane_surface(cylinder, {0,0,0}, {0,0,1});
|
||
* @endcode
|
||
* @ingroup curves
|
||
*/
|
||
[[nodiscard]] std::vector<IntersectionCurve> intersect_plane_surface(
|
||
const NurbsSurface& surf,
|
||
const core::Point3D& point,
|
||
const core::Vector3D& normal,
|
||
int grid_res = 32);
|
||
|
||
} // namespace vde::curves
|