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求交、打断的速度和曲线长度相关,在允许精度范围内可以尝试将曲线统一缩小后再进行运算。