曲面曲面解析求交方案-平面+曲面
文章目录
- 曲面曲面解析求交方案-平面+曲面
- 一. 通用约定
- 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) · V3. 容差规则
- 平行、垂直、同向、反向等方向关系使用角度容差
LGKConstants::AngleTolerance。 - 点到平面、点到曲面、半径差、轴线距离等几何量使用调用方传入的长度容差,例如曲面-曲面求交 option 中的
m_tol。 - 参数域边界不能只用参数差判断几何存在性,最终需要回到空间距离校验。
- 分支边界必须带容差,例如:
- 平面与轴线是否平行;
- 平面是否过球心/圆锥顶点/圆环面轴线;
- 相切、无交、穿越分类;
- 椭圆长短轴比是否过大。
4. 结果规则
曲面-曲面求交结果不应只返回散点。平面-曲面的解析结果至少需要支持三类输出:
m_intCurves:交线曲线。- 3D 曲线:直线、圆、椭圆或 B 样条曲线。
- 曲线参数范围。
- 曲线类型:普通相交、相切、反切等。
- 其他端点类型等数据。// 可参考求交结果调研数据文档,这篇主要讲方法思路。
m_intPoints:孤立接触点或退化交点。- 例如平面与球面相切时得到一个点。
- 平面与圆锥仅在顶点接触时得到一个点。
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]这样避免远处大坐标影响100或10范围内的拟合精度。
*注:因为发现-10000长度的单段二次曲线样条,在局部精度会存在较多问题。
二. 平面与平面求交
适用对象:LGKPlane与LGKPlane。
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 Dir3. 结果表达
- 3D 曲线:
LGKLine3d。 - 如果上层有 face 边界,解析层只返回无限直线及参数关系,由拓扑裁剪层负责切成有限边。
三. 平面与圆柱面求交
适用对象:LGKPlane与LGKCylinder。
圆柱面局部坐标系为(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:相交,交线是两条互相平行的直线。
构造方式:
- 取圆柱横截平面中的方向:
A = normalize(N - (N · Zc) Zc)平行分支中N · Zc ≈ 0,所以A基本等于平面法向在圆柱横截面内的方向。
- 在横截圆
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 = 1时a = 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的交点。通常得到两个分支,对应两条样条曲线。
处理步骤:
- 在
z ∈ [-5000, 5000]范围内求有效区间; - 对每个有效
z采样横截圆与平面直线的两个交点; - 按分支连续性排序,分别拟合两条 3D B 样条;
- 同时生成平面 pcurve 与圆柱 pcurve;
- 拟合后用原始平面和圆柱面做距离校验。
这样可以避免用一个极端长轴椭圆表示局部近直线的交线。
四. 平面与圆锥面求交
适用对象:LGKPlane与LGKCone。
圆锥面使用局部坐标系(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:双曲线。
注意这里需要使用角度容差,不能直接用裸浮点比较。
第一阶段建议:
- 如果分类为稳定椭圆,构造
LGKEllipse3d; - 如果椭圆长短轴比过大,转 B 样条;
- 如果分类为抛物线或双曲线,直接转 B 样条;
- 如果接近顶点或参数过大,按尺度分段拟合。
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五. 平面与球面求交
适用对象:LGKPlane与LGKSphere。
球面球心为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 的圆作为普通交线,否则后续拓扑裁剪容易误判。
六. 平面与圆环面求交
适用对象:LGKPlane与LGKTorus。
圆环面局部坐标系为(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,否则会增加后续维护难度。
七. 关键注意事项
- 不要为了“解析”强行保留病态椭圆、病态双曲线的精确参数表达。对建模内核来说,有限建模空间内稳定、带容差的样条结果更可控。
- 所有分类先用几何距离和角度判断,避免直接从代数方程根的数量反推几何关系。
- 相切点、顶点接触、重合平面等结果的一些细节处理。