曲面曲面解析求交方案-平面+曲面

📅 2026/7/6 3:45:19 👁️ 阅读次数 📝 编程学习
曲面曲面解析求交方案-平面+曲面

曲面曲面解析求交方案-平面+曲面

文章目录

  • 曲面曲面解析求交方案-平面+曲面
    • 一. 通用约定
      • 1. 输入对象
      • 2. 平面表达
      • 3. 容差规则
      • 4. 结果规则
      • 5. 建模空间范围与样条退化策略
    • 二. 平面与平面求交
      • 1. 分类
      • 2. 非平行交线
      • 3. 结果表达
    • 三. 平面与圆柱面求交
      • 1. 平面垂直圆柱轴线:圆
      • 2. 平面平行圆柱轴线:两条直线 / 一条切线 / 无交
      • 3. 一般斜截:椭圆
      • 4. 病态斜截:转成两条样条曲线
    • 四. 平面与圆锥面求交
      • 1. 分类原则
      • 2. 平面垂直圆锥轴线:圆
      • 3. 平面过顶点:退化线或点
      • 4. 一般斜截:椭圆 / 抛物线 / 双曲线
      • 5. 圆锥截线的样条构造
    • 五. 平面与球面求交
      • 1. 几何分类
      • 2. 相交圆构造
      • 3. 相切点
    • 六. 平面与圆环面求交
      • 1. 水平截面:平面法向平行圆环面轴线
      • 2. 子午截面:平面包含圆环面轴线
      • 3. 竖直偏置截面:平面平行圆环面轴线但不包含轴线
      • 4. 其他圆环面平面截线
    • 七. 关键注意事项

本文档记录曲面-曲面解析求交中“平面 + 曲面”的第一阶段实现方案。这里的“解析”不是强制所有结果都必须用精确二次曲线表达,而是优先通过几何分类得到稳定的交线类型;当精确圆锥曲线表达在当前尺度下数值不稳定,或结果本身是抛物线、双曲线、四次曲线时,统一转成带明确参数范围和拟合容差的 B 样条曲线。

目标是让平面参与的曲面-曲面求交先覆盖常用二次曲面和圆环面特例,为后续通用曲面-曲面数值求交提供可复用的解析优先分支。

一. 通用约定

1. 输入对象

固定有一个平面对象:

  • LGKPlane

另一个曲面对象第一阶段覆盖:

  • 平面LGKPlane
  • 圆柱面LGKEntCylinder
  • 圆锥面LGKEntCone
  • 球面LGKEntSphere
  • 圆环面LGKEntTorus,若当前实体类型尚未落地,可先以设计预留

2. 平面表达

平面统一表达为:

Π: N · (X - Q) = 0

其中:

  • N是单位法向;
  • Q是平面上一点;
  • 平面局部坐标系为(U, V, N),满足U × V = N

任意 3D 点P到平面的有向距离:

d(P, Π) = N · (P - Q)

平面参数反算:

u = (P - Q) · U v = (P - Q) · V

3. 容差规则

  • 平行、垂直、同向、反向等方向关系使用角度容差LGKConstants::AngleTolerance
  • 点到平面、点到曲面、半径差、轴线距离等几何量使用调用方传入的长度容差,例如曲面-曲面求交 option 中的m_tol
  • 参数域边界不能只用参数差判断几何存在性,最终需要回到空间距离校验。
  • 分支边界必须带容差,例如:
    • 平面与轴线是否平行;
    • 平面是否过球心/圆锥顶点/圆环面轴线;
    • 相切、无交、穿越分类;
    • 椭圆长短轴比是否过大。

4. 结果规则

曲面-曲面求交结果不应只返回散点。平面-曲面的解析结果至少需要支持三类输出:

  1. m_intCurves:交线曲线。
    • 3D 曲线:直线、圆、椭圆或 B 样条曲线。
    • 曲线参数范围。
    • 曲线类型:普通相交、相切、反切等。
    • 其他端点类型等数据。// 可参考求交结果调研数据文档,这篇主要讲方法思路。
  2. m_intPoints:孤立接触点或退化交点。
    • 例如平面与球面相切时得到一个点。
    • 平面与圆锥仅在顶点接触时得到一个点。
  3. m_overlapRegions:重合区域。// 此为增强功能,前期不做重点处理
    • 例如平面-平面重合。
    • 当前接口若还没有重合区域表达,可先通过状态码或单独结果类型保留信息,不要伪造成一条交线。

每条交线加入结果前必须满足:

  • 采样点或端点到两个原始曲面的距离在容差内;
  • 若上层传入 face 参数域,需要能被裁剪到有效参数域;
  • 若交线由 B 样条拟合得到,需要记录拟合容差和来源参数范围。

5. 建模空间范围与样条退化策略

某些数学上可精确表达的圆锥曲线,在建模尺度中会出现极端长轴或参数数值过大。例如平面几乎平行于圆柱轴线时,平面截圆柱得到的椭圆长轴会趋近无穷。此时不强行构造病态椭圆,而是在有限建模空间内生成 B 样条交线。

第一阶段约定建模空间范围:

[-5000, 5000]

病态阈值:

长轴 / 短轴 > 10000

或等价使用轴线方向与平面法向夹角中的稳定性指标:

|N · Z| < 0.0001

其中Z是圆柱/圆锥/圆环面的局部轴线方向。

当结果转为样条时:

  • 只在建模空间 box 内生成交线;
  • 对无界曲线使用有限参数区间;
  • 对抛物线、双曲线等曲线,如果单段拟合跨度过大,需要分段;
  • 推荐按尺度分段,例如:
[-5000, -100] [-100, 100] [100, 5000]

必要时中央段继续细分为:

[-100, -10] [-10, 10] [10, 100]

这样避免远处大坐标影响10010范围内的拟合精度。

*注:因为发现-10000长度的单段二次曲线样条,在局部精度会存在较多问题。

二. 平面与平面求交

适用对象:LGKPlaneLGKPlane

1. 分类

设两个平面为:

Π1: N1 · (X - Q1) = 0 Π2: N2 · (X - Q2) = 0

计算方向叉积:

D = N1 × N2

分类:

  • |D| <= angleTol:两个平面平行或重合;
  • |D| > angleTol:两个平面相交于一条直线。

平行时计算Q2Π1的有向距离:

d = N1 · (Q2 - Q1)
  • |d| <= tol:两个平面重合,返回 overlap region;
  • |d| > tol:两个平面平行不相交。

2. 非平行交线

交线方向:

Dir = normalize(N1 × N2)

把两个平面写成:

N1 · X = c1, c1 = N1 · Q1 N2 · X = c2, c2 = N2 · Q2

可用下面公式求交线上一点:

P0 = (c1 (N2 × D) + c2 (D × N1)) / |D|^2

其中:

D = N1 × N2

最终交线:

L(t) = P0 + t Dir

3. 结果表达

  • 3D 曲线:LGKLine3d
  • 如果上层有 face 边界,解析层只返回无限直线及参数关系,由拓扑裁剪层负责切成有限边。

三. 平面与圆柱面求交

适用对象:LGKPlaneLGKCylinder

圆柱面局部坐标系为(Xc, Yc, Zc),轴线上一点为C0,半径为R。局部方程:

x^2 + y^2 = R^2

其中z沿Zc方向。

定义稳定性指标:

h = |N · Zc|

h越接近 1,平面越接近垂直圆柱轴线;h越接近 0,平面越接近平行圆柱轴线。

1. 平面垂直圆柱轴线:圆

条件:

| |N · Zc| - 1 | <= angleTol

此时平面是圆柱的横截面,交线为圆。

圆心为圆柱轴线与平面的交点:

t = N · (Q - C0) / (N · Zc) Center = C0 + t Zc

半径:

R

结果:

  • 3D 曲线:LGKCircle3d(Center, R, Xc, Yc),方向需与平面法向一致时可调整基向量;
  • 圆柱 pcurve:u = atan2(y, x)v = z,其中z为常数。

2. 平面平行圆柱轴线:两条直线 / 一条切线 / 无交

条件:

|N · Zc| <= angleTol

此时平面与圆柱轴线平行。先计算圆柱轴线到平面的距离:

d = N · (C0 - Q) absD = |d|

分类:

  • absD > R + tol:无交;
  • |absD - R| <= tol:相切,交线是一条直线;
  • absD < R - tol:相交,交线是两条互相平行的直线。

构造方式:

  1. 取圆柱横截平面中的方向:
A = normalize(N - (N · Zc) Zc)

平行分支中N · Zc ≈ 0,所以A基本等于平面法向在圆柱横截面内的方向。

  1. 在横截圆x^2 + y^2 = R^2上求与平面相交的点。

轴线到平面的有向距离为d,横截圆上满足:

A · radial = -d

令:

B = normalize(Zc × A)

absD < R,两条母线对应的横截点为:

radial1 = -d A + sqrt(R^2 - d^2) B radial2 = -d A - sqrt(R^2 - d^2) B

交线:

L1(t) = C0 + radial1 + t Zc L2(t) = C0 + radial2 + t Zc

相切时sqrt(R^2 - d^2) ≈ 0,两条线合并成一条切线。

3. 一般斜截:椭圆

条件:

h = |N · Zc| > angleTol

并且未触发病态样条阈值。

平面与圆柱轴线相交,椭圆中心为:

t = N · (Q - C0) / (N · Zc) Center = C0 + t Zc

椭圆短轴方向:

Eminor = normalize(Zc × N)

短半轴:

b = R

椭圆长轴方向:

Emajor = normalize(Eminor × N)

长半轴:

a = R / |N · Zc|

h = 1a = b = R,退化为圆。

结果:

  • 3D 曲线:LGKEllipse3d(Center, Emajor, Eminor, a, b)

4. 病态斜截:转成两条样条曲线

触发条件:

a / b > 10000

或:

|N · Zc| < 0.0001

此时不构造超长轴椭圆,而是在建模空间[-5000, 5000]内构造两条 B 样条曲线。

推荐参数化方式:用圆柱轴向坐标z做主参数。在圆柱局部坐标中,平面方程可写为:

nx x + ny y + nz z + c = 0

其中:

nz = N · Zc

对给定z,在横截圆上求直线:

nx x + ny y = -c - nz z

与圆:

x^2 + y^2 = R^2

的交点。通常得到两个分支,对应两条样条曲线。

处理步骤:

  1. z ∈ [-5000, 5000]范围内求有效区间;
  2. 对每个有效z采样横截圆与平面直线的两个交点;
  3. 按分支连续性排序,分别拟合两条 3D B 样条;
  4. 同时生成平面 pcurve 与圆柱 pcurve;
  5. 拟合后用原始平面和圆柱面做距离校验。

这样可以避免用一个极端长轴椭圆表示局部近直线的交线。

四. 平面与圆锥面求交

适用对象:LGKPlaneLGKCone

圆锥面使用局部坐标系(Xc, Yc, Zc)。为兼容普通圆锥和截锥,可把半径写成轴向坐标的线性函数:

r(z) = r0 + k z

局部方程:

x^2 + y^2 = r(z)^2

如果是以顶点Apex为原点的标准圆锥,则:

r(z) = z tan(alpha)

其中alpha是圆锥半角。

1. 分类原则

平面截圆锥的数学结果是圆锥曲线或退化直线/点:

  • 平面垂直圆锥轴线:圆;
  • 平面斜截且只切一侧:椭圆;
  • 平面与一条母线方向平行:抛物线;
  • 平面穿过双侧或接近轴向切割:双曲线;
  • 平面过顶点:可能退化为两条母线、一条切线或一个顶点。

第一阶段结果表达策略:

  • 圆:用LGKCircle3d
  • 稳定椭圆:用LGKEllipse3d
  • 过于狭长的椭圆:转 B 样条;
  • 抛物线:统一用 B 样条;
  • 双曲线:统一用 B 样条;
  • 退化两条母线/一条母线:用LGKLine3d
  • 仅顶点接触:返回孤立点。

2. 平面垂直圆锥轴线:圆

条件:

| |N · Zc| - 1 | <= angleTol

平面与圆锥轴线交于:

t = N · (Q - C0) / (N · Zc) Center = C0 + t Zc

对应半径:

R = r(t)

分类:

  • R > tol:返回圆;
  • R <= tol:平面经过圆锥顶点附近,返回孤立点或退化圆。

3. 平面过顶点:退化线或点

若能取得圆锥顶点Apex,先判断:

|N · (Apex - Q)| <= tol

即平面经过顶点。

此时在平面内找圆锥母线方向。设单位母线方向G满足:

G · Zc = cos(alpha) |G × Zc| = sin(alpha) N · G = 0

等价于在圆锥方向圆上与平面过原点的方向约束求交。

分类:

  • 两个不同母线方向:返回两条直线;
  • 两个方向重合:返回一条切线;
  • 没有真实母线方向:仅顶点接触或无有效交线。

如果当前阶段不想单独实现母线方向解析,可退化为样条采样,但仍应保留“过顶点退化”的分类,以免生成不稳定的小环或错误椭圆。

4. 一般斜截:椭圆 / 抛物线 / 双曲线

beta为平面与圆锥轴线的夹角,即轴线方向Zc与平面本身的夹角:

sin(beta) = |N · Zc|

圆锥半角为alpha

经典分类:

  • beta > alpha:椭圆;
  • beta ≈ alpha:抛物线;
  • beta < alpha:双曲线。

注意这里需要使用角度容差,不能直接用裸浮点比较。

第一阶段建议:

  1. 如果分类为稳定椭圆,构造LGKEllipse3d
  2. 如果椭圆长短轴比过大,转 B 样条;
  3. 如果分类为抛物线或双曲线,直接转 B 样条;
  4. 如果接近顶点或参数过大,按尺度分段拟合。

5. 圆锥截线的样条构造

推荐使用轴向参数z或平面内主方向参数s构造样条。

局部平面方程:

nx x + ny y + nz z + c = 0

圆锥方程:

x^2 + y^2 = (r0 + k z)^2

对给定z,求平面直线:

nx x + ny y = -c - nz z

与横截圆:

x^2 + y^2 = r(z)^2

的交点。每个连续分支拟合为一条 B 样条。

分段规则:

  • 对有界有效区间,直接按曲率自适应采样;
  • 对无界抛物线/双曲线,裁剪到建模空间[-5000, 5000]
  • 若区间跨越大尺度,按[-5000,-100][-100,100][100,5000]分段;
  • 若中央段仍有精度问题,继续按10的尺度细分。

每段样条拟合后必须校验:

|N · (P - Q)| <= tol |sqrt(x^2 + y^2) - r(z)| <= tol

五. 平面与球面求交

适用对象:LGKPlaneLGKSphere

球面球心为O,半径为R

1. 几何分类

计算球心到平面的有向距离:

d = N · (O - Q) absD = |d|

分类:

  • absD > R + tol:无交;
  • |absD - R| <= tol:相切,得到一个孤立点;
  • absD < R - tol:相交,交线为圆。

2. 相交圆构造

圆心是球心到平面的正交投影:

Center = O - d N

圆半径:

r = sqrt(R^2 - d^2)

圆所在平面就是输入平面,圆的基向量可直接使用平面(U, V)

结果:

  • 3D 曲线:LGKCircle3d(Center, r, U, V)

3. 相切点

相切点为:

P = O - d N

返回m_intPoints,类型标记为 tangent。不要构造半径为 0 的圆作为普通交线,否则后续拓扑裁剪容易误判。

六. 平面与圆环面求交

适用对象:LGKPlaneLGKTorus

圆环面局部坐标系为(Xt, Yt, Zt),中心为C,主半径为R,管半径为r。局部方程:

(sqrt(x^2 + y^2) - R)^2 + z^2 = r^2

圆环面的一般平面截线是四次曲线,第一阶段不做全量解析。仅处理与Zt轴有特殊关系的情况,其余退回曲面-曲面数值求交。

1. 水平截面:平面法向平行圆环面轴线

条件:

| |N · Zt| - 1 | <= angleTol

把平面转换到圆环面局部坐标,得到常数高度:

z0 = Zt · (Q - C)

分类:

  • |z0| > r + tol:无交;
  • | |z0| - r | <= tol:相切,得到一条圆,半径为R
  • |z0| < r - tol:得到两条同轴圆。

两条圆的半径:

rho = sqrt(r^2 - z0^2) R1 = R + rho R2 = R - rho

R2 <= tol,内侧圆退化,需要按点或退化曲线处理;正常圆环面通常R > r,所以R2 > 0

圆心:

Center = C + z0 Zt

结果:

  • R1对应外侧圆;
  • R2对应内侧圆;
  • 两条圆都位于输入平面内。

2. 子午截面:平面包含圆环面轴线

条件:

平面与 Zt 平行,并且圆环面轴线到平面的距离 <= tol

也就是Zt方向在平面内,且中心轴线落在平面上。

此时截线是圆环管截面的两个圆。设平面内垂直于轴线的方向:

E = normalize(Zt × N)

两个圆心:

Center1 = C + R E Center2 = C - R E

半径均为:

r

两个圆都位于该子午平面内,法向为输入平面法向N

3. 竖直偏置截面:平面平行圆环面轴线但不包含轴线

如果需要支持“平面与圆环面Zt轴平行但不重合”的情况,可作为第一阶段的样条特例,而不是精确四次曲线对象。

条件:

|N · Zt| <= angleTol

圆环面轴线到平面的距离:

d = N · (C - Q) absD = |d|

absD > R + r + tol,无交。

在平面内建立坐标:

  • z沿Zt
  • w沿E = normalize(Zt × N)
  • 偏置距离为d

圆环面方程变成:

(sqrt(w^2 + d^2) - R)^2 + z^2 = r^2

可解出:

z = ± sqrt(r^2 - (sqrt(w^2 + d^2) - R)^2)

有效区间满足根号内非负。每个连续的z >= 0/z <= 0分支拟合成 B 样条。

absD <= tol时,该公式退化为上一节的两个圆,应优先返回精确圆,不走样条。

4. 其他圆环面平面截线

一般斜截圆环面会得到四次曲线,第一阶段不实现专用解析。处理策略:

平面 + 圆环面特殊解析 成功 -> 返回圆或样条 不满足特殊条件 -> 退回曲面-曲面数值求交

不要用大量临时特判硬解一般 quartic,否则会增加后续维护难度。

七. 关键注意事项

  1. 不要为了“解析”强行保留病态椭圆、病态双曲线的精确参数表达。对建模内核来说,有限建模空间内稳定、带容差的样条结果更可控。
  2. 所有分类先用几何距离和角度判断,避免直接从代数方程根的数量反推几何关系。
  3. 相切点、顶点接触、重合平面等结果的一些细节处理。