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

我自己写了一个判断两条多段线重叠的算法。希望大家给点意见或建议。
以下为源码:
// 判断两条多段线是否重叠//
// 返回值:-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
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值