我自己写了一个判断两条多段线重叠的算法。希望大家给点意见或建议。

本文介绍了一种用于判断两条多段线是否重叠的算法,并提供了详细的源代码实现。该算法首先检查多段线上的节点是否位于另一条多段线上,然后进一步判断两线之间的子段是否存在交点。

我自己写了一个判断两条多段线重叠的算法。希望大家给点意见或建议。
以下为源码:
// 判断两条多段线是否重叠//
// 返回值:-1——(pl1<pl2)
//                  0——(pl1=pl2)
//                    1——(pl1>pl2)
int PlineOverlap(AcDbPolyline* pl1, AcDbPolyline* pl2)
{
        int rtn1(1), rtn2(1);
        Acad::ErrorStatus es1, es2;
        AcGePoint3d pt1, pt2;
        double param1(0), param2(0);       
        int i,j;       
        // 先判断其中一条线的所有结点是否在另一条线上
        for (i=0,j=1; j<pl1->numVerts(); i++,j++)
        {
                pl1->getPointAt(i, pt1);
                pl1->getPointAt(j, pt2);
                if (pl2->getParamAtPoint(pt1, param1)!=Acad::eOk
                        || pl2->getParamAtPoint(pt2, param2)!=Acad::eOk)
                {
                        es1 = Acad::ePointNotOnEntity;
                        break;
                }
                else
                {        //再判断两条线的子段是否有交点                                                                               
                        AcDbPolyline* pl2Sub = GetSplitPline(pl2, param1, param2);
                        if (HasInter(pt1, pt2, pl2Sub))
                        {
                                break;
                        }                                               
                        rtn1 ++;                       
                }
        }
        for (i=0,j=1; j<pl2->numVerts(); i++,j++)
        {
                pl2->getPointAt(i, pt1);
                pl2->getPointAt(j, pt2);
                if (pl1->getParamAtPoint(pt1, param1)!=Acad::eOk
                        || pl1->getParamAtPoint(pt2, param2)!=Acad::eOk)
                {
                        es2 = Acad::ePointNotOnEntity;
                        break;
                }
                else
                {                                                       
                        AcDbPolyline* pl1Sub = GetSplitPline(pl1, param1, param2);
                        if (HasInter(pt1, pt2, pl1Sub))
                        {
                                break;
                        }                       
                        rtn2 ++;                                               
                }
        }
                       
        if (rtn1==pl1->numVerts()
                && rtn2==pl2->numVerts())
        {
                return 0;
        }
        else if (rtn1==pl1->numVerts())
        {
                return -1;
        }
        else if (rtn2==pl2->numVerts())
        {
                return 1;
        }
        else
        {
                return (-99);
        }                       
}
//判断线段与多段线是否有交点
BOOL HasInter(AcGePoint3d ptFrom, AcGePoint3d ptTo, AcDbPolyline* pl, BOOL bExtend=FALSE)
{
        int i,j;
        AcGePoint3d pt1, pt2;
        for (i=0,j=1; j<pl->numVerts(); i++,j++)
        {
                pl->getPointAt(i, pt1);
                pl->getPointAt(j, pt2);
                ads_point inter;
                int teston;
                if (bExtend) teston=0;
                else teston=1;
                if (acdbInters(asDblArray(ptFrom), asDblArray(ptTo), asDblArray(pt1), asDblArray(pt2), teston, inter)==RTNORM)
                {
                        return TRUE;
                }
        }
        return FALSE;
}

//取中间段
AcDbPolyline* GetSplitPline(AcDbPolyline* pl, double param1, double param2)
{
        AcGeDoubleArray params;
        if (param1<param2)
        {
                params.append(param1);
                params.append(param2);
        }
        else
        {
                params.append(param2);
                params.append(param1);
        }
        AcDbVoidPtrArray segs;
        if (pl->getSplitCurves(params, segs)==Acad::eOk)
        {
                if (segs.length()==1)
                {
                        return static_cast<AcDbPolyline*>(segs.at(0));
                }
                else if (segs.length()==2)
                {
                        if (params.at(0)==0)
                        {
                                return static_cast<AcDbPolyline*>(segs.at(0));
                        }
                        if (params.at(1)==(pl->numVerts()-1))
                        {
                                return static_cast<AcDbPolyline*>(segs.at(1));
                        }
                }
                else if (segs.length()==3)
                {
                        return static_cast<AcDbPolyline*>(segs.at(1));
                }
        }
        return pl;
}

转载于:https://www.cnblogs.com/vmyspace/archive/2012/09/13/2683460.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值