注册 登录
明经CAD社区 返回首页

风树的个人空间 http://www.mjtd.com/?408117 [收藏] [复制] [分享] [RSS]

日志

关于AcDbCurve 类求交点、打断的小记

已有 1001 次阅读2014-1-3 10:16 |系统分类:应用

求交点:
1、两条曲线求交:调用基类的intersectWith()函数。
2、单条曲线求自相交点:将曲线转换成AcGeCurve3d 类,利用AcGeCurveCurveInt3d 类求自相交,例如:
AcGeCurve3d * pGe;
AcGeCurveCurveInt3d CurveCurveInt3d(*pGe,*pGe);//曲线类相交
int k=CurveCurveInt3d.numIntPoints();
for (int i=0;i<k;i++)
{
              AcGePointOnCurve3d point;
              CurveCurveInt3d.getPointOnCurve1(i,point);
             //记录对象的打断点
}
打断:
1、求出每条曲线的打断点点集集后,对各点通过getParamAtPoint()函数求出各点在对应曲线的位置参数,并保存到AcGeDoubleArray pts 数组中如:
for(..;..;..)
{
             double param;
            curve->getParamAtPoint(p1,param);//p1为打断点,param为返回的对应参数
            将param加入pts 数组
}
2、对pts数组内的元素从小大到排序
3、调用待打断的曲线的getSplitCurves()函数,进行曲线打断,如:
                AcDbVoidPtrArray curveSegments;//收集curve被打断后的曲线集
                curve->getSplitCurves(pts, curveSegments);
                if (curveSegments.length()>=2)
               {//能分解
                   for (int i=0;i<curveSegments.length();i++)
                  {
                       ent=(AcDbCurve*)curveSegments[i];
                       //保存生成的曲线
                               。。。。。。。。。。。。。。。。
                   }
                   //对分解前对象的处理
                   if (curve->id()!=0)
                   {//如果分解的对象之前加入空间模型
                        curve->erase();
                        es=curve->close();
                    }
                    else
                    {//如果分解的对象之前没有加入空间模型
                        delete curve;
                    }
              }
             else
             {
                 //不能分解
                  。。。。。。。。。。。。。
              }   
4、如果打断点point是该曲线的自相交点,那么getParamAtPoint(),只能求出一个打断参数。
变通的方式是:
1)在point点出画个小圆,和该曲线求交:如
       Circle= new AcDbCircle(point,AcGeVector3d(0,0,1),eps_);//eps_根据实际情况确定,尽可能小,但各类不同
       //求交点集
       curve->intersectWith(Circle,AcDb::kOnBothOperands,AcGePlane::kXYPlane,ptArray1);
2)一般情况下会求出四个交点,每两个一组,分别通过curve->getParamAtPoint()函数求出各点对应的参数,当eps_趋于无穷小时,每组求出的参数和的一半对应着curve中的一个打断位置;两组,就两个位置;其它情况分类判断就行。

一个提高速度的方法:
       cad求交、打断的速度和曲线长度相关,在允许精度范围内可以尝试将曲线统一缩小后再进行运算。


路过

雷人

握手

鲜花

鸡蛋

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-10 04:40 , Processed in 0.083910 second(s), 15 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部