摘要
在现代CAD系统中,几何求交(Geometric Intersection)是最核心的基础算法之一。无论是模型布尔运算、特征建模、曲面修剪、装配分析,还是数控加工中的刀具路径规划,其底层都离不开各种形式的几何求交。对于许多CAD初学者而言,"求交"往往被理解为简单的数学方程联立求解。然而在工业级CAD内核中,由于大量采用NURBS曲线与曲面表示复杂几何对象,传统解析求解方法已经难以适用,取而代之的是基于参数空间、数值迭代以及拓扑重建的一整套工程化算法体系。
本文从CAD几何内核的角度出发,系统介绍曲线求交、曲线曲面求交以及曲面曲面求交的数学本质和工程实现流程,并结合OpenCASCADE等主流CAD内核的实现思想,帮助读者建立完整的几何求交知识框架。
关键词: CAD、BRep、NURBS、OpenCASCADE、曲线求交、曲面求交、布尔运算
一、为什么CAD离不开求交算法
很多人学习CAD时最先接触的是模型显示、模型树、文件导入导出等功能。
但从CAD内核角度来看,真正支撑整个系统运行的核心能力其实是几何运算。
例如:
- 两个零件做布尔交集;
- 模型进行倒角和圆角;
- STEP模型自动识别孔特征;
- 激光加工路径与零件边界求交;
- 曲面扫描填充路径生成;
这些看似不同的问题,本质上都依赖于同一个核心能力:
求交(Intersection)。
可以说:
几何求交是CAD内核的"CPU"。
没有求交算法,就没有现代CAD。
二、CAD中的几何到底是什么
很多初学者以为CAD模型就是一堆三角形。
事实上这只是显示层。
CAD内核中的模型通常采用BRep(Boundary Representation)表示。
一个实体模型由:
- Vertex(顶点)
- Edge(边)
- Face(面)
- Shell(壳)
- Solid(实体)
组成。
其中:
Vertex保存点;
Edge保存曲线;
Face保存曲面。
例如一个圆柱体:
顶部圆:
- 一个Face
侧面圆柱:
- 一个Face
底面圆:
- 一个Face
共同构成一个Solid。
因此CAD中的几何计算,本质上就是:
点与点
点与曲线
曲线与曲线
曲线与曲面
曲面与曲面
之间的关系计算。
三、曲线求交:最基础的几何运算
曲线求交(Curve-Curve Intersection)是所有求交算法的起点。
例如:
一条直线与一个圆:
○
-----×-----
结果是两个交点。
数学上表示为:
C1(t)=C2(s)
未知数:
t、s
共两个。
因此结果通常是若干离散点。
对于解析曲线(直线、圆、椭圆)来说,可以直接利用公式求解。
但对于CAD中的NURBS曲线,情况则复杂得多。
此时CAD通常采用:
- 包围盒过滤
- 递归细分
- 牛顿迭代
逐步逼近真实交点。
四、曲线与曲面求交
相比曲线求交,曲线曲面求交更接近实际工程应用。
例如:
刀具轨迹穿过工件表面;
扫描线与曲面边界求交;
射线拾取模型;
本质都是CSI(Curve Surface Intersection)。
数学表达式为:
C(t)=S(u,v)
未知数:
- t
- u
- v
三个未知量。
结果通常为:
一个或多个交点。
工业CAD如何求解
首先进行粗搜索。
例如:
将曲线离散为100个点;
将曲面离散为100×100网格;
寻找距离很近的位置。
获得近似解后:
利用牛顿迭代不断修正参数:
(t,u,v)
最终得到满足:
C(t)=S(u,v)
的精确解。
这种思想实际上贯穿整个CAD内核。
因为对于NURBS而言:
CAD更关心参数位置,
而不是直接求解析方程。
五、曲面与曲面求交
如果说曲线曲面求交是CAD的重要算法,
那么曲面曲面求交就是CAD内核的核心算法。
例如:
圆柱与球面:
球面 ∩ 圆柱面
得到:
一条空间闭合曲线。
数学表达式:
S1(u,v)=S2(s,t)
未知参数:
u,v,s,t
四个。
三个方程。
因此结果不再是点。
而是一条曲线。
六、面面求交为什么这么难
很多人认为:
"既然知道两个曲面方程,直接联立不就行了吗?"
实际上工业CAD中的曲面大多数都是NURBS。
它们没有简单解析表达式。
因此现代CAD几乎不会直接求整条交线。
而是采用一种更加工程化的方法:
Marching Method(行进法)
其核心思想非常简单:
先找到交线上的一个点;
再找到交线的前进方向;
然后一步一步沿交线前进。
就像在山路上行走一样。
七、Marching Method的核心思想
假设已经找到交点:
P0
此时计算:
曲面1法向:
N1
曲面2法向:
N2
则交线切向为:
T=N1×N2
于是:
沿T方向前进一步:
P'=P0+hT
由于交线是弯曲的,
P'并不严格位于交线上。
因此:
再利用牛顿迭代,
将其重新拉回:
S1∩S2
上。
获得:
P1
然后继续:
P1→P2→P3→...
最终得到整条交线。
八、为什么参数空间如此重要
很多初学者喜欢在三维空间中理解CAD。
但CAD内核实际上更喜欢在参数空间工作。
例如一个NURBS曲面:
S(u,v)
CAD真正计算的是:
(u,v)
而不是:
(x,y,z)
原因很简单:
参数空间更加稳定。
求导更加容易。
迭代更加高效。
因此:
现代CAD的大部分高级算法,
本质上都发生在参数空间。
九、修剪曲面与真实CAD模型
还有一个容易被忽略的问题。
CAD中的Face并不是完整曲面。
例如:
一个平面本来是无限大的。
但模型只保留其中一小块区域。
因此Face实际上是:
Geom_Surface
Trim Boundary
即:
底层曲面
加
修剪边界
组成。
所以面面求交之后,
还必须进行一次裁剪。
仅保留:
Face1与Face2范围内的交线。
十、从求交到布尔运算
很多人学习布尔运算时,
会把它理解为一个独立模块。
实际上:
布尔运算只是求交算法的应用。
例如:
A ∩ B
CAD首先进行:
Face-Face Intersection
得到:
Intersection Edge
然后:
切分Face;
重建Shell;
重建Solid;
最终得到新的实体。
因此:
布尔运算的核心不是布尔,
而是求交。
十一、OpenCASCADE中的实现
对于OpenCASCADE用户而言,
以下几个类最值得研究:
GeomAPI_IntCS
曲线曲面求交
GeomInt_IntSS
曲面曲面求交
IntPatch_Intersection
面面求交核心模块
IntTools_FaceFace
布尔运算求交模块
如果深入阅读这些模块源码,
就会发现:
它们大部分代码都在处理:
- 找种子点
- 牛顿迭代
- 行进追踪
- 边界裁剪
- 特殊情况处理
而真正的数学求交部分,
反而只占很小比例。
十二、总结
从CAD内核角度看:
曲线求交、
曲线曲面求交、
曲面曲面求交,
本质上是同一个问题在不同维度下的表现。
其核心思想可以归纳为:
寻找候选区域;
建立参数关系;
利用数值迭代逼近解;
重建拓扑结构。
因此现代CAD系统真正关心的并不是"解析解",而是:
在保证鲁棒性和精度的前提下,
稳定地构造出符合拓扑要求的几何结果。
这也是为什么工业CAD内核往往需要数十年持续演化的根本原因。