第8章控制网网图的绘制汇总.docx
《第8章控制网网图的绘制汇总.docx》由会员分享,可在线阅读,更多相关《第8章控制网网图的绘制汇总.docx(17页珍藏版)》请在冰豆网上搜索。
第8章控制网网图的绘制汇总
第八章:
控制网网图的绘制
在控制网设计及平差计算时,往往需要对控制网的网形及点位精度有一个概括的、感性的认识,在技术总结报告中也应该包含有控制网网形等内容,因此绘制一幅包含点位、观测值、网形以及误差椭圆等信息的控制网网图是非常必要的,也是在实际工程中上交资料必不可少的内容。
网形可以利用MATLAB在屏幕上绘制,但是为了便于图形的编辑、修改和出图,可以采用AutoCAD文件绘制控制网的网图,本章首先介绍利用MATLAB的绘图语句在屏幕上绘制点、连线、误差椭圆以及注记点名,然后介绍一种运用高级语言将控制网中有关数据转化为AutoCAD图形交换文件(dxf)的方法,进而分层绘制控制网中的点位、网形、误差椭圆以及注记点号、边长与方向观测值等。
其中首先介绍了AutoCAD的DXF文件及其数据结构,然后介绍了采用Matlab语言编写DXF文件中画点、画线、画误差椭圆以及观测值注记的函数,最后根据写出的程序对实测的控制网绘制了网图,在网图中设置了不同的图层,可以根据需要进行出图。
第一节:
利用MATLAB的绘图语句绘制网图
一、网形的绘制
调用函数netzbild可以进行控制网网图的绘制。
由于网形图与误差椭圆绘制在同一个图形上,因此必须对误差椭圆进行放大,在如下的程序中使用了inputdlg对话框输入语句,其中缺省的放大倍数为100。
在该程序中使用了edddpnm1m2m3xyedsidgfdirstazcaibifi变量,其意义与前面的叙述相同。
对绘制的网图有放大和缩小功能,即点击鼠标左键放大图形,点击右键缩小图形,利用MATLAB菜单本身的功能可以将该图形输出为各种图形文件格式。
functionkk=netzbild
globaledddpnm1m2m3xyedsidgfdirstazcaibifi
kk=0;
title1='误差椭圆比例';
prompt011={'请输入误差椭圆比例'};
lines=1;
d11={'100'};
c12=inputdlg(prompt011,title1,lines,d11);%输入误差椭圆比例对话框
scale=str2num(str2mat(c12));
holdoff
title('控制网网图');
xlabel('Y坐标');
ylabel('X坐标');
plot(y(1:
ed),x(1:
ed),'k^')
holdon;
plot(y((ed+1):
end),x((ed+1):
end),'k.')
fori=1:
ed+dd%写点名
text(y(i)+3,x(i)+3,num2str(pn(i)));
end
fori=1:
m1%画边长连线
plot([y(e(i))y(d(i))],[x(e(i))x(d(i))],'r');
end
fori=1:
m2%画方向连线
plot([y(g(i))y(f(i))],[x(g(i))x(f(i))],'b');
direction=rad_dms(dir(i));
end
fori=1:
m3%画方位角连线
plot([y(s(i))y(t(i))],[x(s(i))x(t(i))],'y');
end
fori=1:
dd%画误差椭圆
fe(i)=fi(i)*pi/180.;
plot(y(i+ed)+(ai(i)*cos(0:
0.01:
2*pi)*sin(fe(i))+bi(i)*sin(0:
0.01:
2*pi)*cos(fe(i)))*scale,x(i+ed)+(ai(i)*cos(0:
0.01:
2*pi)*cos(fe(i))-bi(i)*sin(0:
0.01:
2*pi)*sin(fe(i)))*scale,'r');
end
axisequal;%使得X,Y比例一致
zoomon;%利用鼠标左键放大图形,右键缩小图形
return
二、误差椭圆的绘制
无论多么复杂的图形,其基本单元还是点与线。
换句话说,只需利用基本元素点或线,通过各种组合,也能画出复杂的图形。
MABLAB中没有提供直接绘制椭圆的命令,因此可以直接利用连线来画椭圆。
测量中描述误差椭圆用三个量:
长半轴A、短半轴B和方位角FI。
在如图8-1-1的X'OY'直角坐标系中椭圆的标准方程为:
如果以角度
为变量,则椭圆的标准参数方程为:
(8-1-1)
设在测量坐标系XOY中椭圆长半轴的方位角为
,因此有:
(8-1-2)
用参数方程带入得到:
(8-1-3)
测量坐标系与MATLAB或AUTOCAD绘图的数学坐标系的X、Y坐标轴不同,绘图时需要调换X、Y坐标。
在上式中,
取不同的值,就有一组
只需这些点连接起来,就能绘出一个椭圆。
图8-1-1:
误差椭圆的参数方程
利用该程序绘制的某网图如图8-1-2,其中误差椭圆的放大比例为300倍。
图8-1-2:
某控制网网图
第二节:
AutoCADDXF文件数据格式介绍
一、AutoCAD的dxf文件介绍及其数据结构:
美国AutoDESK公司研制的AutoCAD是一个功能强大的计算机辅助设计系统,在国内深受用户喜爱,并在各个领域得到广泛的运用。
AutoCAD本身是一个完整的图形编辑系统,它维持着一个十分紧凑的图形数据库,其中存储着图形的几何信息。
但是,对于普通用户而言很难直接利用图形数据库中的数据或者直接开发应用程序对图形进行操作,对普通用户的AutoCAD应用开发能力要求较高。
为了满足用户的这些要求,AutoCAD提供了一个DXF文件,即图形交换文件(DrawingInterchangeFile).它是一个具有严格格式的ASCII码文件。
以DXF文件为媒介,即可非常容易的实现AutoCAD与其他高级语言程序之间的数据交换,这样就可以直接利用高级语言生成图形再送AutoCAD进行编辑、修改并输出图形。
图形交换文件与AutoCAD及高级语言之间的关系可用下图8-2-1表示:
dxfoutinput
AutoCAD图形交换文件高级语言
图形编辑状态(DXF)(Matlab)
dxfinoutput
图8-2-1:
AutoCAD及高级语言的联系
简单的说就是利用高级语言导出生成DXF文件,再启动cad.exe来调用dxf文件出网图。
二、DXF文件的数据结构
要利用DXF文件,就必须了解DXF文件的结构。
DXF文件由顺序出现的四大节(Section)组成,即标题节(HeaderSection)、表节(TablesSection)、块节(BlocksSection)和实体节(EntitiesSection)构成。
在某一图形的DXF文件中,标题节记录着与图形有关的变量设置,如:
基点坐标、图形范围、捕捉方式、拖动方式、尺寸标注的状态等信息;表节中记录着四种类型的的表,它们依次是线型表、层表、字体表和视图表;块节记录着图形中所有块的定义信息;实体节中记录着组成图形的所有实体。
DXF文件全部是以组(GROUP)组成的。
一个DXF文件可由若干个组构成,每个组占两行。
组的首行是组代码,它是一个非负整数。
组的第二行是组值,采用的格式取决于由组代码规定的组的类型。
组代码的具体赋值取决于文件中所描述的内容。
组码与组值之间需遵循下面规定:
组代码组值
0-9字符串
10-59浮点数
60-79整型数
具体的组代码的含义如下:
0 标识图素实体、表项或文件头的开始,后随的文字标明具体对象
1 图素实体的文字说明
2 名称、属性、特征、图块名等,如Line、point、circle、text等
3~5 其它文字或名称
6 线型名
7 实体名
8 图层名
9 变量名标识符(仅用于标题段)
10 主X坐标(直线或文字起点、圆心等)
11~18 其它 X坐标
20 主Y坐标
21~28 其它Y坐标
30 主Z坐标
31~36 其它 Z坐标
38 实体的标高,如果非零的话
39 实体厚度,如果非零的话
40~48 文字字符高,比例因数等浮点数数值
49 重复性的值
50~58 角度值
62 颜色号
66 实体跟随标志
70~78 整数值,如重复次数、标志位、模式等
下面对各节的内容做一简单介绍。
标题节(header):
dxf文件的标题节用来记录与图象相关的变量的设定值。
这些变量值可以用各种autocad命令来设置或修改,也可以用status(状态)命令显示变量的值。
每个变量在标题节中用一个组码9来规定名字,其后跟着描述变量值的组。
表格节(table):
dxf文件的表格节包括多个表,每个表又包括可变数目的表项。
表的顺序可能有变化,但ltype表总是在layer表的前面。
每个表都是用带有标记“table”的严格0组来引入的,继之是命名该表(port,ltype,style,view,dimstyle,ucs或appid)的2组,再继之以70组。
70组规定了允许跟随的表项的最大数目,表名总是用大写字母输出。
图块节(block):
dxf的图块节用作记录图形中所有的图块定义信息。
无论是用block命令定义的图块(称为用户块)还是在执行hatch、相关dim命令或者其他内部操作而使系统自动生成的“无名”块,都要在图块节中详细地进行描述。
图元(实体)节(entities):
每一个图元均以一个标识图元的0组开始。
但是,图元描述没有显示的结束标记;当遇到下一个图元的开始,即意味着该图元描述的结束。
各图元都包括8组,它给出该图元所在的图层名。
每个图元可以有相应的标高、厚度、线形或颜色号等信息。
编写一个构造完整的DXF文件的高级语言程序是很复杂的,因为必须保持其一致性以便让AutoCAD能找到其所需要的一切信息。
但实际上,AutoCAD可以省略DXF文件中的很多项,且仍能获得一个可用的图形。
如:
当不需要设置任何标题变量时,整个标题节即可省略;当不需要设置线型、层、字体和视图时,整个表节也可省略;当没有块定义时,整个块节也可以省略。
事实上,整个DXF文件只有实体节是必不可少的。
因此,用高级语言编写一个生成AutoCAD可读图形的DXF文件,只需着重了解其实体节的构造情况就可以了。
DXF文件的实体节构成如下:
0
SECTION
2实体节开始
ENTITIES
┊
┊
绘图元素:
所有实体的描述
┊
┊
0
ENDSEC实体节结束
实体节中可包含多个实体,每个实体以组码为0,其值为实体名的组开始,实体描述没有明显的结束标志,遇到下一个实体的开始,即意味着本实体的结束。
每个实体中除了表示实体所驻留的层名组8及其组值是必须的外,其他均可采用系统缺省值。
在表格节中可以定义层名以及层中的线形、颜色等信息。
层表:
2-层名,70-若其后为0则线型文件名与DXF文件名一致,若为64则不一致,62-本层所用颜色,6-本层所用线型名。
每层只允许有一种颜色,颜色号为1-255,前7种为:
1-大红,2-黄,3-深绿,4-天兰,5-兰,6-玫瑰红,7-亮白。
AutoCAD软件的线型文件ACAD.LIN带有9种基本线型:
实线-Continuous,规划线-Dashed,虚线-Hidden,点线-Dot,中心线-Center,双组划线-Phantom,点划线-Dashdot,分界限-Border,双点划线-Divide。
字型表:
40-初始字高,若为0则由TEXT定字高,41-宽度因子,50-字的倾角,71-字体文件生成标记,42-TEXT所用最后字高,3-字体文件名。
在控制网网图绘制时主要涉及到点、线、文字等内容,在实体段中具体的表达如下:
圆:
10、20、30-圆心,40-半径。
直线:
10、20、30-起点X、Y、Z坐标,11、21、31-终点X、Y、Z坐标。
文字:
10、20、30-插入点X、Y、Z坐标,40-字高,1-文字内容,50-文字倾角,41-X向比例,7-字体名。
第三节:
图层设置、画点、画线以及注记程序
一、建立图层的dxf文件函数layer.m
下面的一段Matlab程序中建立了6个图层,分别用于存放控制网的点与点名、边长连线、边长观测值注记、方向连线、方向观测值注记以及误差椭圆。
6组代表相应层的线形,62组代表该层的颜色。
其中入口变量fit2是dxf输出文件的通道号。
functionlayer(fit2)
%-LARERCOLORANDLTYPECONFIG
fprintf(fit2,'0\n');fprintf(fit2,'SECTION\n');
fprintf(fit2,'2\n');fprintf(fit2,'TABLES\n');
fprintf(fit2,'0\n');fprintf(fit2,'TABLE\n');
fprintf(fit2,'2\n');fprintf(fit2,'LAYER\n');
%定义点层POINT
fprintf(fit2,'0\n');fprintf(fit2,'LAYER\n');
fprintf(fit2,'2\n');fprintf(fit2,'POINT\n');
fprintf(fit2,'70\n');fprintf(fit2,'64\n');
fprintf(fit2,'62\n');fprintf(fit2,'1\n');%1为红色
fprintf(fit2,'6\n');fprintf(fit2,'CONTINUOUS\n');
%定义边长连线层SIDELINE
fprintf(fit2,'0\n');fprintf(fit2,'LAYER\n');
fprintf(fit2,'2\n');fprintf(fit2,'SIDELINE\n');
fprintf(fit2,'70\n');fprintf(fit2,'64\n');
fprintf(fit2,'62\n');fprintf(fit2,'7\n');%7为黑色
fprintf(fit2,'6\n');fprintf(fit2,'CONTINUOUS\n');
%定义方向连线层DIRECTIONLINE
fprintf(fit2,'0\n');fprintf(fit2,'LAYER\n');
fprintf(fit2,'2\n');fprintf(fit2,'DIRECTIONLINE\n');
fprintf(fit2,'70\n');fprintf(fit2,'64\n');
fprintf(fit2,'62\n');fprintf(fit2,'5\n');%5为兰色
fprintf(fit2,'6\n');fprintf(fit2,'CONTINUOUS\n');
%定义边长注记层SIDE
fprintf(fit2,'0\n');fprintf(fit2,'LAYER\n');
fprintf(fit2,'2\n');fprintf(fit2,'SIDE\n');
fprintf(fit2,'70\n');fprintf(fit2,'64\n');
fprintf(fit2,'62\n');fprintf(fit2,'5\n');
fprintf(fit2,'6\n');fprintf(fit2,'CONTINUOUS\n');
%定义方向注记层DIRECTION
fprintf(fit2,'0\n');fprintf(fit2,'LAYER\n');
fprintf(fit2,'2\n');fprintf(fit2,'DIRECTION\n');
fprintf(fit2,'70\n');fprintf(fit2,'64\n');
fprintf(fit2,'62\n');fprintf(fit2,'7\n');
fprintf(fit2,'6\n');fprintf(fit2,'CONTINUOUS\n');
%定义误差椭圆层ELLIPSE
fprintf(fit2,'0\n');fprintf(fit2,'LAYER\n');
fprintf(fit2,'2\n');fprintf(fit2,'ELLIPSE\n');
fprintf(fit2,'70\n');fprintf(fit2,'64\n');
fprintf(fit2,'62\n');fprintf(fit2,'7\n');
fprintf(fit2,'6\n');fprintf(fit2,'CONTINUOUS\n');
%结束表节
fprintf(fit2,'0\n');fprintf(fit2,'ENDTAB\n');
fprintf(fit2,'0\n');fprintf(fit2,'ENDSEC\n');
return
通过上面一个程序的阅读和理解,读者可以根据需要设置自己的图层,并对图层的颜色和线形进行设置。
二、画一个点并注记点名的dxf文件的函数point_text.m
下面一段MATLAB程序是画点并标注点号的函数,函数入口变量中fit2为输出文件的通道号,layername为层名,groesse为注记的字体的大小,text为要注记的点名,x、y为所要画的点的坐标。
本程序将点以及点名放置于同一层。
functionpoint_text(fit2,layername,groesse,text,x,y)
fprintf(fit2,'0\n');fprintf(fit2,'POINT\n');
fprintf(fit2,'8\n');fprintf(fit2,'%s\n',layername);
fprintf(fit2,'10\n');fprintf(fit2,'%12.3f\n',x);
fprintf(fit2,'20\n');fprintf(fit2,'%12.3f\n',y);
fprintf(fit2,'0\n');fprintf(fit2,'TEXT\n');
fprintf(fit2,'8\n');fprintf(fit2,'%s\n',layername);
fprintf(fit2,'10\n');fprintf(fit2,'%12.3f\n',x);
fprintf(fit2,'20\n');fprintf(fit2,'%12.3f\n',y);
fprintf(fit2,'40\n');fprintf(fit2,'%d\n',groesse);
fprintf(fit2,'1\n');fprintf(fit2,'%s\n',text);
return
调用该程序可以得到一个如下格式的dxf文件:
表8-3-1:
一个点以及注记的DXF文件格式
0
标识一个图元、表项或文件分节的开始和结束,跟在其后面的文字值指示出属于哪一种
POINT
说明该实体为点
8
图层名(固定的)
layername
图层名
10
说明紧跟的是初始x的坐标
x
初始x的坐标
20
说明紧跟的初始y的坐标
y
初始y的坐标
0
同前面的说明
text
说明该实体的属性为注记
8
同前面的说明
layername
同前面的说明
10
同前面的说明
x
同前面的说明
20
同前面的说明
y
同前面的说明
40
说明紧跟的字体大小
groesse
字体大小
1
说明紧跟的是图素实体的文字说明
text
注记的点号
在图层定义时给定了该层使用的线形变量为continuous。
画出所有点并注记的程序如下:
fori=1:
sd
point_text(fit3,'POINT',25,num2str(pn(i)),y(i),x(i))
end
三、编写画一条线的dxf文件的函数drawline.m
下面一段MATLAB程序是画线的函数,其中fit2为输出文件的通道号,layername为层名,x1、y1、z1为直线起点的坐标,,x2、y2、z2为直线终点的坐标。
functiondrawline(fit2,layername,x1,y1,z1,x2,y2,z2)
fprintf(fit2,'0\n');fprintf(fit2,'LINE\n');
fprintf(fit2,'8\n');fprintf(fit2,'%s\n',layername);
fprintf(fit2,'10\n');fprintf(fit2,'%12.3f\n',x1);
fprintf(fit2,'20\n');fprintf(fit2,'%12.3f\n',y1);
fprintf(fit2,'30\n');fprintf(fit2,'%12.3f\n',z1);
fprintf(fit2,'11\n');fprintf(fit2,'%12.3f\n',x2);
fprintf(fit2,'21\n');fprintf(fit2,'%12.3f\n',y2);
fprintf(fit2,'31\n');fprintf(fit2,'%12.3f\n',z2);
return
这段程序产生一个画线的dxf文件。
表8-3-2:
图元(entities)节的说明
Line
10,20和30(始点),11,21,31(终点)
point
10、20、30(点),50绘制该点时有效的的角度——可选0。
circle
10、20和30(圆心),40(半径)
text
10、20和30(插入点),40(字高),1(文字值),50(旋转角——可选0),51(倾斜角——可选0),7(文字字型名)
画出控制网所有测边连线的程序如下:
fori=1:
m1
drawline(fit3,'SIDELINE',y(e(i)),x(e(i)),0,y(d(i)),x(d(i)),0);
end
四、边长和方向观测值注记函数
由于测量坐标系与AutoCAD坐标系的定义不同,如图8-3-1所示,在进行字体注记时要给出旋转角,该角度与方位角的换算如下:
(8-3-1)
对于边长注记希望字体朝上,便于阅读,因此字体的旋转角在0到90和270到360之间,边长观测值注记函数的目标是在网图上两点连线中间的位置上以平行于边长的方向标记出边长的实际观测值,该函数入口中side为边长实际观测值,x1、y1、x2、y2为两点的坐标。
其中groesse为字体大小,50组表示字体的方位。
图8-3-1:
两种坐标系统
functionsidevalue(fit2,layername,groesse,side,x1,y1,x2,y2)
%----writeside
fprintf(fit2,'0\n');fprintf(fit2,'TEXT\n');
fprintf(fit2,'8\n');fprintf(fit2,'%s\n',layername);
x=(x1+x2)/2;y=(y1+y2)/2;
fi1=360-(alfa((y2-y1),(x2-x1))*180/pi-90);
if