现代CAD几何内核中的求交算法——从曲线求交到曲面求交的原理与实现

摘要

在现代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通常采用:

  1. 包围盒过滤
  2. 递归细分
  3. 牛顿迭代

逐步逼近真实交点。


四、曲线与曲面求交

相比曲线求交,曲线曲面求交更接近实际工程应用。

例如:

刀具轨迹穿过工件表面;

扫描线与曲面边界求交;

射线拾取模型;

本质都是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内核往往需要数十年持续演化的根本原因。