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

我自己写了一个判断两条多段线重叠的算法。希望大家给点意见或建议。
以下为源码:
// 判断两条多段线是否重叠//
// 返回值:-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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要判断一个是否在一个多边形中,可以使用射线法或和多边形边界的交叉数判断法。 1. 射线法 首先,从该画一条射线(可以是任意方向),统计这条射线穿过多边形边界的次数。如果是奇数次,则该在多边形内;如果是偶数次,则该在多边形外。 2. 和多边形边界的交叉数判断法 从该向任意方向发出一条射线,计算这条射线与多边形的每条边相交的次数。如果该在多边形内,则这个交叉数应该是奇数,否则就是偶数。 这两种方法都可以实现多边形中的判断,但需要注意的是,如果多边形自交或有重叠部分,则这些方法可能无法正确判断是否在多边形中。 ### 回答2: QT是一种编程库,可以用于判断一个是否在多边形中。这个功能可以通过判断是否在多边形的边界上和角度判断来实现。 首先,我们可以通过求解与多边形的交数量来判断是否在多边形的边界上。如果交数量为奇数,则说明在多边形内部;如果交数量为偶数,则说明在多边形外部。可以使用射线法来实现该功能,即从该引一条射线,然后统计与多边形边界的交数量。 其次,我们可以通过计算与多边形顶的夹角是否为360度来判断是否在多边形内部。如果与多边形顶的夹角和为360度,则说明在多边形内部;如果夹角和小于360度,则说明在多边形外部。可以使用向量法来实现该功能,即将与多边形的各个顶连成向量,然后计算这些向量的和的夹角和。 在使用QT库来实现这个功能时,可以利用其中提供的几何计算函数和算法。QT库中提供了一些相关的类和函数,如QPolygon类和QPoint类,可以用来表示多边形的顶的坐标,并进行相应的计算和判断。通过使用这些类和函数,可以方便地判断一个是否在多边形中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值