vb测量程序编制感想.docx
《vb测量程序编制感想.docx》由会员分享,可在线阅读,更多相关《vb测量程序编制感想.docx(17页珍藏版)》请在冰豆网上搜索。
vb测量程序编制感想
对坐标转换程序的认识
1、界面分析和设计
为了界面简洁,将界面分为二维坐标转换和三维坐标转换两组,使用两个框架来分隔,并增加一个复选框说明是否解球转换参数,一个框架来选择控制点文件。
窗体及部分控件属性设置:
在二维坐标转换框架内使用一个图像框显示二维坐标转换公式,并使用两个框架来分别组织转换参数的输入和转换数据的输入,最后设置三个命令按钮,分别执行坐标正算,坐标反算和数据清零操作。
二维坐标转换框架内的控件属性设置:
三维坐标转换框架内的控件布置与二维坐标转换的类似:
控制点文件框架内设一个标签,一个文本框,两个命令按钮。
控制点文件框架内的控件属性设置:
2、代码设计
OptionExplicit
Dimk2#,e2#,dX2#,dY2#'尺度参数、旋转参数、两个平移参数
Dimx2#,Xx2#,y2#,Yy2#'二维坐标变换的正反数值
Dimk3#,Ex#,Ey#,Ez#,dX3#,dY3#,dZ3#'尺度参数、三个旋转参数、三个平移参数
DimX3#,Y3#,Z3#,Xx3#,Yy3#,Zz3#'三维坐标转换的正算数值
ConstPI=3.14159265358979
此段程序采用OptionExplicit语句使用dim和const定义各转换参数和转换数据对应的变量,OptionExplicit语句在模块级别中使用,强制显示声明模块中的所有变量。
OptionExplicit语句必须写在模块的所有过程之前。
PrivateSubCheck1_Click()
IfCheck1.Value=1Then
frmCoorTrans.Height=5175
ElseIfCheck1.Value=0Then
frmCoorTrans.Height=4440
EndIf
EndSub
此段程序采用if的选择结构,对是否进行转换参数计算进行选择。
PrivateSubcmdBrowFile_Click()
CDg1.Filter="控制点文件(*.gcp)|*.gcp|所有文件(*.*)|*.*"
CDg1.Action=1
txtFileName.Text=CDg1.FileName
EndSub
此段程序为控制点文件的选择路径。
PrivateSubcmdCalc_Click()
DimsAsString,iPos%,i%,iCent!
Dimn%,x1#(),y1#(),x2#(),y2#()
DimA()AsDouble,L()AsDouble,x(1To4)AsDouble
DimAt#(),Naa#(),W#()
'读取控制点数据
OpentxtFileName.TextForInputAs#1
LineInput#1,s
n=Val(s)
ReDimx1#(n),y1#(n),x2#(n),y2#(n)
Fori=1Ton
LineInput#1,s
iPos=InStr(s,",")
x1(i)=Val(Left(s,iPos-1))
s=Mid(s,iPos+1)
iPos=InStr(s,",")
y1(i)=Val(Left(s,iPos-1))
s=Mid(s,iPos+1)
iPos=InStr(s,",")
x2(i)=Val(Left(s,iPos-1))
s=Mid(s,iPos+1)
y2(i)=Val(s)
Nexti
Close#1
'计算转换参数
ReDimA(1To2*n,1To4)AsDouble,L(1To2*n)AsDouble
ReDimAt(1To4,1To2*n),Naa(1To4,1To4),W(1To4)
Debug.Print"系数矩阵A:
"
Fori=1Ton'组成系数矩阵和常数向量
A(2*i-1,1)=1:
A(2*i-1,2)=0:
A(2*i-1,3)=x1(i):
A(2*i-1,4)=y1(i)
Debug.PrintA(2*i-1,1),A(2*i-1,2),A(2*i-1,3),A(2*i-1,4)
A(2*i,1)=0:
A(2*i,2)=1:
A(2*i,3)=y1(i):
A(2*i,4)=-x1(i)
Debug.PrintA(2*i,1),A(2*i,2),A(2*i,3),A(2*i,4)
L(2*i-1)=x2(i):
L(2*i)=y2(i)
Nexti
Debug.Print"常数向量L:
"
Fori=1To2*n
Debug.PrintL(i)
Nexti
MatrixTransA,At'求系数阵的转置矩阵
Debug.Print"A的转置矩阵:
"
ShowMatrixAt
Matrix_MultyNaa,At,A'求AtA
Debug.Print"Naa:
"
ShowMatrixNaa
Matrix_MultyW,At,L'求AtL
Debug.Print"W:
"
Fori=1To4
Debug.PrintW(i)
Nexti
MajorInColGuassNaa,W,x'Guass约化法解线性方程组
Debug.Print"X"
Fori=1To4
Debug.Printx(i)
Nexti
'分离旋转和尺度参数
IfAbs(x(3))<0.00000001Then
Ifx(4)>0Then
e2=PI/2
Else
e2=PI*3/2
EndIf
Else
e2=Atn(x(4)/x(3))'得到的是弧度
Ifx(3)<0Andx(4)>0Then
e2=PI-e2
ElseIfx(3)<0Andx(4)<0Then
e2=PI+e2
ElseIfx(3)>0Andx(4)<0Then
e2=PI*2+e2
EndIf
EndIf
k2=x(3)/Cos(e2)
'将转换参数写入相应文本框
txtK2=Str(k2-1)
e2=e2*180/PI
Dimdu%,fen%
du=Int(e2):
e2=(e2-du)*60
fen=Int(e2):
e2=(e2-fen)*60
e2=Val(Format(e2,"0.00"))
e2=du+fen/100#+e2/10000
txtE2=Str(e2)
txtdX2.Text=Str(x
(1))
txtdY2.Text=Str(x
(2))
EndSub
此段程序是计算转换参数的过程。
二维坐标的正算过程如下:
PrivateSubcmdCalc2_Click()
k2=Val(txtK2.Text)
e2=Val(txtE2.Text)
e2=DoToHu(e2)
dX2=Val(txtdX2.Text)
dY2=Val(txtdY2.Text)
x2=Val(txtX2.Text)
y2=Val(txtY2.Text)
Xx2=(k2+1)*(x2*Cos(e2)+y2*Sin(e2))+dX2
Yy2=(k2+1)*(y2*Cos(e2)-x2*Sin(e2))+dY2
txtXx2.Text=Format(Xx2,"0.0000")
txtYy2.Text=Format(Yy2,"0.0000")
EndSub
三维坐标的正算过程如下:
PrivateSubcmdCalc3_Click()
k3=Val(txtK3.Text)
Ex=Val(txtEx.Text)
Ex=DoToHu(Ex)
Ey=Val(txtEy.Text)
Ey=DoToHu(Ey)
Ez=Val(txtEz.Text)
Ez=DoToHu(Ez)
dX3=Val(txtdX3.Text)
dY3=Val(txtdY3.Text)
dZ3=Val(txtDz3.Text)
X3=Val(txtX3.Text)
Y3=Val(txtY3.Text)
Z3=Val(txtZ3.Text)
Xx3=(k3+1)*(X3*Cos(Ey)*Cos(Ez)+Y3*Cos(Ey)*Sin(Ez)-Z3*Sin(Ey))+dX3
Yy3=(k3+1)*(X3*(-Cos(Ex)*Sin(Ez)+Sin(Ex)*Sin(Ey)*Cos(Ez))+Y3*(Cos(Ex)*Cos(Ez)+Sin(Ex)*Sin(Ey)*Sin(Ez))+Z3*(Sin(Ex)*Cos(Ey)))+dY3
Zz3=(k3+1)*(X3*(Sin(Ex)*Sin(Ez)+Cos(Ex)*Sin(Ey)*Cos(Ez))+Y3*(-Sin(Ex)*Cos(Ez)+Cos(Ex)*Sin(Ey)*Sin(Ez))+Z3*(Cos(Ex)*Cos(Ey)))+dZ3
txtXx3.Text=Format(Xx3,"0.0000")
txtYy3.Text=Format(Yy3,"0.0000")
txtZz3.Text=Format(Zz3,"0.0000")
EndSub
二维坐标转换清零代码如下:
PrivateSubcmdClear2_Click()
txtX2.Text=""
txtY2.Text=""
txtXx2.Text=""
txtYy2.Text=""
EndSub
三维坐标转换清零代码如下:
PrivateSubcmdClear3_Click()
txtX3.Text=""
txtY3.Text=""
txtZ3.Text=""
txtXx3.Text=""
txtYy3.Text=""
txtZz3.Text=""
EndSub
二维坐标的反算程序如下:
PrivateSubcmdconCalc2_Click()
k2=Val(txtK2.Text)
e2=Val(txtE2.Text)
e2=DoToHu(e2)
dX2=Val(txtdX2.Text)
dY2=Val(txtdY2.Text)
Xx2=Val(txtXx2.Text)
Yy2=Val(txtYy2.Text)
x2=((Xx2-dX2)*Cos(e2)-(Yy2-dY2)*Sin(e2))/(k2+1)
y2=((Yy2-dY2)*Cos(e2)+(Xx2-dX2)*Sin(e2))/(k2+1)
txtX2.Text=Format(x2,"0.0000")
txtY2.Text=Format(y2,"0.0000")
EndSub
三维坐标的反算程序如下:
PrivateSubcmdconCalc3_Click()
k3=Val(txtK3.Text)
Ex=Val(txtEx.Text)
Ex=DoToHu(Ex)
Ey=Val(txtEy.Text)
Ey=DoToHu(Ey)
Ez=Val(txtEz.Text)
Ez=DoToHu(Ez)
dX3=Val(txtdX3.Text)
dY3=Val(txtdY3.Text)
dZ3=Val(txtDz3.Text)
Xx3=Val(txtXx3.Text)
Yy3=Val(txtYy3.Text)
Zz3=Val(txtZz3.Text)
X3=((Xx3-dX3)*Cos(Ey)*Cos(Ez)+(Yy3-dY3)*(-Cos(Ex)*Sin(Ez)+Sin(Ex)*Sin(Ey)*Cos(Ez))+(Zz3-dZ3)*(Sin(Ex)*Sin(Ez)+Cos(Ex)*Sin(Ey)*Cos(Ez)))/(k3+1)
Y3=((Xx3-dX3)*Cos(Ey)*Sin(Ez)+(Yy3-dY3)*(Sin(Ex)*Sin(Ey)*Sin(Ez)+Cos(Ex)*Cos(Ez))+(Zz3-dZ3)*(-Sin(Ex)*Cos(Ez)+Cos(Ex)*Sin(Ey)*Sin(Ez)))/(k3+1)
Z3=((Xx3-dX3)*(-Sin(Ey))+(Yy3-dY3)*Sin(Ex)*Cos(Ey)+(Zz3-dZ3)*(Cos(Ex)*Cos(Ey)))/(k3+1)
txtX3.Text=Format(X3,"0.0000")
txtY3.Text=Format(Y3,"0.0000")
txtZ3.Text=Format(Z3,"0.0000")
EndSub
PrivateSubcmdExit_Click()
End
EndSub
PrivateSubForm_Load()
frmCoorTrans.Height=4440
EndSub
'弧度化为度.分秒的形式:
输入弧度值,输出度.分秒(各占两位)
PublicFunctionHuToDo(ByValHuAsDouble)AsSingle
Dimdu%,fen%,miao%
Hu=Hu*180/PI
du=Fix(Hu)
Hu=(Hu-du)*60
fen=Fix(Hu)
Hu=(Hu-fen)*60
miao=Fix(Hu+0.5)
Ifmiao=60Then
fen=fen+1
miao=0
EndIf
HuToDo=du+fen/100+miao/10000
EndFunction
'将度.分秒形式化为弧度:
输入为度.分秒形式,输出为弧度
PublicFunctionDoToHu(ByValDoFenMiaoAsDouble)AsSingle
Dimdu%,fen%,miao%,angle#
du=Fix(DoFenMiao)
DoFenMiao=(DoFenMiao-du)*100
fen=Fix(DoFenMiao)
miao=(DoFenMiao-fen)*100
angle=du+fen/60+miao/3600
DoToHu=angle*PI/180
EndFunction
'矩阵转置的通用过程
PublicSubMatrixTrans(A,At)
Dimi%,j%
DimR1%,C1%
OnErrorResumeNext
C1=UBound(A,2)-LBound(A,2)+1
IfErrThen
MsgBox"输入的矩阵维数不对!
"
ExitSub
EndIf
R1=UBound(A,1)-LBound(A,1)+1
ReDimc(1ToC1,1ToR1)
Fori=1ToR1
Forj=1ToC1
At(j,i)=A(i,j)
Nextj
Nexti
EndSub
'矩阵相乘:
输入矩阵或数Qa、Qb,自动识别它们的维数,并输出它们的乘积Qn
PublicSubMatrix_Multy(Qn,Qa,Qb)
Dimia%,ib%,ic%
Dimai%,bi%,ci%
Dime1AsBoolean,e2AsBoolean,e3AsBoolean,e4AsBoolean,e5AsBoolean,e6AsBoolean,e7AsBoolean
OnErrorResumeNext'看Qa是不是一维数组
ic=UBound(Qa,2)-LBound(Qa,2)
IfErrThene1=True
OnErrorResumeNext'看Qa是不是一维数组
ib=UBound(Qb,2)-LBound(Qb,2)
IfErrThene2=True
Ife1=FalseAnde2=FalseThen'二维矩阵相乘
Forai=LBound(Qa,1)ToUBound(Qa,1)
Forbi=LBound(Qb,2)ToUBound(Qb,2)
Forci=LBound(Qa,2)ToUBound(Qa,2)
Qn(ai,bi)=Qn(ai,bi)+Qa(ai,ci)*Qb(ci,bi)
Nextci
Nextbi
Nextai
ElseIfe1=TrueAnde2=FalseThen
OnErrorResumeNext
ia=UBound(Qa)-LBound(Qa)
IfErrThene6=True
Ife6Then'数乘以二维矩阵
Forai=LBound(Qb,1)ToUBound(Qb,1)
Forbi=LBound(Qb,2)ToUBound(Qb,2)
Qn(ai,bi)=Qa*Qb(ai,bi)
Nextbi
Nextai
Else'一维矩阵乘以二维矩阵
Forci=LBound(Qb,2)ToUBound(Qb,2)
Forai=LBound(Qa,1)ToUBound(Qa,1)
Qn(ci)=Qn(ci)+Qa(ai)*Qb(ai,ci)
Nextai
Nextci
EndIf
ElseIfe1=FalseAnde2=TrueThen
OnErrorResumeNext
ic=UBound(Qb)-LBound(Qb)
IfErrThene7=True
Ife7Then'二维矩阵乘以数
Forai=LBound(Qa,1)ToUBound(Qa,1)
Forbi=LBound(Qa,2)ToUBound(Qa,2)
Qn(ai,bi)=Qa(ai,bi)*Qb
Nextbi
Nextai
Else'二维矩阵乘以一维矩阵
Forai=LBound(Qa,1)ToUBound(Qa,1)
Forbi=LBound(Qa,2)ToUBound(Qa,2)
Qn(ai)=Qn(ai)+Qa(ai,bi)*Qb(bi)
Nextbi
Nextai
EndIf
Else
DimerrTAsInteger
OnErrorResumeNext'结果是否是一个数
errT=UBound(Qn)
IfErrThene3=True
Ife3Then'一维矩阵乘以一维矩阵得一个数
Forai=LBound(Qa,1)ToUBound(Qa,1)
Forbi=LBound(Qa,2)ToUBound(Qa,2)
Qn=Qn+Qa(ai)*Qb(bi)
Nextbi
Nextai
ExitSub
EndIf
OnErrorResumeNext'是否是数乘一维矩阵
ia=UBound(Qa)-LBound(Qa)
IfErrThene4=True
Ife4Then
Forbi=LBound(Qa,2)ToUBound(Qa,2)
Qn(bi)=Qa*Qb(bi)
Nextbi
ExitSub
EndIf
OnErrorResumeNext'是否是一维矩阵乘数
ib=UBound(Qb)-LBound(Qb)
IfErrThene5=True
Ife5Then
Forai=LBound(Qa,1)ToUBound(Qa,1)
Qn(ai)=Qa(ai)*Qb
Nextai
ExitSub
EndIf
'一维矩阵相乘结果是二维矩阵
Forai=LBound(Qa,1)ToUBound(Qa,1)
Forbi=LBound(Qa,2)ToUBound(Qa,2)
Qn(ai,bi)=Qa(ai)*Qb(bi)
Nextbi
Nextai
EndIf
EndSub
PublicSubShowMatrix(tt)
Dimi%,j%,n%,m%
m=UBound(tt,1)-LBound(tt,1)+1
n=UBound(tt,2)-LBound(tt,2)+1
Fori=1Tom
Forj=