vb测量程序编制感想.docx

上传人:b****6 文档编号:6757159 上传时间:2023-01-10 格式:DOCX 页数:17 大小:2.01MB
下载 相关 举报
vb测量程序编制感想.docx_第1页
第1页 / 共17页
vb测量程序编制感想.docx_第2页
第2页 / 共17页
vb测量程序编制感想.docx_第3页
第3页 / 共17页
vb测量程序编制感想.docx_第4页
第4页 / 共17页
vb测量程序编制感想.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

vb测量程序编制感想.docx

《vb测量程序编制感想.docx》由会员分享,可在线阅读,更多相关《vb测量程序编制感想.docx(17页珍藏版)》请在冰豆网上搜索。

vb测量程序编制感想.docx

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=

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1