项目

一般

简介

行为

功能 #256

打开

压缩多边形

李立奎10 个月 之前添加. 更新于 10 个月 之前.

状态:
新建
优先级:
普通
指派给:
-
开始日期:
2025-04-01
计划完成日期:
% 完成:

0%

预期时间:
#2:

描述

需要调整精度
XPushPrec vPrec(_distSnap, _angSnap*2);

M:\issues\becs\wang_bo_wen\DOE2

行为 #1

李立奎 更新于 10 个月 之前


int MergeCurve(XCurveSegment &curve, XCurveSegment &seg, int bMinusCurve, int bMinusSeg)
{
   int bMerged=0;
     int bLine1=curve.Is(CURVE_LINE),
         bLine2=seg.Is(CURVE_LINE);
     if(bLine1==bLine2 && bMinusCurve==bMinusSeg) {
        //曲线类型相同, 走向相同
        if(bLine1) {
           if(CT_IsSameDrt(curve.XLine::Direction(), seg.XLine::Direction(), _angSnap)) {
               curve.endPoint=seg.endPoint;
               bMerged=1;
           } 
        }  else {
           XArc arc1=curve.GetArc(),
                arc2=seg.GetArc();
           if(fabs(arc1.radius-arc2.radius)<_distSnap && arc1.center==arc2.center) {
              if(bMinusSeg) arc1.startAngle=arc2.startAngle;
              else arc1.endAngle=arc2.endAngle;
              if(fabs(arc1.Bulge())<_angSnap || fabs(arc1.Bulge()-2*PI)<_angSnap) {
                  ; //Circle never merge
              } else {
                  curve = arc1;
                  bMerged=1;
              }
           } 
        }
     }
     return bMerged;
}

void cmdTest()
{
	PickSet ss(SS_FREE);
	SelectEntities(_T("\n 选择PL线") ,ss, RBList());

    XPushPrec vPrec(_distSnap, _angSnap*2);

	for (long i=0;i<ss.Length();++i)
	{
		XPoly2D ply(ss[i]);
		//ply.Compress();

        {
            XPoly2D dest(ply.flag);
            int nTotalSeg = ply.TotalSegments();
            XCurveSegment curve;
            int bMinusCurve = 0;
            for (int n = 0; n < nTotalSeg; n++)
			{
				XCurveSegment seg;
				ply.Nth(n, seg);
				if (!seg)
					continue;
				int bMinusSeg = (*ply.bulges[n] < -1.0E-8);
				int bMerged = 0;
				if (!curve) {
					curve = seg;
					bMinusCurve = bMinusSeg;
					continue;
				} else {
					bMerged = MergeCurve(curve, seg, bMinusCurve, bMinusSeg);
				}
				if (!bMerged) { //当前段没有合并进curve, 更新curve
					dest.AppendSegment(curve, bMinusCurve);
					curve = seg;
					bMinusCurve = bMinusSeg;
				}
            }
            if (!curve)
				return /*RTERROR*/;
            else {
				dest.AppendSegment(curve, bMinusCurve, 1);
            }
            if ((dest.flag & 0x01) && dest.TotalSegments() >= 2)
			{
				int nTotalDest = dest.TotalSegments();
				int bMinusFirst = (*dest.bulges[0] < -1.0E-8);
				int bMinusFinal = (*dest.bulges[nTotalDest - 1] < -1.0E-8);
				XCurveSegment curveFirst, curveFinal;
				dest.Nth(0, curveFirst),
					dest.Nth(nTotalDest - 1, curveFinal);
				if (MergeCurve(
						curveFinal, curveFirst, bMinusFinal, bMinusFirst)) {
					if (bMinusFinal) {
					*dest.bulges[0] = -curveFinal.bulge;
					*dest[0] = curveFinal.endPoint;
					} else {
					*dest.bulges[0] = curveFinal.bulge;
					*dest[0] = curveFinal.startPoint;
					}
					dest.bulges.Remove(nTotalDest - 1);
					dest.Remove(nTotalDest - 1);
				}
            }
            ply = dest;
        }
		XWcsStream dc;
		dc << ply;
	}
	//ss.Erase();
}
行为

导出 Atom PDF