- 积分
- 1665
- 明经币
- 个
- 注册时间
- 2003-3-31
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
楼主 |
发表于 2004-9-19 10:50:00
|
显示全部楼层
按照论文的方法 逐点前进的方法。
根据不同的情况 需要设置不同的阀值。视经度要求而定
程序如下:
void SelecPtFromPolyline()
{
ads_name ent; ads_point pt; AcDbObjectId Id; if(acedEntSel("选择多段线\n",ent,pt)!=RTNORM) return;
AcDbEntity *pEnt; acdbGetObjectId(Id,ent); acdbOpenAcDbEntity(pEnt,Id,AcDb::kForRead); AcDbPolyline *pPoly=AcDbPolyline::cast(pEnt);//转化为二维多义线
if(!pPoly){ acutPrintf("不是二维多段线:\n");return;}
file://首先提取二维多义线全部顶点 AcGePoint2dArray arrPt; double k=3; AcGePoint2d ptEnd,ptFirst,ptA,ptB,ptTemp; file://试验而得到不同经度的阀值 3比较合适 double dist,fa=3; int indexA,indexC;
CString str; str.Format("节点总数:%i",pPoly->numVerts()); AfxMessageBox(str);
pPoly->getPointAt(pPoly->numVerts()-1,ptEnd);//最后一点 pPoly->getPointAt(0,ptFirst); file://第一点 arrPt.append(ptFirst); file://将第一个点首先加入
acutPrintf("第一点(%0.3f,%0.3f)\n",ptFirst.x,ptFirst.y); acutPrintf("最后一点(%0.3f,%0.3f)\n",ptEnd.x,ptEnd.y);
ptA=ptFirst; indexA=0; for(int i=2;i<pPoly->numVerts();i++) { file://保存二维,比较用三维(用来求两点的距离) file://用AB连接成线段(用多义线形成) file://AcGePoint3d ptA(pt1.x,pt1.y,0),ptB(pt2.x,pt2.y,0); file://在这里不能构造直线 由于扽等高线具有高程,所以比较阀值得情况下,必须设定高程一致 pPoly->getPointAt(i,ptB);
AcDbPolyline *pln=new AcDbPolyline(); pln->addVertexAt(0,ptA,0,-1,-1); pln->addVertexAt(1,ptB,0,-1,-1); pln->setElevation(pPoly->elevation());//把高程设定为一致
int ka=0;//用来比较取得最大得C值 AcGePoint3d pt1,pt2; AcGePoint2d pt2d,ptC;
for(int j=i-1;j>indexA;j--) { pPoly->getPointAt(j,pt1);//得到三维坐标 pPoly->getPointAt(j,pt2d);//得到二维坐标 pln->getClosestPointTo(pt1,pt2); dist=pt1.distanceTo(pt2); file://acutPrintf("点到AB线段得距离为:%0.3f\n",dist); file://调用函数 if(dist>ka) { ka=dist; ptC=pt2d; indexC=j; } } file://同阀值比较 if(ka>fa)//大于阀值 { ptA=ptC; indexA=indexC; AcGePoint2d pAddA(ptC.x+20,ptC.y); arrPt.append(pAddA);//将C点加入
} else file://若距离最大值小于阀值 { file://看B是否是最后一点 file://不是最后一点 让B= B+;等于下一点 file://pPoly->getPointAt(i+1,ptTemp); file://ptB=ptTemp; file://continue; if(ptB==ptEnd) { AcGePoint2d ptAddB(ptB.x+20,ptB.y); arrPt.append(ptAddB); break;//退出结束 } }
}// 外层for循环 AfxMessageBox("形成新得等高线"); str.Format("节点总数:%i",arrPt.length()); CreatePolyline(arrPt); AfxMessageBox(str);
}
请大家多指点 |
|