曲线曲线求交解析方案
一. 直线与圆的 3D 解析求交
适用对象:LGKLine3d 与 LGKCircle3d。
输入容差规则:
- 角度判断统一使用系统角度容差
LGKConstants::AngleTolerance。 - 长度、距离、点在线上、点在圆上、参数范围判断统一使用调用方传入的长度容差,例如
LGKIntCrvCrvOption::m_tol。
1. 同平面情况
直线与圆同平面的判定分两步:
- 判断直线方向与圆平面法向是否垂直,角度容差使用系统角度容差。
- 判断直线原点到圆平面的距离是否在传入长度容差内。
如果判定为同平面,则将 3D 直线转换到圆所在平面的 2D 坐标系中,调用已有 2D 直线与圆解析求交,再把 2D 交点转换回圆上的 3D 点。
2. 不同平面且夹角大于 45 度
如果直线不在圆平面内,先计算直线与圆平面的夹角。
当夹角大于 45 度时:
- 调用直线与圆所在平面的求交逻辑,得到直线和平面的交点。
- 判断交点是否在直线参数范围内,使用
LGKCurveUtil::Curve3dConstainsParam,使用长度容差,避免使用参数容差带来容差判断不一致的问题。 - 使用
LGKCurveUtil::Curve3dConstainsPoint判断交点是否在圆上,传入长度容差。 - 如果满足条件,则该点为直线与圆的交点。
3. 不同平面且夹角小于等于 45 度
如果直线与圆平面的夹角小于等于 45 度:
- 将直线投影到圆所在平面。
- 在圆平面的 2D 坐标系中调用已有 2D 直线与圆解析求交。
- 将得到的 2D 交点转换成圆上的 3D 点。
- 判断该 3D 点是否在原始 3D 直线上,使用传入长度容差。
- 满足条件的点作为最终交点。
45 度边界判断应使用系统角度容差,避免边界附近因浮点误差选择不稳定的分支。
4. 参数与结果
2D 求交分支的结果处理取决于曲线是否经过投影:
- 交点 3D 坐标由 2D 交点转换得到。
- 交点的参数:
- 同平面分支中,3D 曲线只是转换到自身所在平面的 2D 坐标系,2D 参数与原 3D 参数一致,直线参数
param1和圆参数param2都可以直接使用 2D 求交结果。 - 小角度投影分支中,直线经过投影,投影直线的 2D 参数不能作为原始 3D 直线参数;最终 3D 交点落在圆上,因此圆参数
param2可以直接使用 2D 圆参数,直线参数param1必须根据最终 3D 交点在原始 3D 直线上重新计算。
- 同平面分支中,3D 曲线只是转换到自身所在平面的 2D 坐标系,2D 参数与原 3D 参数一致,直线参数
- 交点类型沿用 2D 求交结果中的
Simple/Tangent类型。
直线-平面分支得到的空间候选点没有 2D 结果参数,此时再计算直线参数和圆参数,交点类型默认为 Simple。
参数范围应在候选点生成阶段检查;如果求交过程中已经判断候选交点落在两条曲线的参数范围内,最终加入结果前不再重复检查。
5. 调度顺序
解析求交分发需要同时支持:
line-circlecircle-line
当输入顺序是 circle-line 时,可以复用 line-circle 实现,但需要交换返回结果中的两个曲线参数,确保 param1 对应第一个输入曲线,param2 对应第二个输入曲线。
二. 直线与椭圆的 3D 解析求交
适用对象:LGKLine3d 与 LGKEllipse3d。
输入容差规则与直线-圆一致:角度判断统一使用系统角度容差,长度、距离、点在线上、点在椭圆上、参数范围判断统一使用调用方传入的长度容差。
1. 同平面情况
直线与椭圆同平面的判定分两步:
- 判断直线方向与椭圆平面法向是否垂直,角度容差使用系统角度容差。
- 判断直线原点到椭圆平面的距离是否在传入长度容差内。
如果判定为同平面,则将 3D 直线转换到椭圆所在平面的 2D 坐标系中,调用已有或待实现的 2D 直线与椭圆解析求交,再把 2D 交点转换回椭圆上的 3D 点。
2. 不同平面且夹角大于 45 度
如果直线不在椭圆平面内,先计算直线与椭圆平面的夹角。
当夹角大于 45 度时:
- 调用直线与椭圆所在平面的求交逻辑,得到直线和平面的交点。
- 判断交点是否在直线参数范围内,使用
LGKCurveUtil::Curve3dConstainsParam,使用长度容差,避免使用参数容差带来容差判断不一致的问题。 - 使用
LGKCurveUtil::Curve3dConstainsPoint判断交点是否在椭圆上,传入长度容差。 - 如果满足条件,则该点为直线与椭圆的交点。
3. 不同平面且夹角小于等于 45 度
如果直线与椭圆平面的夹角小于等于 45 度:
- 将直线投影到椭圆所在平面。
- 在椭圆平面的 2D 坐标系中调用 2D 直线与椭圆解析求交。
- 将得到的 2D 交点转换成椭圆上的 3D 点。
- 判断该 3D 点是否在原始 3D 直线上,使用传入长度容差。
- 满足条件的点作为最终交点。
45 度边界判断应使用系统角度容差。
4. 参数与结果
2D 求交分支的结果处理取决于曲线是否经过投影:
- 交点 3D 坐标由 2D 交点转换得到。
- 交点的参数:
- 同平面分支中,3D 曲线只是转换到自身所在平面的 2D 坐标系,2D 参数与原 3D 参数一致,直线参数
param1和椭圆参数param2都可以直接使用 2D 求交结果。 - 小角度投影分支中,直线经过投影,投影直线的 2D 参数不能作为原始 3D 直线参数;最终 3D 交点落在椭圆上,因此椭圆参数
param2可以直接使用 2D 椭圆参数,直线参数param1必须根据最终 3D 交点在原始 3D 直线上重新计算。
- 同平面分支中,3D 曲线只是转换到自身所在平面的 2D 坐标系,2D 参数与原 3D 参数一致,直线参数
- 交点类型沿用 2D 求交结果中的
Simple/Tangent类型。
直线-平面分支得到的空间候选点没有 2D 结果参数,此时再计算直线参数和椭圆参数,交点类型默认为 Simple。
参数范围应在候选点生成阶段检查;如果求交过程中已经判断候选交点落在两条曲线的参数范围内,最终加入结果前不再重复检查。
5. 调度顺序
解析求交分发需要同时支持:
line-ellipseellipse-line
当输入顺序是 ellipse-line 时,可以复用 line-ellipse 实现,但需要交换返回结果中的两个曲线参数。
三. 圆与圆的 3D 解析求交
适用对象:两个 LGKCircle3d。
输入容差规则:角度判断统一使用系统角度容差,长度、距离、点在圆上、参数范围判断统一使用调用方传入的长度容差。
1. 同平面情况
两个圆同平面的判定应同时检查:
- 两个圆平面法向是否平行,角度容差使用系统角度容差。
- 一个圆的圆心到另一个圆平面的距离是否在传入长度容差内。
如果判定为同平面,则将两个圆转换到同一个平面 2D 坐标系中,调用已有 2D 圆与圆解析求交,再把 2D 交点转换回 3D 点。
2. 不同平面且平面夹角大于 45 度
如果两个圆不共面,先计算两个圆所在平面的夹角。
当平面夹角大于 45 度时:
- 调用两个平面的求交逻辑,得到两平面的交线。
- 使用该交线与第一个圆做直线-圆解析求交,得到候选交点。
- 判断候选交点是否在第二个圆上,使用传入长度容差。
- 判断候选交点是否分别落在两个圆的参数范围内,使用
LGKCurveUtil::Curve3dConstainsParam,使用长度容差,避免使用参数容差带来容差判断不一致的问题。 - 满足条件的点作为两个圆的交点。
3. 不同平面且平面夹角小于等于 45 度
如果两个圆所在平面的夹角小于等于 45 度:
- 将其中一个圆投影到另一个圆所在平面。
- 投影后的圆一般解析生成椭圆。
- 在目标圆所在平面的 2D 坐标系中调用圆与椭圆解析求交,得到候选交点。
- 将候选交点转换回目标圆上的 3D 点。
- 判断该 3D 点是否在另一个原始 3D 圆上,使用传入长度容差。
- 判断候选交点是否分别落在两个圆的参数范围内,使用
LGKCurveUtil::Curve3dConstainsParam,使用长度容差,避免使用参数容差带来容差判断不一致的问题。 - 满足条件的点作为两个圆的交点。
45 度边界判断应使用系统角度容差。
4. 参数与结果
2D 求交分支的结果处理取决于曲线是否经过投影:
- 交点 3D 坐标由目标平面内的 2D 交点转换得到。
- 交点的参数:
- 同平面分支中,两个 3D 圆只是转换到同一个平面的 2D 坐标系,2D 参数与原 3D 参数一致,两个圆参数都可以直接使用 2D 求交结果。
- 小角度投影分支中,被投影的圆生成的是投影椭圆,投影椭圆的 2D 参数不能作为原始 3D 圆参数;目标平面内未投影的圆参数可以直接使用 2D 圆参数,被投影圆的参数必须根据最终 3D 交点在原始 3D 圆上重新计算。
- 交点类型沿用 2D 求交结果中的
Simple/Tangent类型。
平面交线分支得到的空间候选点没有 2D 结果参数,此时再计算两个圆的参数,交点类型可根据两个圆在该点的切向是否平行判断 Simple 或 Tangent。
参数范围应在候选点生成阶段检查;如果求交过程中已经判断候选交点落在两条曲线的参数范围内,最终加入结果前不再重复检查。
四. 圆与椭圆的 3D 解析求交
适用对象:LGKCircle3d 与 LGKEllipse3d。
整体处理方式与圆-圆求交类似,区别在于小角度投影分支中,应将椭圆解析投影到圆所在平面,而不是投影圆。
输入容差规则:角度判断统一使用系统角度容差,长度、距离、点在曲线上、参数范围判断统一使用调用方传入的长度容差。
1. 同平面情况
圆与椭圆同平面的判定应同时检查:
- 圆平面法向与椭圆平面法向是否平行,角度容差使用系统角度容差。
- 椭圆中心到圆所在平面的距离是否在传入长度容差内,或圆心到椭圆所在平面的距离是否在传入长度容差内。
如果判定为同平面,则将圆和椭圆转换到同一个平面 2D 坐标系中,调用 2D 圆与椭圆解析求交,再把 2D 交点转换回 3D 点。
2. 不同平面且平面夹角大于 45 度
如果圆和椭圆不共面,先计算圆所在平面与椭圆所在平面的夹角。
当平面夹角大于 45 度时:
- 调用两个平面的求交逻辑,得到两平面的交线。
- 使用该交线与圆做直线-圆解析求交,得到候选交点。
- 判断候选交点是否在椭圆上,使用
LGKCurveUtil::Curve3dConstainsPoint,传入长度容差。 - 判断候选交点是否分别落在圆和椭圆的参数范围内,使用
LGKCurveUtil::Curve3dConstainsParam,使用长度容差,避免使用参数容差带来容差判断不一致的问题。 - 满足条件的点作为圆与椭圆的交点。
3. 不同平面且平面夹角小于等于 45 度
如果圆所在平面与椭圆所在平面的夹角小于等于 45 度:
- 将椭圆解析投影到圆所在平面。
- 投影后的椭圆仍是圆锥曲线,需要实现一个“将 3D 椭圆解析投影到指定平面”的方法,生成目标平面内的 2D 椭圆表达。
- 在圆所在平面的 2D 坐标系中调用 2D 圆与椭圆解析求交,得到候选交点。
- 将候选交点转换回圆上的 3D 点。
- 判断该 3D 点是否在原始 3D 椭圆上,使用
LGKCurveUtil::Curve3dConstainsPoint,传入长度容差。 - 判断候选交点是否分别落在圆和椭圆的参数范围内,使用
LGKCurveUtil::Curve3dConstainsParam,使用长度容差,避免使用参数容差带来容差判断不一致的问题。 - 满足条件的点作为圆与椭圆的交点。
45 度边界判断应使用系统角度容差。
4. 参数与结果
2D 求交分支的结果处理取决于曲线是否经过投影:
- 交点 3D 坐标由圆所在平面内的 2D 交点转换得到。
- 交点的参数:
- 同平面分支中,圆和椭圆只是转换到同一个平面的 2D 坐标系,2D 参数与原 3D 参数一致,圆参数和椭圆参数都可以直接使用 2D 求交结果。
- 小角度投影分支中,椭圆经过投影,投影椭圆的 2D 参数不能作为原始 3D 椭圆参数;圆在自身平面内未投影,圆参数可以直接使用 2D 圆参数,椭圆参数必须根据最终 3D 交点在原始 3D 椭圆上重新计算。
- 交点类型沿用 2D 求交结果中的
Simple/Tangent类型。
平面交线分支得到的空间候选点没有 2D 结果参数,此时再计算圆和椭圆的参数,交点类型可根据两条曲线在该点的切向是否平行判断 Simple 或 Tangent。
参数范围应在候选点生成阶段检查;如果求交过程中已经判断候选交点落在两条曲线的参数范围内,最终加入结果前不再重复检查。
221

被折叠的 条评论
为什么被折叠?



