天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 69|回复: 0

一个判断两条多段线重叠的算法

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
一个判断两条多段线重叠的算法。希望大家给点意见或建议。
以下为源码:
// 判断两条多段线是否重叠//
// 返回值:-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;
}

 

 

 

 

一个判断两条多段线重叠的算法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 09:21 , Processed in 0.192621 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表