天气与日历 切换到窄版

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

How to find self intersection of Polyline自交

[复制链接]
  • TA的每日心情
    开心
    昨天 15:23
  • 签到天数: 69 天

    [LV.6]常住居民II

    410

    主题

    167

    回帖

    2704

    积分

    管理员

    积分
    2704
    发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
    [code]
    inline bool is_curve_selfcrossing(AcDbCurve *pCurv, double fuzz)
    {
    AcDbMPolygon mpol;
    AcDbPolyline *pPoly = AcDbPolyline::cast(pCurv);
    AcDb2dPolyline *p2Poly = AcDb2dPolyline::cast(pCurv);
    AcDbCircle *pCircle = AcDbCircle::cast(pCurv);
    Acad::ErrorStatus es = Acad::eNotApplicable;
    if (pPoly) es = mpol.appendLoopFromBoundary(pPoly,true,fuzz);
    else if (p2Poly) es = mpol.appendLoopFromBoundary(p2Poly,true,fuzz);
    else if (pCircle) es = mpol.appendLoopFromBoundary(pCircle,true,fuzz);
    return (es != Acad::eOk);
    }
    inline Acad::ErrorStatus get_curve_selfcrossing(AcDbCurve *pCurv, double fuzz, AcGePoint2dArray &pts_int,
    AcGeIntArray &sgs_int, AcGeIntArray &sge_int)
    {
    Acad::ErrorStatus es = Acad::eNotApplicable;
    AcDbMPolygon mpol;
    AcDbPolyline *pPoly = AcDbPolyline::cast(pCurv);
    AcDb2dPolyline *p2Poly = AcDb2dPolyline::cast(pCurv);
    AcDbCircle *pCircle = AcDbCircle::cast(pCurv);
    if (pPoly) es = mpol.appendLoopFromBoundary(pPoly,false,fuzz);
    else if (p2Poly) es = mpol.appendLoopFromBoundary(p2Poly,false,fuzz);
    else if (pCircle) es = mpol.appendLoopFromBoundary(pCircle,false,fuzz);
    else return es;
    AcGePoint2dArray pts;
    AcGeDoubleArray blgs;
    es = mpol.getMPolygonLoopAt(0,pts,blgs);
    if (es != Acad::eOk) return es;
    bool is_crossing;
    AcDbMPolygonCrossingArray crossArray;
    mpol.removeMPolygonLoopAt(0);
    es = mpol.loopCrossesItself(is_crossing,true,crossArray,pts,blgs,fuzz);
    if (es != Acad::eOk) return es;
    if (!is_crossing) return Acad::eOk;
    pts_int.setLogicalLength(crossArray.mCrossingArray.length());
    sgs_int.setLogicalLength(crossArray.mCrossingArray.length());
    sge_int.setLogicalLength(crossArray.mCrossingArray.length());
    sge_int.setAll(-1);
    AcGeTol gtol; gtol.setEqualPoint(fuzz); gtol.setEqualVector(fuzz);
    AcGeCircArc2d aSeg; AcGeLineSeg2d lSeg;
    for (int i=0; i < crossArray.mCrossingArray.length(); i++) {
    pts_int[ i ] = crossArray.mCrossingArray[ i ]->getCrossingPoint();
    sgs_int[ i ] = crossArray.mCrossingArray[ i ]->getEdgeIndex();
    double dst = 1e+100;
    for (int j=0; j < pts.length(); j++) {
    if (j == sgs_int[ i ]) continue;
    if (fabs(blgs[ j ]) < 1e-6) {
    lSeg.set(pts[ j ], pts[(j+1)%pts.length()]);
    if (lSeg.isOn(pts_int[ i ],gtol)) {
    sge_int[ i ] = j;
    break;
    } else {
    double d = lSeg.distanceTo(pts_int[ i ],gtol);
    if (d < dst) {
    dst = d; sge_int[ i ] = j;
    }
    }
    } else {
    aSeg.set(pts[ j ], pts[(j+1)%pts.length()],blgs[ j ],true);
    if (aSeg.isOn(pts_int[ i ],gtol)) {
    sge_int[ i ] = j;
    break;
    } else {
    double d = aSeg.distanceTo(pts_int[ i ],gtol);
    if (d < dst) {
    dst = d; sge_int[ i ] = j ;
    }
    }
    }
    }
    }
    return Acad::eOk;
    }
    [/code]

     

     

     

     

    How to find self intersection of Polyline自交
    中国膜结构网打造全中国最好的膜结构综合平台 ,统一协调膜结构设计,膜结构施工,膜材采购,膜材定制,膜结构预算全方位服务。 中国空间膜结构协会合作单位。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

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

    GMT+8, 2024-7-1 05:22 , Processed in 0.056406 second(s), 22 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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