曲线曲线求交解析方案

曲线曲线求交解析方案

一. 直线与圆的 3D 解析求交

适用对象:LGKLine3dLGKCircle3d

输入容差规则:

  • 角度判断统一使用系统角度容差 LGKConstants::AngleTolerance
  • 长度、距离、点在线上、点在圆上、参数范围判断统一使用调用方传入的长度容差,例如 LGKIntCrvCrvOption::m_tol

1. 同平面情况

直线与圆同平面的判定分两步:

  1. 判断直线方向与圆平面法向是否垂直,角度容差使用系统角度容差。
  2. 判断直线原点到圆平面的距离是否在传入长度容差内。

如果判定为同平面,则将 3D 直线转换到圆所在平面的 2D 坐标系中,调用已有 2D 直线与圆解析求交,再把 2D 交点转换回圆上的 3D 点。

2. 不同平面且夹角大于 45 度

如果直线不在圆平面内,先计算直线与圆平面的夹角。

当夹角大于 45 度时:

  1. 调用直线与圆所在平面的求交逻辑,得到直线和平面的交点。
  2. 判断交点是否在直线参数范围内,使用 LGKCurveUtil::Curve3dConstainsParam,使用长度容差,避免使用参数容差带来容差判断不一致的问题。
  3. 使用 LGKCurveUtil::Curve3dConstainsPoint 判断交点是否在圆上,传入长度容差。
  4. 如果满足条件,则该点为直线与圆的交点。

3. 不同平面且夹角小于等于 45 度

如果直线与圆平面的夹角小于等于 45 度:

  1. 将直线投影到圆所在平面。
  2. 在圆平面的 2D 坐标系中调用已有 2D 直线与圆解析求交。
  3. 将得到的 2D 交点转换成圆上的 3D 点。
  4. 判断该 3D 点是否在原始 3D 直线上,使用传入长度容差。
  5. 满足条件的点作为最终交点。

45 度边界判断应使用系统角度容差,避免边界附近因浮点误差选择不稳定的分支。

4. 参数与结果

2D 求交分支的结果处理取决于曲线是否经过投影:

  • 交点 3D 坐标由 2D 交点转换得到。
  • 交点的参数:
    • 同平面分支中,3D 曲线只是转换到自身所在平面的 2D 坐标系,2D 参数与原 3D 参数一致,直线参数 param1 和圆参数 param2 都可以直接使用 2D 求交结果。
    • 小角度投影分支中,直线经过投影,投影直线的 2D 参数不能作为原始 3D 直线参数;最终 3D 交点落在圆上,因此圆参数 param2 可以直接使用 2D 圆参数,直线参数 param1 必须根据最终 3D 交点在原始 3D 直线上重新计算。
  • 交点类型沿用 2D 求交结果中的 Simple / Tangent 类型。

直线-平面分支得到的空间候选点没有 2D 结果参数,此时再计算直线参数和圆参数,交点类型默认为 Simple

参数范围应在候选点生成阶段检查;如果求交过程中已经判断候选交点落在两条曲线的参数范围内,最终加入结果前不再重复检查。

5. 调度顺序

解析求交分发需要同时支持:

  • line-circle
  • circle-line

当输入顺序是 circle-line 时,可以复用 line-circle 实现,但需要交换返回结果中的两个曲线参数,确保 param1 对应第一个输入曲线,param2 对应第二个输入曲线。

二. 直线与椭圆的 3D 解析求交

适用对象:LGKLine3dLGKEllipse3d

输入容差规则与直线-圆一致:角度判断统一使用系统角度容差,长度、距离、点在线上、点在椭圆上、参数范围判断统一使用调用方传入的长度容差。

1. 同平面情况

直线与椭圆同平面的判定分两步:

  1. 判断直线方向与椭圆平面法向是否垂直,角度容差使用系统角度容差。
  2. 判断直线原点到椭圆平面的距离是否在传入长度容差内。

如果判定为同平面,则将 3D 直线转换到椭圆所在平面的 2D 坐标系中,调用已有或待实现的 2D 直线与椭圆解析求交,再把 2D 交点转换回椭圆上的 3D 点。

2. 不同平面且夹角大于 45 度

如果直线不在椭圆平面内,先计算直线与椭圆平面的夹角。

当夹角大于 45 度时:

  1. 调用直线与椭圆所在平面的求交逻辑,得到直线和平面的交点。
  2. 判断交点是否在直线参数范围内,使用 LGKCurveUtil::Curve3dConstainsParam,使用长度容差,避免使用参数容差带来容差判断不一致的问题。
  3. 使用 LGKCurveUtil::Curve3dConstainsPoint 判断交点是否在椭圆上,传入长度容差。
  4. 如果满足条件,则该点为直线与椭圆的交点。

3. 不同平面且夹角小于等于 45 度

如果直线与椭圆平面的夹角小于等于 45 度:

  1. 将直线投影到椭圆所在平面。
  2. 在椭圆平面的 2D 坐标系中调用 2D 直线与椭圆解析求交。
  3. 将得到的 2D 交点转换成椭圆上的 3D 点。
  4. 判断该 3D 点是否在原始 3D 直线上,使用传入长度容差。
  5. 满足条件的点作为最终交点。

45 度边界判断应使用系统角度容差。

4. 参数与结果

2D 求交分支的结果处理取决于曲线是否经过投影:

  • 交点 3D 坐标由 2D 交点转换得到。
  • 交点的参数:
    • 同平面分支中,3D 曲线只是转换到自身所在平面的 2D 坐标系,2D 参数与原 3D 参数一致,直线参数 param1 和椭圆参数 param2 都可以直接使用 2D 求交结果。
    • 小角度投影分支中,直线经过投影,投影直线的 2D 参数不能作为原始 3D 直线参数;最终 3D 交点落在椭圆上,因此椭圆参数 param2 可以直接使用 2D 椭圆参数,直线参数 param1 必须根据最终 3D 交点在原始 3D 直线上重新计算。
  • 交点类型沿用 2D 求交结果中的 Simple / Tangent 类型。

直线-平面分支得到的空间候选点没有 2D 结果参数,此时再计算直线参数和椭圆参数,交点类型默认为 Simple

参数范围应在候选点生成阶段检查;如果求交过程中已经判断候选交点落在两条曲线的参数范围内,最终加入结果前不再重复检查。

5. 调度顺序

解析求交分发需要同时支持:

  • line-ellipse
  • ellipse-line

当输入顺序是 ellipse-line 时,可以复用 line-ellipse 实现,但需要交换返回结果中的两个曲线参数。

三. 圆与圆的 3D 解析求交

适用对象:两个 LGKCircle3d

输入容差规则:角度判断统一使用系统角度容差,长度、距离、点在圆上、参数范围判断统一使用调用方传入的长度容差。

1. 同平面情况

两个圆同平面的判定应同时检查:

  1. 两个圆平面法向是否平行,角度容差使用系统角度容差。
  2. 一个圆的圆心到另一个圆平面的距离是否在传入长度容差内。

如果判定为同平面,则将两个圆转换到同一个平面 2D 坐标系中,调用已有 2D 圆与圆解析求交,再把 2D 交点转换回 3D 点。

2. 不同平面且平面夹角大于 45 度

如果两个圆不共面,先计算两个圆所在平面的夹角。

当平面夹角大于 45 度时:

  1. 调用两个平面的求交逻辑,得到两平面的交线。
  2. 使用该交线与第一个圆做直线-圆解析求交,得到候选交点。
  3. 判断候选交点是否在第二个圆上,使用传入长度容差。
  4. 判断候选交点是否分别落在两个圆的参数范围内,使用 LGKCurveUtil::Curve3dConstainsParam,使用长度容差,避免使用参数容差带来容差判断不一致的问题。
  5. 满足条件的点作为两个圆的交点。

3. 不同平面且平面夹角小于等于 45 度

如果两个圆所在平面的夹角小于等于 45 度:

  1. 将其中一个圆投影到另一个圆所在平面。
  2. 投影后的圆一般解析生成椭圆。
  3. 在目标圆所在平面的 2D 坐标系中调用圆与椭圆解析求交,得到候选交点。
  4. 将候选交点转换回目标圆上的 3D 点。
  5. 判断该 3D 点是否在另一个原始 3D 圆上,使用传入长度容差。
  6. 判断候选交点是否分别落在两个圆的参数范围内,使用 LGKCurveUtil::Curve3dConstainsParam,使用长度容差,避免使用参数容差带来容差判断不一致的问题。
  7. 满足条件的点作为两个圆的交点。

45 度边界判断应使用系统角度容差。

4. 参数与结果

2D 求交分支的结果处理取决于曲线是否经过投影:

  • 交点 3D 坐标由目标平面内的 2D 交点转换得到。
  • 交点的参数:
    • 同平面分支中,两个 3D 圆只是转换到同一个平面的 2D 坐标系,2D 参数与原 3D 参数一致,两个圆参数都可以直接使用 2D 求交结果。
    • 小角度投影分支中,被投影的圆生成的是投影椭圆,投影椭圆的 2D 参数不能作为原始 3D 圆参数;目标平面内未投影的圆参数可以直接使用 2D 圆参数,被投影圆的参数必须根据最终 3D 交点在原始 3D 圆上重新计算。
  • 交点类型沿用 2D 求交结果中的 Simple / Tangent 类型。

平面交线分支得到的空间候选点没有 2D 结果参数,此时再计算两个圆的参数,交点类型可根据两个圆在该点的切向是否平行判断 SimpleTangent

参数范围应在候选点生成阶段检查;如果求交过程中已经判断候选交点落在两条曲线的参数范围内,最终加入结果前不再重复检查。

四. 圆与椭圆的 3D 解析求交

适用对象:LGKCircle3dLGKEllipse3d

整体处理方式与圆-圆求交类似,区别在于小角度投影分支中,应将椭圆解析投影到圆所在平面,而不是投影圆。

输入容差规则:角度判断统一使用系统角度容差,长度、距离、点在曲线上、参数范围判断统一使用调用方传入的长度容差。

1. 同平面情况

圆与椭圆同平面的判定应同时检查:

  1. 圆平面法向与椭圆平面法向是否平行,角度容差使用系统角度容差。
  2. 椭圆中心到圆所在平面的距离是否在传入长度容差内,或圆心到椭圆所在平面的距离是否在传入长度容差内。

如果判定为同平面,则将圆和椭圆转换到同一个平面 2D 坐标系中,调用 2D 圆与椭圆解析求交,再把 2D 交点转换回 3D 点。

2. 不同平面且平面夹角大于 45 度

如果圆和椭圆不共面,先计算圆所在平面与椭圆所在平面的夹角。

当平面夹角大于 45 度时:

  1. 调用两个平面的求交逻辑,得到两平面的交线。
  2. 使用该交线与圆做直线-圆解析求交,得到候选交点。
  3. 判断候选交点是否在椭圆上,使用 LGKCurveUtil::Curve3dConstainsPoint,传入长度容差。
  4. 判断候选交点是否分别落在圆和椭圆的参数范围内,使用 LGKCurveUtil::Curve3dConstainsParam,使用长度容差,避免使用参数容差带来容差判断不一致的问题。
  5. 满足条件的点作为圆与椭圆的交点。

3. 不同平面且平面夹角小于等于 45 度

如果圆所在平面与椭圆所在平面的夹角小于等于 45 度:

  1. 将椭圆解析投影到圆所在平面。
  2. 投影后的椭圆仍是圆锥曲线,需要实现一个“将 3D 椭圆解析投影到指定平面”的方法,生成目标平面内的 2D 椭圆表达。
  3. 在圆所在平面的 2D 坐标系中调用 2D 圆与椭圆解析求交,得到候选交点。
  4. 将候选交点转换回圆上的 3D 点。
  5. 判断该 3D 点是否在原始 3D 椭圆上,使用 LGKCurveUtil::Curve3dConstainsPoint,传入长度容差。
  6. 判断候选交点是否分别落在圆和椭圆的参数范围内,使用 LGKCurveUtil::Curve3dConstainsParam,使用长度容差,避免使用参数容差带来容差判断不一致的问题。
  7. 满足条件的点作为圆与椭圆的交点。

45 度边界判断应使用系统角度容差。

4. 参数与结果

2D 求交分支的结果处理取决于曲线是否经过投影:

  • 交点 3D 坐标由圆所在平面内的 2D 交点转换得到。
  • 交点的参数:
    • 同平面分支中,圆和椭圆只是转换到同一个平面的 2D 坐标系,2D 参数与原 3D 参数一致,圆参数和椭圆参数都可以直接使用 2D 求交结果。
    • 小角度投影分支中,椭圆经过投影,投影椭圆的 2D 参数不能作为原始 3D 椭圆参数;圆在自身平面内未投影,圆参数可以直接使用 2D 圆参数,椭圆参数必须根据最终 3D 交点在原始 3D 椭圆上重新计算。
  • 交点类型沿用 2D 求交结果中的 Simple / Tangent 类型。

平面交线分支得到的空间候选点没有 2D 结果参数,此时再计算圆和椭圆的参数,交点类型可根据两条曲线在该点的切向是否平行判断 SimpleTangent

参数范围应在候选点生成阶段检查;如果求交过程中已经判断候选交点落在两条曲线的参数范围内,最终加入结果前不再重复检查。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值