如何剔除等高线上多余的点???
地形等高线图原来是手工绘制,经过矢量化软件处理后,形成dwg文件,由于软件的拟合,等高线上增加了很多点,我现在想提取主要的控制点,作为离散点,怎么选择???? 看看这里<A href="http://bbs.mjtd.com/forum.php?mod=viewthread&tid=18354" target="_blank" >http://bbs.mjtd.com/forum.php?mod=viewthread&tid=18354</A> 谢谢 ,我看了那篇文章。受益匪浅。我先做做还 如果做出来了,请共享一下。 按照论文的方法 逐点前进的方法。
根据不同的情况 需要设置不同的阀值。视经度要求而定
程序如下:
void SelecPtFromPolyline()
{
ads_name ent;<BR> ads_point pt;<BR> AcDbObjectId Id;<BR> <BR> if(acedEntSel("选择多段线\n",ent,pt)!=RTNORM)<BR> return;
AcDbEntity *pEnt;<BR> acdbGetObjectId(Id,ent);<BR> acdbOpenAcDbEntity(pEnt,Id,AcDb::kForRead);<BR> AcDbPolyline *pPoly=AcDbPolyline::cast(pEnt);//转化为二维多义线
if(!pPoly){ acutPrintf("不是二维多段线:\n");return;}
<A href="file://首/" target="_blank" >file://首</A>先提取二维多义线全部顶点<BR> AcGePoint2dArray arrPt;<BR> double k=3;<BR> AcGePoint2d ptEnd,ptFirst,ptA,ptB,ptTemp;<BR> <BR> <A href="file://试/" target="_blank" >file://试</A>验而得到不同经度的阀值 3比较合适 <BR> double dist,fa=3;<BR> int indexA,indexC;
CString str;<BR> str.Format("节点总数:%i",pPoly->numVerts());<BR> AfxMessageBox(str);
pPoly->getPointAt(pPoly->numVerts()-1,ptEnd);//最后一点<BR> pPoly->getPointAt(0,ptFirst); <A href="file://第/" target="_blank" >file://第</A>一点<BR> arrPt.append(ptFirst); <BR> <A href="file://将/" target="_blank" >file://将</A>第一个点首先加入
acutPrintf("第一点(%0.3f,%0.3f)\n",ptFirst.x,ptFirst.y);<BR>acutPrintf("最后一点(%0.3f,%0.3f)\n",ptEnd.x,ptEnd.y);
ptA=ptFirst;<BR> indexA=0;<BR> for(int i=2;i<pPoly->numVerts();i++)<BR> {<BR> <BR> <A href="file://保/" target="_blank" >file://保</A>存二维,比较用三维(用来求两点的距离)<BR> <A href="file://用/" target="_blank" >file://用</A>AB连接成线段(用多义线形成)<BR> <A href="file://AcGePoint3d/" target="_blank" >file://AcGePoint3d</A> ptA(pt1.x,pt1.y,0),ptB(pt2.x,pt2.y,0);<BR> <A href="file://在/" target="_blank" >file://在</A>这里不能构造直线 由于扽等高线具有高程,所以比较阀值得情况下,必须设定高程一致<BR> <BR> pPoly->getPointAt(i,ptB);
AcDbPolyline *pln=new AcDbPolyline();<BR> pln->addVertexAt(0,ptA,0,-1,-1);<BR> pln->addVertexAt(1,ptB,0,-1,-1);<BR> pln->setElevation(pPoly->elevation());//把高程设定为一致
int ka=0;//用来比较取得最大得C值<BR> AcGePoint3d pt1,pt2;<BR> AcGePoint2d pt2d,ptC;
for(int j=i-1;j>indexA;j--)<BR> {<BR> <BR> pPoly->getPointAt(j,pt1);//得到三维坐标<BR> pPoly->getPointAt(j,pt2d);//得到二维坐标<BR> pln->getClosestPointTo(pt1,pt2);<BR> dist=pt1.distanceTo(pt2);<BR> <A href="file://acutPrintf/" target="_blank" >file://acutPrintf</A>("点到AB线段得距离为:%0.3f\n",dist);<BR> <A href="file://调/" target="_blank" >file://调</A>用函数<BR> if(dist>ka)<BR> {<BR> ka=dist;<BR> ptC=pt2d;<BR> indexC=j;<BR> }<BR> }<BR> <A href="file://同/" target="_blank" >file://同</A>阀值比较<BR> if(ka>fa)//大于阀值<BR> {<BR> ptA=ptC;<BR> indexA=indexC;<BR> AcGePoint2d pAddA(ptC.x+20,ptC.y);<BR> arrPt.append(pAddA);//将C点加入
}<BR> else <A href="file://若/" target="_blank" >file://若</A>距离最大值小于阀值<BR> {<BR> <A href="file://看/" target="_blank" >file://看</A>B是否是最后一点<BR> <BR> <A href="file://不/" target="_blank" >file://不</A>是最后一点 让B= B+;等于下一点<BR> <A href="file://pPoly-/" target="_blank" >file://pPoly-</A>>getPointAt(i+1,ptTemp);<BR> <A href="file://ptB=ptTemp/" target="_blank" >file://ptB=ptTemp</A>;<BR> <A href="file://continue/" target="_blank" >file://continue</A>;<BR> if(ptB==ptEnd) <BR> {<BR> AcGePoint2d ptAddB(ptB.x+20,ptB.y);<BR> arrPt.append(ptAddB);<BR> break;//退出结束<BR> }<BR> }
<BR> }// 外层for循环<BR> <BR> AfxMessageBox("形成新得等高线");<BR> str.Format("节点总数:%i",arrPt.length());<BR> CreatePolyline(arrPt);<BR> AfxMessageBox(str);
}
请大家多指点 请教gyl兄:关于等高线内插程序设计思想.,我看了你的帖子:
“只有已知地形是基本等倾斜的情况下才可以进行等高线内插。若两条线的起点和终点相距太远,则不具备内插的条件;若走向差别太大,说明地形不规则,别说是程序,让你手工画也不会准确,这时应该实测,否则是违反测量制图规范的。我以前提出过一种等高线内插算法,基本思想是在两条曲线之间建立带状的三角网,然后计算出中间等高线的通过点坐标,效果还不错,可惜没有在AUTOCAD下实现过。”
能不能说一下:建立三角网的时候,怎么在两条等高线上选择点?
页:
[1]