第8章控制网网图的绘制Word文件下载.docx
《第8章控制网网图的绘制Word文件下载.docx》由会员分享,可在线阅读,更多相关《第8章控制网网图的绘制Word文件下载.docx(17页珍藏版)》请在冰豆网上搜索。
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
m1%画边长连线
plot([y(e(i))y(d(i))],[x(e(i))x(d(i))],'
r'
m2%画方向连线
plot([y(g(i))y(f(i))],[x(g(i))x(f(i))],'
b'
direction=rad_dms(dir(i));
m3%画方位角连线
plot([y(s(i))y(t(i))],[x(s(i))x(t(i))],'
y'
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:
2*pi)*cos(fe(i)))*scale,x(i+ed)+(ai(i)*cos(0:
2*pi)*cos(fe(i))-bi(i)*sin(0:
2*pi)*sin(fe(i)))*scale,'
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'
2\n'
TABLES\n'
TABLE\n'
LAYER\n'
%定义点层POINT
POINT\n'
70\n'
64\n'
62\n'
1\n'
%1为红色
6\n'
CONTINUOUS\n'
%定义边长连线层SIDELINE
SIDELINE\n'
7\n'
%7为黑色
%定义方向连线层DIRECTIONLINE
DIRECTIONLINE\n'
5\n'
%5为兰色
%定义边长注记层SIDE
SIDE\n'
%定义方向注记层DIRECTION
DIRECTION\n'
%定义误差椭圆层ELLIPSE
ELLIPSE\n'
%结束表节
ENDTAB\n'
ENDSEC\n'
通过上面一个程序的阅读和理解,读者可以根据需要设置自己的图层,并对图层的颜色和线形进行设置。
二、画一个点并注记点名的dxf文件的函数point_text.m
下面一段MATLAB程序是画点并标注点号的函数,函数入口变量中fit2为输出文件的通道号,layername为层名,groesse为注记的字体的大小,text为要注记的点名,x、y为所要画的点的坐标。
本程序将点以及点名放置于同一层。
functionpoint_text(fit2,layername,groesse,text,x,y)
8\n'
%s\n'
layername);
10\n'
%12.3f\n'
x);
20\n'
y);
TEXT\n'
40\n'
%d\n'
groesse);
text);
调用该程序可以得到一个如下格式的dxf文件:
表8-3-1:
一个点以及注记的DXF文件格式
标识一个图元、表项或文件分节的开始和结束,跟在其后面的文字值指示出属于哪一种
POINT
说明该实体为点
8
图层名(固定的)
layername
图层名
10
说明紧跟的是初始x的坐标
x
初始x的坐标
20
说明紧跟的初始y的坐标
y
初始y的坐标
同前面的说明
text
说明该实体的属性为注记
40
说明紧跟的字体大小
groesse
字体大小
1
说明紧跟的是图素实体的文字说明
注记的点号
在图层定义时给定了该层使用的线形变量为continuous。
画出所有点并注记的程序如下:
sd
point_text(fit3,'
POINT'
25,num2str(pn(i)),y(i),x(i))
三、编写画一条线的dxf文件的函数drawline.m
下面一段MATLAB程序是画线的函数,其中fit2为输出文件的通道号,layername为层名,x1、y1、z1为直线起点的坐标,,x2、y2、z2为直线终点的坐标。
functiondrawline(fit2,layername,x1,y1,z1,x2,y2,z2)
LINE\n'
x1);
y1);
30\n'
z1);
11\n'
x2);
21\n'
y2);
31\n'
z2);
这段程序产生一个画线的dxf文件。
表8-3-2:
图元(entities)节的说明
Line
10,20和30(始点),11,21,31(终点)
point
10、20、30(点),50绘制该点时有效的的角度——可选0。
circle
10、20和30(圆心),40(半径)
10、20和30(插入点),40(字高),1(文字值),50(旋转角——可选0),51(倾斜角——可选0),7(文字字型名)
画出控制网所有测边连线的程序如下:
m1
drawline(fit3,'
SIDELINE'
y(e(i)),x(e(i)),0,y(d(i)),x(d(i)),0);
四、边长和方向观测值注记函数
由于测量坐标系与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
x=(x1+x2)/2;
y=(y1+y2)/2;
fi1=360-(alfa((y2-y1),(x2-x1))*180/pi-90);
if(fi1>
90&
fi1<
18