zoukankan      html  css  js  c++  java
  • ARX合并多线段(部分内容参考其他人)

    ARX合并多线段(部分内容参考其他人)

    展开

    void CCommonModel::AppendPoly( const AcDbObjectIdArray& objArray,AcDbPolyline *pPolyNew )
    {
    AcDbObjectIdArray objIdArray = objArray;
    std::multimap<AcGePoint3d,int> mapPoints; // AcGePoint3d不能排序,要重载符号“<”;
    std::multimap<AcGePoint3d,int>::iterator ite1;

    std::multimap<AcGePoint3d,int>::iterator ite2;
    for (int i = 0; i < objIdArray.length(); i++)
    {
    AcDbObjectId objId;
    objId = objIdArray.at(i);
    AcGePoint3d ptStart;
    AcGePoint3d ptEnd;
    AcDbObjectPointer<AcDbPolyline> pPoly(objId,AcDb::kForRead);
    pPoly->getStartPoint(ptStart);
    pPoly->getEndPoint(ptEnd);
    if (i == 0)
    {
    mapPoints.insert(std::make_pair(ptStart,1));
    mapPoints.insert(std::make_pair(ptEnd,1));
    }
    else
    {
    ite1 = mapPoints.find(ptStart);
    ite2 = mapPoints.find(ptEnd);
    if (ite1 != mapPoints.end())
    {
    (ite1->second)++;
    }
    else
    {
    mapPoints.insert(std::make_pair(ptStart,1));
    }
    ite2 = mapPoints.find(ptEnd);
    if (ite2 != mapPoints.end())
    {
    (ite2->second)++;
    }
    else
    {
    mapPoints.insert(std::make_pair(ptEnd,1));
    }
    }
    }

    AcGePoint3d ptStartOk;
    for (ite1 = mapPoints.begin(); ite1 != mapPoints.end(); ite1++)
    {
    if (ite1->second == 1)
    {
    ptStartOk = ite1->first;
    break;
    }
    }

    int plIndex = 0;
    while(objIdArray.length()>0)
    {
    for (int i = 0; i < objIdArray.length(); i++) // 问题,如果几条多线段不是首尾相接的,那么死循环。
    {
    AcDbObjectId objId;
    objId = objIdArray.at(i);
    AcGePoint3d ptStart;
    AcGePoint3d ptEnd;
    AcDbObjectPointer<AcDbPolyline> pPoly(objId,AcDb::kForRead);
    pPoly->getStartPoint(ptStart);
    pPoly->getEndPoint(ptEnd);

    AcGePoint2d pt ;
    double bulge = 0.0;
    if (ptStartOk == ptStart) // 判断点相等,用自带的函数或者用点距离
    {
    for (int j= 0; j < pPoly->numVerts(); j++ ) // 问题:最后点会被下一个加入点给覆盖掉,即有重合点
    {
    pPoly->getPointAt(j,pt);
    pPoly->getBulgeAt(j,bulge);
    pPolyNew->addVertexAt(plIndex,pt,bulge);
    plIndex++;
    }
    ptStartOk = ptEnd;
    objIdArray.removeAt(i);
    }
    else if(ptStartOk == ptEnd) // 判断点相等,用自带的函数或者用点距离
    {
    for(int k = pPoly->numVerts() - 1;k > 0; k--)
    {
    pPoly->getPointAt(k,pt);
    if(k > 0)
    {
    pPoly->getBulgeAt(k - 1,bulge);
    }
    else
    {
    pPoly->getBulgeAt(0,bulge);
    }
    pPolyNew->addVertexAt(plIndex,pt,-bulge);
    plIndex++;
    }
    ptStartOk = ptStart;
    objIdArray.removeAt(i);
    }
    else
    {

    }
    }

    }
    }

    bool operator < (AcGePoint3d pt3dS,AcGePoint3d pt3dE)
    {
    if (pt3dS.x < pt3dE.x)
    {
    return true;
    }
    else if (pt3dS.x == pt3dE.x)
    {
    if (pt3dS.y < pt3dE.y)
    {
    return true;
    }
    else if (pt3dS.y == pt3dE.y)
    {
    return false;
    }
    else
    {
    return false;
    }
    }
    else
    {
    return false;
    }
    }
    改进方法:1.判断map中点出现次数为1次的点有多少个,如果大于2个,提示错误。
                        2.如果几条多线段是从一个闭合的多线段中截取出来的,那么map中点出现次数为1次的点有2或者4个,如果是4个,判断其中2个点是否为原多线段的起始点。然后闭合连接起来。

  • 相关阅读:
    Codeforces 834E The Bakery【枚举+数位dp】
    Codeforces 834D The Bakery【dp+线段树维护+lazy】
    Codeforces Round #426 (Div. 2)【A.枚举,B.思维,C,二分+数学】
    暑期英语学习(词组积累)【持续更新中】
    “玲珑杯”ACM比赛 Round #19题解&源码【A,规律,B,二分,C,牛顿迭代法,D,平衡树,E,概率dp】
    关于前端的photoshop初探的学习笔记
    2017 Multi-University Training Contest
    BZOJ 1041: [HAOI2008]圆上的整点【数论,解方程】
    微信公众平台教程,注册申请、认证、开发、推广营销,教你怎么用微信公众号
    微信电视2.0版将新增语音搜索、节目单分享推荐自定义等
  • 原文地址:https://www.cnblogs.com/mjgw/p/12348057.html
Copyright © 2011-2022 走看看