dipenghao 发表于 2004-9-18 11:03:00

如何剔除等高线上多余的点???

地形等高线图原来是手工绘制,经过矢量化软件处理后,形成dwg文件,由于软件的拟合,等高线上增加了很多点,我现在想提取主要的控制点,作为离散点,怎么选择????

gyl 发表于 2004-9-18 11:41:00

看看这里


<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>

dipenghao 发表于 2004-9-18 15:28:00

谢谢 ,我看了那篇文章。受益匪浅。我先做做还

gyl 发表于 2004-9-18 18:31:00

如果做出来了,请共享一下。

dipenghao 发表于 2004-9-19 10:50:00

按照论文的方法 逐点前进的方法。


根据不同的情况 需要设置不同的阀值。视经度要求而定


程序如下:


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-&gt;numVerts());<BR>       AfxMessageBox(str);


        pPoly-&gt;getPointAt(pPoly-&gt;numVerts()-1,ptEnd);//最后一点<BR>                       pPoly-&gt;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&lt;pPoly-&gt;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-&gt;getPointAt(i,ptB);


               AcDbPolyline *pln=new AcDbPolyline();<BR>       pln-&gt;addVertexAt(0,ptA,0,-1,-1);<BR>       pln-&gt;addVertexAt(1,ptB,0,-1,-1);<BR>       pln-&gt;setElevation(pPoly-&gt;elevation());//把高程设定为一致


       int ka=0;//用来比较取得最大得C值<BR>       AcGePoint3d pt1,pt2;<BR>       AcGePoint2d pt2d,ptC;


       for(int j=i-1;j&gt;indexA;j--)<BR>       {<BR>               <BR>               pPoly-&gt;getPointAt(j,pt1);//得到三维坐标<BR>               pPoly-&gt;getPointAt(j,pt2d);//得到二维坐标<BR>                                                               pln-&gt;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&gt;ka)<BR>               {<BR>                       ka=dist;<BR>                        ptC=pt2d;<BR>                        indexC=j;<BR>               }<BR>       }<BR>                       <A href="file://同/" target="_blank" >file://同</A>阀值比较<BR>       if(ka&gt;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>&gt;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);


}


请大家多指点

dipenghao 发表于 2004-9-19 11:06:00

请教gyl兄:关于等高线内插程序设计思想.,我看了你的帖子:


“只有已知地形是基本等倾斜的情况下才可以进行等高线内插。若两条线的起点和终点相距太远,则不具备内插的条件;若走向差别太大,说明地形不规则,别说是程序,让你手工画也不会准确,这时应该实测,否则是违反测量制图规范的。我以前提出过一种等高线内插算法,基本思想是在两条曲线之间建立带状的三角网,然后计算出中间等高线的通过点坐标,效果还不错,可惜没有在AUTOCAD下实现过。”


能不能说一下:建立三角网的时候,怎么在两条等高线上选择点?
页: [1]
查看完整版本: 如何剔除等高线上多余的点???