|
- void findIntersectionWithSpline(AcDbSpline* pSpline, const AcGePlane& plane)
- {
- if (!pSpline)
- return;
- // 获取Spline的几何表示
- AcGeSplineCurve3d splineGeom;
- pSpline->getSplineGeometry(splineGeom);
- // 交点数组
- AcGePoint3dArray intersectionPts;
- // 交点查找逻辑可能需要根据具体需求实现,这里提供一个简化的思路
- double paramStart = splineGeom.startParameter();
- double paramEnd = splineGeom.endParameter();
- double tol = 1e-6; // 容差值,根据需要调整
- // 数值方法求解交点,这里简化处理,实际情况可能需要更精细的迭代
- for(double t = paramStart; t <= paramEnd; t += (paramEnd - paramStart) / 100.0) // 简单分段处理
- {
- AcGePoint3d pt = splineGeom.evalPoint(t);
- if (plane.normal().isParallelTo(pt - plane.origin()) == Adesk::kFalse) // 判断点是否大致位于平面上
- {
- // 进一步检查点是否确实在平面上(考虑容差)
- if (plane.distanceTo(pt) <= tol)
- {
- intersectionPts.append(pt);
- }
- }
- }
- // 处理交点数组intersectionPts
- // ...
- }
- static void findIntersectionByDichotomy(AcDbCurve* pCurve, const AcGePlane& plane, double tol = 1e-7)
- {
- if (!pCurve)
- return;
- // 获取Spline的几何表示
-
- double paramStart;
- pCurve->getStartParam(paramStart);
-
-
- double paramEnd ;
- pCurve->getEndParam(paramEnd);
- double midParam;
- while ((paramEnd - paramStart) > tol)
- {
- midParam = (paramStart + paramEnd) / 2.0;
- // 计算中点位置
- AcGePoint3d midPoint;
- pCurve->getPointAtParam(midParam,midPoint);
-
- // 判断中点与平面的相对位置,调整搜索区间
- double distToPlane = plane.distanceTo(midPoint);
- if (distToPlane < tol)
- {
- // 点在平面上,记录交点并继续在两侧查找可能的其他交点
- // 注意:这里直接记录了交点,实际应用中可能需要进一步逻辑处理连续交点的情况
- // midPoint即为一交点
- paramStart = midParam; // 继续在左侧搜索
- paramEnd = midParam; // 也在右侧搜索
- }
- else {
- // 使用向量点积判断方向,但需注意,这里逻辑需要明确化
- AcGePoint3d staPoint,endPoint;
- pCurve->getStartPoint(staPoint);
- pCurve->getEndPoint(staPoint);
- AcGeVector3d startVec = midPoint - staPoint;
- AcGeVector3d endVec = midPoint - endPoint;
- double dotStart = plane.normal().dotProduct(startVec);
- double dotEnd = plane.normal().dotProduct(endVec);
- // 如果一个点在平面上方,一个在下方,说明交点在区间内
- if ((dotStart * dotEnd) < 0) {
- paramEnd = midParam; // 缩小区间在左侧
- } else {
- paramStart = midParam; // 缩小区间在右侧
- }
- }
- }
- }
- static void findIntersectionWithSpline(AcDbCurve* pCurve, const AcGePlane& plane)
- {
- if (!pCurve)
- return;
- // 获取Spline的几何表示
- double paramStart;
- pCurve->getStartParam(paramStart);
- double paramEnd ;
- pCurve->getEndParam(paramEnd);
- // 交点数组
- AcGePoint3dArray intersectionPts;
- double tol = 1e-6; // 容差值,根据需要调整
- // 主循环,遍历初始参数区间
- while (paramStart <= paramEnd)
- {
- // 简单分段处理,初步查找交点候选
- for(double t = paramStart; t <= paramEnd; t += (paramEnd - paramStart) / 100.0)
- {
- AcGePoint3d pt ;
- pCurve->getPointAtParam(t,pt);
- // 判断点是否接近平面上
- if (std::abs(plane.distanceTo(pt)) <= tol)
- {
- intersectionPts.append(pt);
- // 一旦发现交点,锁定当前区间两端点,进行更细粒度的搜索
- double newParamStart = max(paramStart, t - (paramEnd - paramStart) / 100.0);
- double newParamEnd = min(paramEnd, t + (paramEnd - paramStart) / 100.0);
- // 递归细分并查找该区间内的交点
- findIntersectionSubdivided(pCurve, plane, newParamStart, newParamEnd, tol, intersectionPts);
- // 发现交点后,移动start参数避免重复查找
- paramStart = newParamEnd;
- // 退出循环,避免在当前粗略区间重复检查
- break;
- }
- }
- // 缩小搜索区间,避免已查找到的交点区间重复检查
- paramEnd = paramStart;
- }
- }
-
- // 辅助函数,用于递归细分区间查找交点
- static void findIntersectionSubdivided(const AcDbCurve *splineGeom, const AcGePlane& plane, double startParam, double endParam, double tol, AcGePoint3dArray& intersectionPts)
- {
- if (endParam - startParam <= tol)
- return;
- for(double t = startParam; t <= endParam; t += (endParam - startParam) / 100.0)
- {
-
- AcGePoint3d pt ;
- splineGeom->getPointAtParam(t,pt);
- if (std::abs(plane.distanceTo(pt)) <= tol)
- {
- intersectionPts.append(pt);
- // 继续细分找到的交点周围区域
- findIntersectionSubdivided(splineGeom, plane, max(startParam, t - (endParam - startParam) / 100.0), min(endParam, t + (endParam - startParam) / 100.0), tol, intersectionPts);
- break;
- }
- }
- }
- static void findIntersectionByDichotomy(AcDbCurve* pCurve, const AcGePlane& plane, double tol = 1e-7)
- {
- if (!pCurve)
- return;
- // 获取Spline的几何表示
-
- double paramStart;
- pCurve->getStartParam(paramStart);
-
-
- double paramEnd ;
- pCurve->getEndParam(paramEnd);
- double midParam;
- while ((paramEnd - paramStart) > tol)
- {
- midParam = (paramStart + paramEnd) / 2.0;
- // 计算中点位置
- AcGePoint3d midPoint;
- pCurve->getPointAtParam(midParam,midPoint);
-
- // 判断中点与平面的相对位置,调整搜索区间
- double distToPlane = plane.distanceTo(midPoint);
- if (distToPlane < tol)
- {
- // 点在平面上,记录交点并继续在两侧查找可能的其他交点
- // 注意:这里直接记录了交点,实际应用中可能需要进一步逻辑处理连续交点的情况
- // midPoint即为一交点
- paramStart = midParam; // 继续在左侧搜索
- paramEnd = midParam; // 也在右侧搜索
- }
- else {
- // 使用向量点积判断方向,但需注意,这里逻辑需要明确化
- AcGePoint3d staPoint,endPoint;
- pCurve->getStartPoint(staPoint);
- pCurve->getEndPoint(staPoint);
- AcGeVector3d startVec = midPoint - staPoint;
- AcGeVector3d endVec = midPoint - endPoint;
- double dotStart = plane.normal().dotProduct(startVec);
- double dotEnd = plane.normal().dotProduct(endVec);
- // 如果一个点在平面上方,一个在下方,说明交点在区间内
- if ((dotStart * dotEnd) < 0) {
- paramEnd = midParam; // 缩小区间在左侧
- } else {
- paramStart = midParam; // 缩小区间在右侧
- }
- }
- }
- }
复制代码 |
|