微波通道穿刺模型研究(五)

来源:互联网 发布:海康威视网络摄像机 编辑:程序博客网 时间:2024/06/10 01:10

五、微波通道穿刺模型的软件实现

  经纬度与坐标之间的转换采用高斯变换法,转换坐标为自定义坐标系。如果知道相应点位的坐标参数,直接采用坐标参数计算更为方便。微波通道穿刺模型软件采用FoxPro环境开发,利用数据库的独特优势,不仅可以将每次计算的结果存入数据库,还可以将每次转换的坐标对应数据保存,提高“7参数”坐标转换的的准确性。以下是微波通道穿刺模型主程序的代码。

 

PUBLIC X1,X2,X31,X32,X33,X34,X4,Y1,Y2,Y31,Y32,Y32,Y33,Y34,Y4,H1,H11,H12,H2,H21,H22,H3,H31,H32,H4,L4,NAME3,RB

STORE 0.000 TO X1,X2,X31,X32,X33,X34,X4,Y1,Y2,Y31,Y32,Y33,Y34,Y4

STORE 0.0 TO H1,H11,H12,H2,H21H22H3,h31,H32H4,L4

STORE 20 TO RB  &&微波通道保护半径

SET TALK OFF

CLEAR

Do setup.prg

DO WHILE R>0

    STORE 2 TO R,I

    DO WHILE I<10

        DO FORM INPUT.SCX  &&调用坐标转换,自定义坐标系

        READ EVENTS

        I=ABS(X1-X2)+ABS(Y1-Y2)

        I=(X31+Y31)*H3*I

        IF  X32=0.AND.Y32=0

            X32=X31

            Y32=Y31

        ENDIF

        IF  X33=0.AND.Y33=0

            X33=X31

            Y33=Y31

        ENDIF

        IF  X34=0.AND.Y34=0

            X34=X31

            Y34=Y31

        ENDIF

    ENDDO

    USE 222.DBF

    GO BOTTOM

    NUM=NUMBER+1

    SET DATE TO ANSI

    APPEND BLANK

    REPLACE NAME WITH NAME3,sendx WITH X1,sendy WITH Y1,sendh WITH H11,sendh1 WITH H12,receivex WITH X2

    REPLACE receivey WITH Y2,receiveh WITH H21,receiveh1 WITH H22,date3 WITH DATE()

    REPLACE buildingx1 WITH X31,buildingy1 WITH Y31,buildingx2 WITH X32

    REPLACE buildingY2 WITH Y32,buildingx3 WITH X33,buildingy3 WITH Y33

    REPLACE buildingx4 WITH X34,buildingy4 WITH Y34,buildingH WITH H31,buildingH1 WITH H32,NUMBER WITH NUM

    DO WHILE R=2

        R=0

        IF  Y2=Y1      &&特殊函数

            X41=X31

            Y41=Y1

            X42=X32

            Y42=Y1

            X43=X33

            Y43=Y1

            X44=X34

            Y44=Y1

            K=0

            ELSE

            IF  X1=X2   &&特殊函数

                X41=X1

                Y41=Y31

                X42=X1

                Y42=Y32

                X43=X1

                Y43=Y33

                X44=X1

                Y44=Y34

                ELSE

                K=(Y2-Y1)/(X2-X1)

                B=Y1-K*X1

                B11=Y31+X31/K

                B12=Y32+X32/K

                B13=Y33+X33/K

                B14=Y34+X34/K

                &&四个交点坐标

                X41=(B11-B)*K/(K*K+1)

                Y41=(K*K*B11+B)/(K*K+1)

                X42=(B12-B)*K/(K*K+1)

                Y42=(K*K*B12+B)/(K*K+1)

                X43=(B13-B)*K/(K*K+1)

                Y43=(K*K*B13+B)/(K*K+1)

                X44=(B14-B)*K/(K*K+1)

                Y44=(K*K*B14+B)/(K*K+1)

            ENDIF

        ENDIF

        L41=SQRT[(x31-x41)*(x31-x41)+(y31-y41)*(y31-y41)]    &&四个点距离

        L42=SQRT[(x32-x42)*(x32-x42)+(y32-y42)*(y32-y42)]

        L43=SQRT[(x33-x43)*(x33-x43)+(y33-y43)*(y33-y43)]

        L44=SQRT[(x34-x44)*(x34-x44)+(y34-y44)*(y34-y44)]

        L4=MIN(L41,L42,L43,L44)   &&通道中心最短距离

        IF  L4=L41

            X4=X41

            Y4=Y41

        ENDIF

        IF  L4=L42

            X4=X42

            Y4=Y42

        ENDIF

        IF  L4=L43

            X4=X43

            Y4=Y43

        ENDIF    

        IF  L4=L44

            X4=X44

            Y4=Y44

        ENDIF

        L4=L4-RB      

        &&计算高程

        L1=SQRT[(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)]

        L2=SQRT[(x2-x4)*(x2-x4)+(y2-y4)*(y2-y4)]  

        L3=SQRT[(x1-x4)*(x1-x4)+(y1-y4)*(y1-y4)]

        IF  H1>=H2

            H4=(H1-H2)*L2/L1

            H4=H2+H4

            ELSE

            H4=(H2-H1)*L3/L1

            H4=H1+H4

        ENDIF

        &&计算通道是否跨越

        Y6=X31*K+B-Y31

        Y7=X32*K+B-Y32

        Y8=X33*K+B-Y33

        Y9=X34*K+B-Y34

        A1=0  

        A2=0  

        A3=0  

        IF  Y6>0

            A1=A1+1

            ELSE

            IF  Y6<0

                A2=A2+1

                ELSE

                A3=A3+1

            ENDIF

        ENDIF

        IF  Y7>0

            A1=A1+1

            ELSE

            IF  Y7<0

                A2=A2+1

                ELSE

                A3=A3+1

            ENDIF

        ENDIF

        IF  Y8>0

            A1=A1+1

            ELSE

            IF  Y8<0

                A2=A2+1

                ELSE

                A3=A3+1

            ENDIF

        ENDIF

        IF  Y9>0

            A1=A1+1

            ELSE

            IF  Y9<0

                A2=A2+1

                ELSE

                A3=A3+1

            ENDIF

        ENDIF

        Do circle.prg    &&调用圆环穿刺

        REPLACE CROSSX1 WITH X41,CROSSY1 WITH Y41,CROSSX2 WITH X42,CROSSY2 WITH Y42

        REPLACE CROSSX3 WITH X43,CROSSY3 WITH Y43,CROSSX4 WITH X44,CROSSY4 WITH Y44

        REPLACE LENGTH1 WITH L41,LENGTH2 WITH L42,LENGTH3 WITH L43,LENGTH4 WITH L44,NEARH WITH H4

H5=H4-H31     &&控制高度

        H5=STR(H5,6,1)

        H5=ALLTRIM(H5)

        L5=STR(L4,6,1)

        L5=ALLTRIM(L5)

        IF  H3>=H4

            MES="且通道被穿刺,控高"+H5+"米或调整位置。"

            ELSE

            MES="注意控高,"+H5+"米以下安全。"

        ENDIF

        IF  A1>0.AND.A2>0

            MES="通道穿越而过,"+MES

            ELSE

            IF  L4<=0

                MES="超过通道边沿,"+MES

                ELSE

                MES="距通道"+L5+"米,通道安全,无需控高。"

            ENDIF

            IF  L4>1000

                MES=MES+"请核对输入参数。"

            ENDIF

        ENDIF

        IF  MAX(X41,X42,X43,X44)>MAX(X1,X2).OR.MIN(X41,X42,X43,X44)<MIN(X1,X2)

            MES="在通道两端外,通道安全,无需控高。请核对输入参数。"

        ENDIF

        REPLACE CONCLUSION WITH MES

        USE

        DO FORM OUTPUT  &&调用输出程序

        READ EVENTS

    ENDDO

ENDDO

RETURN