曲线曲面求交解析方案-平面曲线文章目录曲线曲面求交解析方案-平面曲线一. 通用约定1. 输入对象2. 容差规则3. 结果规则二. 直线与平面求交1. 有限线段的端点距离分类2. 穿越时的精确交点3. 无限直线情况三. 圆/椭圆与平面求交1. 为什么不直接用两平面交线与圆/椭圆求交2. 统一参数表达3. 先处理平面平行/共面4. 非平行时用最大/最小有向距离分类5. 交点数量分类5.1 无交5.2 一个切触/容差接触点5.3 两个交点6. 容差模糊区处理7. 伪代码附录 A椭圆到平面的最大/最小有向距离点推导附录 B两个交点参数 t phi ± acos(-D / S) 的推导本文档单独记录直线、圆、椭圆与平面的解析求交方案。核心目标是用原始曲线到目标平面的有向距离做稳定分类避免浅夹角情况下直接构造两平面交线导致的容差漏交。一. 通用约定1. 输入对象曲线对象LGKLine3dLGKCircle3dLGKEllipse3d曲面对象LGKPlane2. 容差规则平行、垂直等方向关系使用系统角度容差LGKConstants::AngleTolerance。点到平面、点到曲线相交判断使用调用方传入的长度容差例如曲线曲面求交 option 中的m_tol。参数范围过滤不能只用参数差扩张应最终回到空间距离校验。所有候选点加入结果前必须同时满足在曲线参数范围内在平面参数范围内如果平面被上层裁剪为有界参数域点在原始曲线和原始平面上。3. 结果规则离散交点至少记录3D 交点坐标曲线参数curveParam平面参数uv求交类型普通交点Simple或切触/容差接触Tangent。如果曲线整体位于平面内数学结果是重合区间不是离散交点。当前点求交接口若不能直接返回 overlap可暂时返回空点结果后续应通过 overlap 结果扩展表达。二. 直线与平面求交适用对象LGKLine3d或有限线段与平面。直线/线段与平面求交应优先使用点到平面的有向距离做分类而不是先直接套代数公式。原因是有向距离分类可以自然处理无交、穿越、端点接触和重合并且和圆/椭圆-平面求交的“先看距离范围再生成交点”的思路一致。1. 有限线段的端点距离分类设线段为L(t) P0 t (P1 - P0), t ∈ [0, 1]平面为n · (X - Q) 0其中n是单位法向。计算两个端点到平面的有向距离d0 n · (P0 - Q) d1 n · (P1 - Q)用d0、d1和长度容差tol分类d0 tol d1 tol两个端点都在平面正侧无交d0 -tol d1 -tol两个端点都在平面负侧无交|d0| tol |d1| tol整条线段在平面容差内返回重合区间只有一个端点满足|di| tol返回该端点作为端点接触d0、d1一正一负线段穿过平面计算精确交点。2. 穿越时的精确交点当端点有向距离异号时交点参数由线性插值得到t d0 / (d0 - d1)交点为P P0 t (P1 - P0)这个公式来自d(t) (1 - t) d0 t d1令d(t) 0(1 - t) d0 t d1 0得到t d0 / (d0 - d1)候选点加入结果前仍应检查t是否位于[0, 1]|n · (P - Q)| tol如果上层使用无限直线或射线按对应参数域规则过滤。3. 无限直线情况如果输入是无限直线L(t) O t D计算den n · D num n · (O - Q)|den| angleTol且|num| tol直线位于平面内返回重合直线|den| angleTol且|num| tol直线平行平面无交否则t -num / den P O t D对于有限线段即使底层用无限直线公式生成候选点最终也应回到端点有向距离和参数域做过滤。线段场景下端点距离分类是更稳定、更直接的主流程。三. 圆/椭圆与平面求交适用对象LGKCircle3d/LGKEllipse3d与平面。圆和椭圆都是位于自身平面内的完整平面曲线。与另一个平面求交时数学上可以转化为“曲线所在平面与目标平面的交线”再与圆/椭圆求交但是在几何内核中直接把两平面交线作为主判据会有小角度容差问题。因此本方案优先使用圆/椭圆上点到目标平面的最大/最小有向距离进行分类。1. 为什么不直接用两平面交线与圆/椭圆求交设曲线所在平面为Pi_c目标平面为Pi。当二者不平行时精确数学交点一定落在L Pi_c ∩ Pi因此直接计算L再做L与圆/椭圆求交看起来最自然。但当两个平面夹角很小时这个方案会变得不稳定两平面交线的位置对平面法向和点位误差非常敏感。夹角越小同样的平面距离误差会在交线位置上放大得越明显。L与圆/椭圆的求交通常是严格的曲线内判定。如果交线因为数值误差被推离曲线可能得到“无交”。但从原始几何角度看圆/椭圆上某个点到目标平面的距离可能已经在长度容差内这应该被识别为容差接触或切触。因此小角度时“交线没有精确碰到圆/椭圆”不等价于“圆/椭圆与目标平面在容差意义下无交”。换句话说线-圆/线-椭圆适合作为交点生成手段但不适合作为浅夹角情况下的唯一存在性判据。更稳定的判据是直接考察曲线上所有点到目标平面的有向距离范围dMin d(t) dMax如果整个距离范围都在目标平面一侧则无交如果极值距离在容差内则有一个切触/容差接触点如果最小值和最大值异号则有两个交点。这个判据直接作用在原始曲线和目标平面上不需要构造病态的两平面交线。2. 统一参数表达椭圆参数式E(t) C a cos(t) U b sin(t) V其中C椭圆中心U、V椭圆所在平面内的两个正交单位轴a、b两个半轴长度N U × V椭圆所在平面法向t椭圆参数完整椭圆通常取[0, 2pi)。圆是椭圆的特例a b R目标平面为n · (X - P0) 0其中n是单位法向P0是平面上一点。3. 先处理平面平行/共面先判断曲线所在平面和目标平面是否平行|N × n| angleTol或等价地使用abs(N · n)接近1。如果平行则判断中心到目标平面的有向距离D n · (C - P0)|D| tol曲线整体位于目标平面内返回重合类型参数区间为完整圆/椭圆参数域或弧段自身参数域|D| tol平行不共面无交。4. 非平行时用最大/最小有向距离分类非平行时曲线上点到目标平面的有向距离为d(t) n · (E(t) - P0)它可以写成d(t) D A cos(t) B sin(t)其中D n · (C - P0) A a (n · U) B b (n · V)令S sqrt(A^2 B^2) phi atan2(B, A)则最大/最小有向距离和对应参数为dMax D S, tMax phi dMin D - S, tMin phi pi对应空间点为PMax E(tMax) PMin E(tMin)这一步对圆和椭圆都成立不需要再按平面夹角是否大于45°分支。圆的最大/最小点退化为沿目标平面法向在圆平面内投影方向的两个点椭圆的最大/最小点是椭圆在该方向上的支撑点受半轴长度影响。5. 交点数量分类使用dMin、dMax和长度容差tol分类5.1 无交dMin tol或dMax -tol说明整条圆/椭圆都在目标平面同一侧无交。5.2 一个切触/容差接触点如果|dMin| tol则最小距离点PMin E(phi pi)是切触/容差接触点。如果|dMax| tol则最大距离点PMax E(phi)是切触/容差接触点。这里推荐直接返回极值点而不是再依赖两平面交线与圆/椭圆求交。因为这个分支正是浅夹角下最容易被交线法漏掉的情况。5.3 两个交点如果dMin -tol dMax tol说明曲线一部分在目标平面正侧一部分在负侧必然有两个交点。两个交点参数可以直接解析得到theta acos(clamp(-D / S, -1, 1)) t1 phi theta t2 phi - theta再计算P1 E(t1) P2 E(t2)候选点加入结果前仍需对周期参数做归一化如果是圆弧/椭圆弧检查参数范围用点到目标平面的空间距离做最终验证按 3D 点距离去重根据切向与平面法向关系标记普通交点或切触点。6. 容差模糊区处理可能出现以下接近退化的情况S非常小非平行判断和距离函数矛盾通常说明两个平面几乎平行、输入轴不规范或曲线退化dMin和dMax都在容差内数学上非平行完整非退化椭圆不应整体在平面内但在容差意义下整条曲线可能都接近目标平面两个解析交点非常接近接近相切应按空间距离去重并优先返回切触类型。这些情况不应通过宽泛异常或静默空结果掩盖。建议保留明确分支要么按近似重合/容差接触返回要么降级到通用数值校验并在调试日志中暴露原因。7. 伪代码IntersectEllipsePlane(E, Plane) { C E.center U normalize(E.axisU) V normalize(E.axisV) a E.radiusU b E.radiusV N normalize(U × V) n normalize(Plane.normal) P0 Plane.origin if IsParallel(N, n, angleTol): D n · (C - P0) if abs(D) tol: return Coincident(E, E.interval) return Empty D n · (C - P0) A a * (n · U) B b * (n · V) S hypot(A, B) if S tol: return HandleNearParallelOrDegenerateCase() phi atan2(B, A) dMin D - S dMax D S if dMin tol or dMax -tol: return Empty result EmptyResult if abs(dMin) tol: t NormalizePeriod(phi pi) result.AddTouch(E(t), t) if abs(dMax) tol: t NormalizePeriod(phi) result.AddTouch(E(t), t) if result not empty: result.UniqueBy3dDistance(tol) return result // dMin -tol dMax tol q clamp(-D / S, -1, 1) theta acos(q) t1 NormalizePeriod(phi theta) t2 NormalizePeriod(phi - theta) result.AddIfValid(E(t1), t1) result.AddIfValid(E(t2), t2) result.UniqueBy3dDistance(tol) return result }附录 A椭圆到平面的最大/最小有向距离点推导椭圆参数式为E(t) C a cos(t) U b sin(t) V平面有向距离为d(t) n · (E(t) - P0)代入椭圆参数式d(t) n · (C - P0) a (n · U) cos(t) b (n · V) sin(t)记D n · (C - P0) A a (n · U) B b (n · V)则d(t) D A cos(t) B sin(t)D是常数不影响极值点。只需要求g(t) A cos(t) B sin(t)的极值。对g(t)求导g(t) -A sin(t) B cos(t)极值点满足-A sin(t) B cos(t) 0即B cos(t) A sin(t)使用atan2避免A 0的除零问题得到phi atan2(B, A)并有cos(phi) A / S sin(phi) B / S S sqrt(A^2 B^2)因此在t phi时g(phi) A cos(phi) B sin(phi) A^2 / S B^2 / S S这是最大值在t phi pi时g(phi pi) -S这是最小值。所以dMax D S, tMax phi dMin D - S, tMin phi pi几何上最大点相对椭圆中心的向量为E(tMax) - C a cos(phi) U b sin(phi) V (a^2 (n · U) / S) U (b^2 (n · V) / S) V因此椭圆最大距离点是按a^2、b^2加权的支撑点。圆的情况下a b R该方向退化为目标平面法向在圆平面内的投影方向。附录 B两个交点参数t phi ± acos(-D / S)的推导交点满足点在目标平面上d(t) 0也就是D A cos(t) B sin(t) 0令S sqrt(A^2 B^2) phi atan2(B, A)则cos(phi) A / S sin(phi) B / S由余弦差角公式cos(t - phi) cos(t) cos(phi) sin(t) sin(phi)代入上式cos(t - phi) cos(t) A / S sin(t) B / S两边乘以SS cos(t - phi) A cos(t) B sin(t)因此距离函数可以写为d(t) D S cos(t - phi)交点条件变成D S cos(t - phi) 0即cos(t - phi) -D / S令q clamp(-D / S, -1, 1) theta acos(q)余弦方程在一个周期内有两个解t - phi theta t - phi -theta所以两个交点参数为t1 phi theta t2 phi - theta也就是t phi ± acos(-D / S)当|D| S时theta为0或pi两个参数退化为同一个空间点对应切触实现上应由dMin/dMax的极值容差分支提前处理。
曲线曲面求交解析方案-平面+曲线
发布时间:2026/6/28 3:27:49
曲线曲面求交解析方案-平面曲线文章目录曲线曲面求交解析方案-平面曲线一. 通用约定1. 输入对象2. 容差规则3. 结果规则二. 直线与平面求交1. 有限线段的端点距离分类2. 穿越时的精确交点3. 无限直线情况三. 圆/椭圆与平面求交1. 为什么不直接用两平面交线与圆/椭圆求交2. 统一参数表达3. 先处理平面平行/共面4. 非平行时用最大/最小有向距离分类5. 交点数量分类5.1 无交5.2 一个切触/容差接触点5.3 两个交点6. 容差模糊区处理7. 伪代码附录 A椭圆到平面的最大/最小有向距离点推导附录 B两个交点参数 t phi ± acos(-D / S) 的推导本文档单独记录直线、圆、椭圆与平面的解析求交方案。核心目标是用原始曲线到目标平面的有向距离做稳定分类避免浅夹角情况下直接构造两平面交线导致的容差漏交。一. 通用约定1. 输入对象曲线对象LGKLine3dLGKCircle3dLGKEllipse3d曲面对象LGKPlane2. 容差规则平行、垂直等方向关系使用系统角度容差LGKConstants::AngleTolerance。点到平面、点到曲线相交判断使用调用方传入的长度容差例如曲线曲面求交 option 中的m_tol。参数范围过滤不能只用参数差扩张应最终回到空间距离校验。所有候选点加入结果前必须同时满足在曲线参数范围内在平面参数范围内如果平面被上层裁剪为有界参数域点在原始曲线和原始平面上。3. 结果规则离散交点至少记录3D 交点坐标曲线参数curveParam平面参数uv求交类型普通交点Simple或切触/容差接触Tangent。如果曲线整体位于平面内数学结果是重合区间不是离散交点。当前点求交接口若不能直接返回 overlap可暂时返回空点结果后续应通过 overlap 结果扩展表达。二. 直线与平面求交适用对象LGKLine3d或有限线段与平面。直线/线段与平面求交应优先使用点到平面的有向距离做分类而不是先直接套代数公式。原因是有向距离分类可以自然处理无交、穿越、端点接触和重合并且和圆/椭圆-平面求交的“先看距离范围再生成交点”的思路一致。1. 有限线段的端点距离分类设线段为L(t) P0 t (P1 - P0), t ∈ [0, 1]平面为n · (X - Q) 0其中n是单位法向。计算两个端点到平面的有向距离d0 n · (P0 - Q) d1 n · (P1 - Q)用d0、d1和长度容差tol分类d0 tol d1 tol两个端点都在平面正侧无交d0 -tol d1 -tol两个端点都在平面负侧无交|d0| tol |d1| tol整条线段在平面容差内返回重合区间只有一个端点满足|di| tol返回该端点作为端点接触d0、d1一正一负线段穿过平面计算精确交点。2. 穿越时的精确交点当端点有向距离异号时交点参数由线性插值得到t d0 / (d0 - d1)交点为P P0 t (P1 - P0)这个公式来自d(t) (1 - t) d0 t d1令d(t) 0(1 - t) d0 t d1 0得到t d0 / (d0 - d1)候选点加入结果前仍应检查t是否位于[0, 1]|n · (P - Q)| tol如果上层使用无限直线或射线按对应参数域规则过滤。3. 无限直线情况如果输入是无限直线L(t) O t D计算den n · D num n · (O - Q)|den| angleTol且|num| tol直线位于平面内返回重合直线|den| angleTol且|num| tol直线平行平面无交否则t -num / den P O t D对于有限线段即使底层用无限直线公式生成候选点最终也应回到端点有向距离和参数域做过滤。线段场景下端点距离分类是更稳定、更直接的主流程。三. 圆/椭圆与平面求交适用对象LGKCircle3d/LGKEllipse3d与平面。圆和椭圆都是位于自身平面内的完整平面曲线。与另一个平面求交时数学上可以转化为“曲线所在平面与目标平面的交线”再与圆/椭圆求交但是在几何内核中直接把两平面交线作为主判据会有小角度容差问题。因此本方案优先使用圆/椭圆上点到目标平面的最大/最小有向距离进行分类。1. 为什么不直接用两平面交线与圆/椭圆求交设曲线所在平面为Pi_c目标平面为Pi。当二者不平行时精确数学交点一定落在L Pi_c ∩ Pi因此直接计算L再做L与圆/椭圆求交看起来最自然。但当两个平面夹角很小时这个方案会变得不稳定两平面交线的位置对平面法向和点位误差非常敏感。夹角越小同样的平面距离误差会在交线位置上放大得越明显。L与圆/椭圆的求交通常是严格的曲线内判定。如果交线因为数值误差被推离曲线可能得到“无交”。但从原始几何角度看圆/椭圆上某个点到目标平面的距离可能已经在长度容差内这应该被识别为容差接触或切触。因此小角度时“交线没有精确碰到圆/椭圆”不等价于“圆/椭圆与目标平面在容差意义下无交”。换句话说线-圆/线-椭圆适合作为交点生成手段但不适合作为浅夹角情况下的唯一存在性判据。更稳定的判据是直接考察曲线上所有点到目标平面的有向距离范围dMin d(t) dMax如果整个距离范围都在目标平面一侧则无交如果极值距离在容差内则有一个切触/容差接触点如果最小值和最大值异号则有两个交点。这个判据直接作用在原始曲线和目标平面上不需要构造病态的两平面交线。2. 统一参数表达椭圆参数式E(t) C a cos(t) U b sin(t) V其中C椭圆中心U、V椭圆所在平面内的两个正交单位轴a、b两个半轴长度N U × V椭圆所在平面法向t椭圆参数完整椭圆通常取[0, 2pi)。圆是椭圆的特例a b R目标平面为n · (X - P0) 0其中n是单位法向P0是平面上一点。3. 先处理平面平行/共面先判断曲线所在平面和目标平面是否平行|N × n| angleTol或等价地使用abs(N · n)接近1。如果平行则判断中心到目标平面的有向距离D n · (C - P0)|D| tol曲线整体位于目标平面内返回重合类型参数区间为完整圆/椭圆参数域或弧段自身参数域|D| tol平行不共面无交。4. 非平行时用最大/最小有向距离分类非平行时曲线上点到目标平面的有向距离为d(t) n · (E(t) - P0)它可以写成d(t) D A cos(t) B sin(t)其中D n · (C - P0) A a (n · U) B b (n · V)令S sqrt(A^2 B^2) phi atan2(B, A)则最大/最小有向距离和对应参数为dMax D S, tMax phi dMin D - S, tMin phi pi对应空间点为PMax E(tMax) PMin E(tMin)这一步对圆和椭圆都成立不需要再按平面夹角是否大于45°分支。圆的最大/最小点退化为沿目标平面法向在圆平面内投影方向的两个点椭圆的最大/最小点是椭圆在该方向上的支撑点受半轴长度影响。5. 交点数量分类使用dMin、dMax和长度容差tol分类5.1 无交dMin tol或dMax -tol说明整条圆/椭圆都在目标平面同一侧无交。5.2 一个切触/容差接触点如果|dMin| tol则最小距离点PMin E(phi pi)是切触/容差接触点。如果|dMax| tol则最大距离点PMax E(phi)是切触/容差接触点。这里推荐直接返回极值点而不是再依赖两平面交线与圆/椭圆求交。因为这个分支正是浅夹角下最容易被交线法漏掉的情况。5.3 两个交点如果dMin -tol dMax tol说明曲线一部分在目标平面正侧一部分在负侧必然有两个交点。两个交点参数可以直接解析得到theta acos(clamp(-D / S, -1, 1)) t1 phi theta t2 phi - theta再计算P1 E(t1) P2 E(t2)候选点加入结果前仍需对周期参数做归一化如果是圆弧/椭圆弧检查参数范围用点到目标平面的空间距离做最终验证按 3D 点距离去重根据切向与平面法向关系标记普通交点或切触点。6. 容差模糊区处理可能出现以下接近退化的情况S非常小非平行判断和距离函数矛盾通常说明两个平面几乎平行、输入轴不规范或曲线退化dMin和dMax都在容差内数学上非平行完整非退化椭圆不应整体在平面内但在容差意义下整条曲线可能都接近目标平面两个解析交点非常接近接近相切应按空间距离去重并优先返回切触类型。这些情况不应通过宽泛异常或静默空结果掩盖。建议保留明确分支要么按近似重合/容差接触返回要么降级到通用数值校验并在调试日志中暴露原因。7. 伪代码IntersectEllipsePlane(E, Plane) { C E.center U normalize(E.axisU) V normalize(E.axisV) a E.radiusU b E.radiusV N normalize(U × V) n normalize(Plane.normal) P0 Plane.origin if IsParallel(N, n, angleTol): D n · (C - P0) if abs(D) tol: return Coincident(E, E.interval) return Empty D n · (C - P0) A a * (n · U) B b * (n · V) S hypot(A, B) if S tol: return HandleNearParallelOrDegenerateCase() phi atan2(B, A) dMin D - S dMax D S if dMin tol or dMax -tol: return Empty result EmptyResult if abs(dMin) tol: t NormalizePeriod(phi pi) result.AddTouch(E(t), t) if abs(dMax) tol: t NormalizePeriod(phi) result.AddTouch(E(t), t) if result not empty: result.UniqueBy3dDistance(tol) return result // dMin -tol dMax tol q clamp(-D / S, -1, 1) theta acos(q) t1 NormalizePeriod(phi theta) t2 NormalizePeriod(phi - theta) result.AddIfValid(E(t1), t1) result.AddIfValid(E(t2), t2) result.UniqueBy3dDistance(tol) return result }附录 A椭圆到平面的最大/最小有向距离点推导椭圆参数式为E(t) C a cos(t) U b sin(t) V平面有向距离为d(t) n · (E(t) - P0)代入椭圆参数式d(t) n · (C - P0) a (n · U) cos(t) b (n · V) sin(t)记D n · (C - P0) A a (n · U) B b (n · V)则d(t) D A cos(t) B sin(t)D是常数不影响极值点。只需要求g(t) A cos(t) B sin(t)的极值。对g(t)求导g(t) -A sin(t) B cos(t)极值点满足-A sin(t) B cos(t) 0即B cos(t) A sin(t)使用atan2避免A 0的除零问题得到phi atan2(B, A)并有cos(phi) A / S sin(phi) B / S S sqrt(A^2 B^2)因此在t phi时g(phi) A cos(phi) B sin(phi) A^2 / S B^2 / S S这是最大值在t phi pi时g(phi pi) -S这是最小值。所以dMax D S, tMax phi dMin D - S, tMin phi pi几何上最大点相对椭圆中心的向量为E(tMax) - C a cos(phi) U b sin(phi) V (a^2 (n · U) / S) U (b^2 (n · V) / S) V因此椭圆最大距离点是按a^2、b^2加权的支撑点。圆的情况下a b R该方向退化为目标平面法向在圆平面内的投影方向。附录 B两个交点参数t phi ± acos(-D / S)的推导交点满足点在目标平面上d(t) 0也就是D A cos(t) B sin(t) 0令S sqrt(A^2 B^2) phi atan2(B, A)则cos(phi) A / S sin(phi) B / S由余弦差角公式cos(t - phi) cos(t) cos(phi) sin(t) sin(phi)代入上式cos(t - phi) cos(t) A / S sin(t) B / S两边乘以SS cos(t - phi) A cos(t) B sin(t)因此距离函数可以写为d(t) D S cos(t - phi)交点条件变成D S cos(t - phi) 0即cos(t - phi) -D / S令q clamp(-D / S, -1, 1) theta acos(q)余弦方程在一个周期内有两个解t - phi theta t - phi -theta所以两个交点参数为t1 phi theta t2 phi - theta也就是t phi ± acos(-D / S)当|D| S时theta为0或pi两个参数退化为同一个空间点对应切触实现上应由dMin/dMax的极值容差分支提前处理。