- UID
- 756
- 积分
- 197
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2002-1-16
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本帖最后由 Love-Lisp 于 2013-9-11 22:14 编辑
和大家分享一下我写的AcDbPolyline 节点除重函数!
 - //多段线除重
- //输入 AcDbPolyline 、AcGeTol、angPrec = 角度偏差值//功能:AcDbPolyline 消除重复节点和同直线段或同圆弧上的节点
- Acad::ErrorStatus CCurve::RemoveDumpPoly(AcDbPolyline *&pPolyine,AcGeTol Tol,double angPrec)
- {
- if (!pPolyine->isKindOf(AcDbPolyline::desc()))
- {
- return Acad::eNotImplementedYet;
- }
- bool isclosed = pPolyine->isClosed();
- AcGePoint3d p0 ,p1,p2;
- AcGeVector3d v1,v2;
- int k =0;
- if (isclosed)
- {
- pPolyine->getPointAt(pPolyine->numVerts()-1,p0);
- }
- pPolyine->getPointAt(k,p1);
- pPolyine->getPointAt(k+1,p2);
- while (k < pPolyine->numVerts())
- {
- int n = k+1;
- if (n == pPolyine->numVerts())
- {
- n = 0;
- }
- int m = k - 1;
- if (m < 0)
- {
- m = pPolyine->numVerts()-1;
- }
- pPolyine->getPointAt(m,p0);
- pPolyine->getPointAt(k,p1);
- pPolyine->getPointAt(n,p2);
- if (p1.isEqualTo(p2,Tol))
- {
- pPolyine->removeVertexAt(k);
- if (n == 0)
- {
- pPolyine->setClosed(true);
- }
- }
- else
- {
- v1 =p1 - p0 ;
- v2 = p2 - p1;
- if ((v1.angleTo(v2)<= angPrec && k != 0) || (v1.angleTo(v2)<= angPrec && k == 0 && isclosed))
- {
- pPolyine->removeVertexAt(k);
- }
- else
- k++;
- }
- }
- //删除同弧段
- k = 0;
- double bulge1=0,bulge2=0;
- AcGePoint3d cp1,cp2;
- while (k < pPolyine->numVerts() -1)
- {
- pPolyine->getBulgeAt(k,bulge2);
- pPolyine->getPointAt(k,p1);
- if (!g_Equal(0,bulge2,0.00001))
- {
- if (g_Equal(0,bulge1,0.00001))
- {
- pPolyine->getPointAt(k,p0);
- pPolyine->getPointAt(k+1,p1);
- bulge1 = bulge2;
- //计算弧段的圆心
- double ang,rad;
- ang = 2 * atan(bulge1);
- rad = p0.distanceTo(p1) / (2 * sin(ang));
- ads_point cp;
- ang = (Pi2 - ang) + acutAngle(asDblArray(p0),asDblArray(p1));
- acutPolar(asDblArray(p0),ang,rad,cp);
- cp1 = asPnt3d(cp);
- k++;
- }
- else
- {
- pPolyine->getPointAt(k,p1);
- pPolyine->getPointAt(k+1,p2);
- //计算弧段的圆心
- double ang,rad,ang1,ang2 ;
- ang = 2 * atan(bulge2);
- rad = p1.distanceTo(p2) / (2 * sin(ang));
- ads_point cp;
- ang = (Pi2 - ang) + acutAngle(asDblArray(p1),asDblArray(p2));
- acutPolar(asDblArray(p1),ang,rad,cp);
- cp2 = asPnt3d(cp);
- if (cp1.isEqualTo(cp2,Tol))
- {
- pPolyine->removeVertexAt(k);
- //重新计算弓弦比
- ang1 = acutAngle(asDblArray(cp1),asDblArray(p0));
- ang2 = acutAngle(asDblArray(cp1),asDblArray(p2));
- if (bulge1 > 0)
- {
- ang = ang2 -ang1;
- if (ang > _2Pi)
- ang = ang - _2Pi;
- else if (ang < 0)
- ang = ang + _2Pi;
- }
- else
- {
- ang = ang1 - ang2;
- if (ang > _2Pi)
- ang = ang - _2Pi;
- else if (ang < 0)
- ang = ang + _2Pi;
- }
- ang = ang / 4; //包角
- if (bulge1 > 0)
- {
- bulge1 = tan(ang);
- }
- else
- {
- bulge1 = -1 * tan(ang);
- }
- pPolyine->setBulgeAt(k-1,bulge1);
-
- }
- else
- {
- p0 = p1;
- cp1 = cp2;
- bulge1 = bulge2;
- k++;
- }
- }
- }
- else
- {
- p0 = p1;
- bulge1 = 0;
- k++;
- }
- }
- if (pPolyine->isClosed() && pPolyine->numVerts() > 2)
- {
- int numVerts = pPolyine->numVerts();
- pPolyine->getBulgeAt(numVerts-1,bulge1);
- pPolyine->getBulgeAt(0,bulge2);
- if (!g_Equal(bulge1,0,0.00001) && !g_Equal(bulge2,0,0.00001))
- {
- pPolyine->getPointAt(numVerts-1,p0); /*最后一点*/
- pPolyine->getPointAt(0,p1); /*起始点*/
- pPolyine->getPointAt(1,p2);/* 第二点*/
- //计算p0p1弧段的圆心
- double ang,rad,ang1,ang2;
- ang = 2 * atan(bulge1);
- rad = p0.distanceTo(p1) / (2 * sin(ang));
- ads_point cp;
- ang = (Pi2 - ang) + acutAngle(asDblArray(p0),asDblArray(p1));
- acutPolar(asDblArray(p0),ang,rad,cp);
- cp1 = asPnt3d(cp);
- //计算p1p2弧段的圆心
- ang = 2 * atan(bulge2);
- rad = p1.distanceTo(p2) / (2 * sin(ang));
- ang = (Pi2 - ang) + acutAngle(asDblArray(p1),asDblArray(p2));
- acutPolar(asDblArray(p1),ang,rad,cp);
- cp2 = asPnt3d(cp);
- if (cp1.isEqualTo(cp2,Tol))
- {
- pPolyine->removeVertexAt(0);
- //重新计算弓弦比
- ang1 = acutAngle(asDblArray(cp1),asDblArray(p0));
- ang2 = acutAngle(asDblArray(cp1),asDblArray(p2));
- if (bulge1 > 0)
- {
- ang = ang2 -ang1;
- if (ang > _2Pi)
- ang = ang - _2Pi;
- else if (ang < 0)
- ang = ang + _2Pi;
- }
- else
- {
- ang = ang1 - ang2;
- if (ang > _2Pi)
- ang = ang - _2Pi;
- else if (ang < 0)
- ang = ang + _2Pi;
- }
- ang = ang / 4; //包角
- if (bulge1 > 0)
- {
- bulge1 = tan(ang);
- }
- else
- {
- bulge1 = -1 * tan(ang);
- }
- pPolyine->setBulgeAt(numVerts-2,bulge1);
- }
- }
- }
- return Acad::eOk;
- }
|
评分
-
查看全部评分
|