明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1803|回复: 5

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

[复制链接]
发表于 2004-9-18 11:03:00 | 显示全部楼层 |阅读模式
地形等高线图原来是手工绘制,经过矢量化软件处理后,形成dwg文件,由于软件的拟合,等高线上增加了很多点,我现在想提取主要的控制点,作为离散点,怎么选择????
发表于 2004-9-18 11:41:00 | 显示全部楼层
 楼主| 发表于 2004-9-18 15:28:00 | 显示全部楼层
谢谢 ,我看了那篇文章。受益匪浅。我先做做还
发表于 2004-9-18 18:31:00 | 显示全部楼层
如果做出来了,请共享一下。
 楼主| 发表于 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); } 请大家多指点
 楼主| 发表于 2004-9-19 11:06:00 | 显示全部楼层
请教gyl兄:关于等高线内插程序设计思想.,我看了你的帖子:


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


能不能说一下:建立三角网的时候,怎么在两条等高线上选择点?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-26 09:30 , Processed in 0.174913 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表