www.pudn.com > 603Grid.rar > FrmGrid.frm, change:2003-09-13,size:71965b


VERSION 5.00 
Object = "{F9043C88-F6F2-101A-A3C9-08002B2F49FB}#1.2#0"; "COMDLG32.OCX" 
Begin VB.Form FrmGrid  
   BorderStyle     =   3  'Fixed Dialog 
   Caption         =   "网格化程序" 
   ClientHeight    =   8268 
   ClientLeft      =   48 
   ClientTop       =   336 
   ClientWidth     =   11412 
   BeginProperty Font  
      Name            =   "宋体" 
      Size            =   11.4 
      Charset         =   134 
      Weight          =   400 
      Underline       =   0   'False 
      Italic          =   0   'False 
      Strikethrough   =   0   'False 
   EndProperty 
   LinkTopic       =   "Form1" 
   MaxButton       =   0   'False 
   MinButton       =   0   'False 
   ScaleHeight     =   689 
   ScaleMode       =   3  'Pixel 
   ScaleWidth      =   951 
   ShowInTaskbar   =   0   'False 
   StartUpPosition =   2  '屏幕中心 
   Begin VB.PictureBox Picture1  
      Height          =   8052 
      Left            =   120 
      ScaleHeight     =   667 
      ScaleMode       =   3  'Pixel 
      ScaleWidth      =   927 
      TabIndex        =   0 
      Top             =   120 
      Width           =   11172 
      Begin VB.PictureBox PictureGrid  
         Appearance      =   0  'Flat 
         AutoRedraw      =   -1  'True 
         BackColor       =   &H80000005& 
         Enabled         =   0   'False 
         BeginProperty Font  
            Name            =   "MS Sans Serif" 
            Size            =   7.8 
            Charset         =   0 
            Weight          =   400 
            Underline       =   0   'False 
            Italic          =   0   'False 
            Strikethrough   =   0   'False 
         EndProperty 
         ForeColor       =   &H80000008& 
         Height          =   7680 
         Left            =   3240 
         ScaleHeight     =   7656 
         ScaleWidth      =   7656 
         TabIndex        =   20 
         Top             =   120 
         Width           =   7680 
      End 
      Begin VB.PictureBox PictureTools  
         Appearance      =   0  'Flat 
         BackColor       =   &H80000000& 
         BeginProperty Font  
            Name            =   "MS Sans Serif" 
            Size            =   7.8 
            Charset         =   0 
            Weight          =   400 
            Underline       =   0   'False 
            Italic          =   0   'False 
            Strikethrough   =   0   'False 
         EndProperty 
         ForeColor       =   &H80000008& 
         Height          =   7692 
         Left            =   120 
         ScaleHeight     =   7668 
         ScaleWidth      =   2988 
         TabIndex        =   1 
         Top             =   120 
         Width           =   3012 
         Begin VB.ListBox ListGrid  
            Appearance      =   0  'Flat 
            Enabled         =   0   'False 
            Height          =   1848 
            ItemData        =   "FrmGrid.frx":0000 
            Left            =   120 
            List            =   "FrmGrid.frx":0019 
            TabIndex        =   23 
            Top             =   3720 
            Width           =   2772 
         End 
         Begin VB.TextBox TextXStep  
            Appearance      =   0  'Flat 
            Enabled         =   0   'False 
            Height          =   336 
            Left            =   120 
            TabIndex        =   12 
            Top             =   2280 
            Width           =   1332 
         End 
         Begin VB.TextBox TextYStep  
            Appearance      =   0  'Flat 
            Enabled         =   0   'False 
            Height          =   336 
            Left            =   1560 
            TabIndex        =   11 
            Top             =   2280 
            Width           =   1332 
         End 
         Begin VB.TextBox TextXNX  
            Appearance      =   0  'Flat 
            Enabled         =   0   'False 
            Height          =   336 
            Left            =   120 
            TabIndex        =   10 
            Top             =   3000 
            Width           =   1332 
         End 
         Begin VB.TextBox TextYNY  
            Appearance      =   0  'Flat 
            Enabled         =   0   'False 
            Height          =   336 
            Left            =   1560 
            TabIndex        =   9 
            Top             =   3000 
            Width           =   1332 
         End 
         Begin VB.CommandButton CommandGridOK  
            Caption         =   "开始网格化" 
            Enabled         =   0   'False 
            BeginProperty Font  
               Name            =   "宋体" 
               Size            =   11.4 
               Charset         =   134 
               Weight          =   700 
               Underline       =   0   'False 
               Italic          =   0   'False 
               Strikethrough   =   0   'False 
            EndProperty 
            Height          =   375 
            Left            =   120 
            TabIndex        =   8 
            Top             =   6000 
            Width           =   2775 
         End 
         Begin VB.CommandButton CommandGridCacel  
            Caption         =   "退出" 
            BeginProperty Font  
               Name            =   "宋体" 
               Size            =   11.4 
               Charset         =   134 
               Weight          =   700 
               Underline       =   0   'False 
               Italic          =   0   'False 
               Strikethrough   =   0   'False 
            EndProperty 
            Height          =   375 
            Left            =   120 
            TabIndex        =   7 
            Top             =   6720 
            Width           =   2775 
         End 
         Begin VB.TextBox TextXmin  
            Appearance      =   0  'Flat 
            Enabled         =   0   'False 
            Height          =   336 
            Left            =   120 
            TabIndex        =   6 
            Top             =   840 
            Width           =   1335 
         End 
         Begin VB.TextBox TextXmax  
            Appearance      =   0  'Flat 
            Enabled         =   0   'False 
            Height          =   336 
            Left            =   120 
            TabIndex        =   5 
            Top             =   1560 
            Width           =   1332 
         End 
         Begin VB.TextBox TextYmin  
            Appearance      =   0  'Flat 
            Enabled         =   0   'False 
            Height          =   336 
            Left            =   1560 
            TabIndex        =   4 
            Top             =   840 
            Width           =   1335 
         End 
         Begin VB.TextBox TextYmax  
            Appearance      =   0  'Flat 
            Enabled         =   0   'False 
            Height          =   336 
            Left            =   1560 
            TabIndex        =   3 
            Top             =   1560 
            Width           =   1332 
         End 
         Begin VB.CommandButton CommandContouMeshWang  
            Caption         =   "打开文件..." 
            BeginProperty Font  
               Name            =   "宋体" 
               Size            =   11.4 
               Charset         =   134 
               Weight          =   700 
               Underline       =   0   'False 
               Italic          =   0   'False 
               Strikethrough   =   0   'False 
            EndProperty 
            Height          =   375 
            Left            =   120 
            MousePointer    =   1  'Arrow 
            TabIndex        =   2 
            Top             =   120 
            Width           =   2772 
         End 
         Begin VB.Label LabelYmax  
            Alignment       =   2  'Center 
            Caption         =   "Y最大值" 
            Enabled         =   0   'False 
            Height          =   252 
            Left            =   1560 
            TabIndex        =   22 
            Top             =   1320 
            Width           =   1332 
         End 
         Begin VB.Label LabelXmax  
            Alignment       =   2  'Center 
            Caption         =   "X最大值" 
            Enabled         =   0   'False 
            Height          =   252 
            Left            =   120 
            TabIndex        =   21 
            Top             =   1320 
            Width           =   1332 
         End 
         Begin VB.Label LabelXStep  
            Alignment       =   2  'Center 
            Caption         =   "X方向步长" 
            Enabled         =   0   'False 
            Height          =   252 
            Left            =   120 
            TabIndex        =   19 
            Top             =   2040 
            Width           =   1332 
         End 
         Begin VB.Label LabelYStep  
            Alignment       =   2  'Center 
            Caption         =   "Y方向步长" 
            Enabled         =   0   'False 
            Height          =   252 
            Left            =   1560 
            TabIndex        =   18 
            Top             =   2040 
            Width           =   1332 
         End 
         Begin VB.Label LabelXNX  
            Alignment       =   2  'Center 
            Caption         =   "X方向网格数" 
            Enabled         =   0   'False 
            Height          =   252 
            Left            =   120 
            TabIndex        =   17 
            Top             =   2760 
            Width           =   1332 
         End 
         Begin VB.Label LabelYNY  
            Alignment       =   2  'Center 
            Caption         =   "Y方向网格数" 
            Enabled         =   0   'False 
            Height          =   252 
            Left            =   1560 
            TabIndex        =   16 
            Top             =   2760 
            Width           =   1332 
         End 
         Begin VB.Label LabelGrid  
            Alignment       =   2  'Center 
            Caption         =   "网格化方法" 
            Height          =   252 
            Left            =   120 
            TabIndex        =   15 
            Top             =   3480 
            Width           =   2772 
         End 
         Begin VB.Label LabelXmin  
            Alignment       =   2  'Center 
            Caption         =   "X最小值" 
            Enabled         =   0   'False 
            Height          =   252 
            Left            =   120 
            TabIndex        =   14 
            Top             =   600 
            Width           =   1332 
         End 
         Begin VB.Label LabelYmin  
            Alignment       =   2  'Center 
            Caption         =   "Y最小值" 
            Enabled         =   0   'False 
            Height          =   252 
            Left            =   1560 
            TabIndex        =   13 
            Top             =   600 
            Width           =   1332 
         End 
      End 
      Begin MSComDlg.CommonDialog CommonDialog1  
         Left            =   240 
         Top             =   -120 
         _ExtentX        =   847 
         _ExtentY        =   847 
         _Version        =   393216 
         CancelError     =   -1  'True 
      End 
   End 
End 
Attribute VB_Name = "FrmGrid" 
Attribute VB_GlobalNameSpace = False 
Attribute VB_Creatable = False 
Attribute VB_PredeclaredId = True 
Attribute VB_Exposed = False 
Option Explicit 
Private Declare Function PtInRegion Lib "gdi32" (ByVal hRgn As Long, ByVal X As Long, ByVal Y As Long) As Long 
Private Declare Function CreatePolygonRgn Lib "gdi32" (lpPoint As POINTAPI, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long 
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long 
 
Private Type POINTAPI 
    X As Long 
    Y As Long 
End Type 
Dim TheContouPath As String, TheContouFile As String, TheInstallPath As String 
Dim Xmin0 As Double, Xmax0 As Double, Ymin0 As Double, Ymax0 As Double 
Dim XminT As Double, XmaxT As Double, YminT As Double, YmaxT As Double 
Dim DataType As Integer 
Dim nDec As Integer, FMT As String 
Dim Xmin As Double, Xmax As Double, DX As Double, NX As Integer 
Dim Ymin As Double, Ymax As Double, DY As Double, NY As Integer 
Dim Vmin As Single, Vmax As Single 
Dim Xcontou() As Double, Ycontou() As Double, Zcontou() As Double, NContou As Long 
Dim BorderX() As Single, BorderY() As Single, nBorder As Integer 
Dim nSJX As Integer, ID1() As Integer, ID2() As Integer, ID3() As Integer 
'按方位取点加权 weighting of measured points by azimuth                  *c 
'          NY : integer      the number of lines in Y direction 
'          NX : integer      the number of lines in X direction 
'          Ncontou : integer     the number of original random data 
'          n0 : integer     the number of azmuths in each 90 degree field 
'          Xmin : real      X coordinater at the left-down of the lattice 
'          Ymin : real      Y coordinater at the left-down of the lattice 
'          dx : real        the interval of x 
'          dy : real        the interval of y 
'          a : real (Ncontou,3)  an array which store the original random data 
' output formal parameters : 
'          s : real (NY,NX)   an array which store the final data after latticized 
' 
Private Sub GridAZimuth(NY As Integer, NX As Integer, N0 As Integer, Xmin As Double, Ymin As Double, DX As Double, DY As Double, Xcontou() As Double, Ycontou() As Double, Zcontou() As Double, NContou As Long, Zgrid() As Double, bZgrid() As Boolean, Dr0 As Double) 
Dim A1(0 To 9) As Double, B1(0 To 39) As Double, B2(0 To 39) As Double, Cn(0 To 39) As Double, Cp(0 To 39) As Double 
Dim P As Integer, Pa As Double, C As Double, N2 As Integer, N3 As Integer, N4 As Integer 
Dim Umi As Double, Vmi As Double, W As Double, X0 As Double, U As Double, V As Double, X As Double, Y As Double, Z As Double 
Dim I As Integer, J As Integer, K As Integer, L As Integer 
Dim I1 As Integer, J0 As Integer, J1 As Integer, L1 As Integer 
Dim Y0 As Double, A() As Double 
Dim XX0 As Double, YY0 As Double 
 
C = 90# / N0 * 0.0174533 
N4 = 4 * N0 
N2 = 2 * N0 
N3 = 3 * N0 
Umi = Xmin / DX 
Vmi = Ymin / DX 
ReDim A(0 To NContou, 1 To 2) 
For I = 0 To NContou 
    A(I, 1) = Xcontou(I) / DX 
    A(I, 2) = Ycontou(I) / DX 
Next I 
For I = 1 To N0 - 1 
    A1(I) = Tan(C * I) 
Next I 
A1(N0) = 90000000000# 
For I = 1 To NY 
    Y0 = Vmi + (I - 1) * DY / DX 
    For J = 1 To NX 
        For J0 = 1 To 4 * N0 
            B1(J0) = 10000# 
            B2(J0) = 0# 
            Cp(J0) = 1# 
        Next J0 
        X0 = Umi + J - 1# 
        For K = 0 To NContou 
            X = A(K, 1) - X0 
            Y = A(K, 2) - Y0 
            Z = Zcontou(K) 
            If (X >= 0 And Y >= 0) Then 
                P = 0 
            ElseIf (X = 0 And Y >= 0) Then 
                P = N0 
            ElseIf (X = 0 And Y = 0) Then 
                P = N2 
            ElseIf (X >= 0 And Y = 0) Then 
                P = N3 
            End If 
            If (X = 0) Then 
                U = 1000000# 
            Else 
                If (N0 = 1) Then 
                    U = 1# 
                Else 
                    U = Abs(Y / X) 
                End If 
            End If 
            V = X * X + Y * Y 
            For L = 1 To N0 
                If (U  A1(L)) Then 
                    L1 = L + P 
                    If (V  B1(L1)) Then 
                        B1(L1) = V 
                        B2(L1) = Z 
                    End If 
                    Exit For 
                 End If 
            Next L 
        Next K 
        Pa = 0# 
        For I1 = 1 To N4 
            If (B1(I1) > Pa) Then Pa = B1(I1) 
        Next I1 
        For I1 = 1 To N4 
            For J1 = 1 To N4 
                 If (J1 <> I1) Then Cp(I1) = Cp(I1) * B1(J1) / Pa 
            Next J1 
        Next I1 
        W = 0# 
        For I1 = 1 To N4 
            W = W + Cp(I1) 
        Next I1 
        For I1 = 1 To N4 
            Cn(I1) = Cp(I1) / W 
        Next I1 
        Zgrid(J, I) = 0# 
        For I1 = 1 To N4 
            Zgrid(J, I) = Zgrid(J, I) + Cn(I1) * B2(I1) 
        Next I1 
        bZgrid(J, I) = True 
        YY0 = YminT + (I - 1) * DY 
        XX0 = XminT + (J - 1) * DX 
        PictureGrid.Circle (XX0, YY0), Dr0 
        DoEvents 
    Next J 
Next I 
End Sub 
 
'趋势面拟合Fitting of trend surface 
'input formal parameters 
'NY    : integer    the number of lines in Y directioni 
'NX    : integer    the number of points in X direction 
'Ncontou   : integer    the number of original random data 
'n0   : integer    the number of times of trend surface 
'xmin : real       X coordinats at the left-down of the lattice 
'ymin : real       Y coordinats at the left-down of the lattice 
'dx   : real       the interval of X 
'dy   : real       the interval of Y 
'd    : real (Ncontou,3) an array which store the original random data 
'output formal parameters 
'd1   : real (Ncontou,3)  an array which store residual erroes 
'b    : real (NY,NX)   an array which store the trend surface of the lattice 
Private Sub GridTrendSurface(NY As Integer, NX As Integer, N0 As Integer, Xmin As Double, Ymin As Double, DX As Double, DY As Double, Xcontou() As Double, Ycontou() As Double, Zcontou() As Double, NContou As Long, Zgrid() As Double, bZgrid() As Boolean, Dr0 As Double) 
'D1(Ncontou, 3), B(NY, NX) 
Dim H() As Double, S() As Double 
Dim Nt As Integer, I As Integer, J As Integer, K As Integer, I0 As Integer, J0 As Integer 
Dim X As Double, Y As Double, Z As Double, Sma As Double, B1 As Double 
Dim E As Double, F As Double 
Dim I9 As Integer, J9 As Integer 
Dim XX0 As Double, YY0 As Double 
 
Nt = 1 
For I = 1 To N0 
    Nt = Nt + I + 1 
Next I 
ReDim S(1 To Nt, 1 To Nt + 1), H(1 To Nt) 
For I = 1 To Nt 
    For J = 1 To Nt + 1 
        S(I, J) = 0# 
    Next J 
Next I 
For I = 0 To NContou 
    X = Xcontou(I) 
    Y = Ycontou(I) 
    Z = Zcontou(I) 
    X = ((X - Xmin) / DX) / (NX - 1) 
    Y = ((Y - Ymin) / DY) / (NY - 1) 
    For J = 1 To Nt 
        Call TSXY(X, Y, E, F, J) 
        H(J) = E * F 
    Next J 
    For I0 = 1 To Nt 
        For J0 = 1 To Nt 
            S(I0, J0) = H(I0) * H(J0) + S(I0, J0) 
        Next J0 
        S(I0, Nt + 1) = H(I0) * Z + S(I0, Nt + 1) 
    Next I0 
Next I 
For K = 1 To Nt 
    Sma = 0 
    For I = K To Nt 
        For J = 1 To Nt 
            If (Abs(Sma)  Abs(S(I, J))) Then 
                Sma = S(I, J) 
                I9 = I 
                J9 = J 
            End If 
        Next J 
    Next I 
    '?????????????????if(sma.eq.0) goto 100 
    For J = 1 To Nt + 1 
        B1 = S(I9, J) / Sma 
        S(I9, J) = S(K, J) 
        S(K, J) = B1 
    Next J 
    For I = 1 To Nt 
        If (I <> K) Then 
            B1 = -S(I, J9) 
            For J = 1 To Nt + 1 
                S(I, J) = S(I, J) + B1 * S(K, J) 
            Next J 
        End If 
    Next I 
Next K 
For J = 1 To Nt 
    For I = 1 To Nt 
        If (S(I, J) >= 0.5) Then H(J) = S(I, Nt + 1) 
    Next I 
Next J 
For I = 1 To NY 
    Y = (I - 1) / (NY - 1) 
    For J = 1 To NX 
        X = (J - 1) / (NX - 1) 
        Zgrid(J, I) = 0# 
        For I0 = 1 To Nt 
            Call TSXY(X, Y, E, F, I0) 
            Zgrid(J, I) = H(I0) * E * F + Zgrid(J, I) 
        Next I0 
        bZgrid(J, I) = True 
        YY0 = YminT + (I - 1) * DY 
        XX0 = XminT + (J - 1) * DX 
        PictureGrid.Circle (XX0, YY0), Dr0 
        DoEvents 
    Next J 
Next I 
'For I = 1 To Ncontou 
'    X = ((D(I, 1) - Xmin) / dx) / (NX - 1) 
'    Y = ((D(I, 2) - Ymin) / dy) / (NY - 1) 
'    w = 0 
'    For I0 = 1 To Nt 
'        Call TSXY(X, Y, E, F, I0) 
'        w = H(I0) * E * F + w 
'    Next I0 
'    D1(I, 3) = D(I, 3) - w 
'    D1(I, 1) = D(I, 1) 
'    D1(I, 2) = D(I, 2) 
'Next I 
End Sub 
'this subroutine is used to count coefficient of the linear equation 
Private Sub TSXY(X As Double, Y As Double, E As Double, F As Double, I0 As Integer) 
Dim K As Integer, L As Integer 
 
K = 0 
Do 
    If ((K + 1) * (K + 2) / 2 >= I0) Then Exit Do 
    K = K + 1 
Loop 
L = (K + 1) * (K + 2) / 2 - I0 
If (X <> 0 Or L <> 0) Then 
    E = X ^ L 
Else 
    E = 1 
End If 
If (Y <> 0 Or (K - L) <> 0) Then 
    F = Y ^ (K - L) 
Else 
    F = 1 
End If 
End Sub 
 
 
 
Private Sub CommandGridCacel_Click() 
    Unload Me 
End Sub 
Private Sub CommandGridOK_Click() 
    Dim iGrid As Integer 
 
    DX = Val(TextXStep.Text) 
    DY = Val(TextYStep.Text) 
    NX = Val(TextXNX.Text) 
    NY = Val(TextYNY.Text) 
    iGrid = ListGrid.ListIndex 
     
    Call DrawOld 
     
    If (iGrid = 3) Then 
        Call SJX(PictureGrid) 
    End If 
    Call Grid(iGrid, PictureGrid) 
End Sub 
Private Sub SJX(PictureSJX As PictureBox) 
Dim R As Double, RT As Double 
Dim J As Integer, K As Integer 
Dim A1 As Double, B1 As Double, C1 As Double, Tt As Double 
Dim AA As Double, BB As Double, CC As Double, CosC As Double 
Dim bCheck As Boolean, bEQBD As Boolean 
Dim Ni As Integer, Nj As Integer, Pi As Integer, Pj As Integer, Pk As Integer 
Dim M1 As Integer, M2 As Integer 
Dim X1 As Double, Y1 As Double, X2 As Double, Y2 As Double, X3 As Double, Y3 As Double 
Dim bSJX As Boolean 
'边界段数 
Dim nBD As Integer 
'用于判断边界环是否搜索过 
Dim bBD() As Boolean 
'用于判断数据点是否在边界环内 
Dim bPoint() As Byte 
'第i边界起点BD,第i边对应顶点 
Dim BD() As Integer, BDij() As Integer 
'第i边界的上一节点、下一节点 
Dim Nlast As Integer, Nnext As Integer 
 
 
ReDim ID1(0 To 2 * NContou), ID2(0 To 2 * NContou), ID3(0 To 2 * NContou) 
'Begin生成第一个三角形 
Pi = 0 
'找出距第一点最近的点2 
RT = 1E+20 
For J = 1 To NContou 
    R = (Xcontou(J) - Xcontou(Pi)) ^ 2 + (Ycontou(J) - Ycontou(Pi)) ^ 2 
    If (R  RT) Then 
        RT = R 
        Pj = J 
    End If 
Next J 
'找出第三点 
Tt = 0 
For J = 1 To NContou 
    If (J <> Pj) Then 
        AA = (Xcontou(Pj) - Xcontou(J)) ^ 2 + (Ycontou(Pj) - Ycontou(J)) ^ 2 
        BB = (Xcontou(Pi) - Xcontou(J)) ^ 2 + (Ycontou(Pi) - Ycontou(J)) ^ 2 
        CC = (Xcontou(Pi) - Xcontou(Pj)) ^ 2 + (Ycontou(Pi) - Ycontou(Pj)) ^ 2 
        CosC = 1# - (AA + BB - CC) / (2# * Sqr(AA * BB)) 
        If (CosC > Tt + 0.00001) Then 
            Tt = CosC 
            Pk = J 
        End If 
    End If 
Next J 
nSJX = 0 
ID1(nSJX) = Pi 
ID2(nSJX) = Pj 
ID3(nSJX) = Pk 
'End生成第一个三角形 
X1 = Xcontou(Pi) 
X2 = Xcontou(Pj) 
X3 = Xcontou(Pk) 
     
Y1 = Ycontou(Pi) 
Y2 = Ycontou(Pj) 
Y3 = Ycontou(Pk) 
PictureSJX.DrawMode = 13 
PictureSJX.ForeColor = QBColor(12) 
PictureSJX.Line (X1, Y1)-(X2, Y2) 
PictureSJX.Line (X2, Y2)-(X3, Y3) 
PictureSJX.Line (X3, Y3)-(X1, Y1) 
DoEvents 
 
 
'定义边界环数组 
ReDim BD(0 To NContou), BDij(0 To NContou), bBD(0 To NContou), bPoint(0 To NContou) 
 
For J = 0 To NContou 
    bBD(J) = False 
    bPoint(J) = 0 
Next J 
'生成三条边 
nBD = 3 
 
BD(1) = Pi 
BDij(1) = Pk 
bBD(1) = True 
 
 
BD(2) = Pj 
BDij(2) = Pi 
bBD(2) = True 
 
BD(3) = Pk 
BDij(3) = Pj 
bBD(3) = True 
 
bPoint(Pi) = 1 
bPoint(Pj) = 1 
bPoint(Pk) = 1 
 
Do 
    Ni = Ni + 1 
 
    bEQBD = False 
    For J = Ni To nBD 
        If (bBD(J) = True) Then 
            bEQBD = True 
            Exit For 
        End If 
    Next J 
    If (bEQBD = False) Then 
        For J = 1 To Ni - 1 
            If (bBD(J) = True) Then 
                bEQBD = True 
                Exit For 
            End If 
        Next J 
    End If 
    Ni = J 
    If (bEQBD = False) Then Exit Do 
     
    '第Ni边的终点节点 
    If (Ni = nBD) Then 
        Nj = 1 
    Else 
        Nj = Ni + 1 
    End If 
    '第Ni边的后邻 
    If (Ni = 1) Then 
        Nlast = nBD 
    Else 
        Nlast = Ni - 1 
    End If 
    '第Ni边的前邻 
    If (Nj = nBD) Then 
        Nnext = 1 
    Else 
        Nnext = Nj + 1 
    End If 
         
    '第Ni边的三个顶点 
    Pi = BD(Ni) 
    Pj = BD(Nj) 
    Pk = BDij(Ni) 
     
    'Begin找下一点 
    bCheck = False 
    If (Xcontou(Pj) = Xcontou(Pi)) Then 
        C1 = Xcontou(Pk) - Xcontou(Pi) 
    Else 
        A1 = (Ycontou(Pj) - Ycontou(Pi)) / (Xcontou(Pj) - Xcontou(Pi)) 
        B1 = Ycontou(Pj) - A1 * Xcontou(Pj) 
        C1 = Ycontou(Pk) - Xcontou(Pk) * A1 - B1 
    End If 
    If (C1 = 0#) Then 
        M1 = -1 
    Else 
        M1 = 1 
    End If 
     
    Tt = 0# 
    For K = 1 To NContou 
        If (K = Pi Or K = Pj Or bPoint(K) = 2) Then 
        Else 
            If (Xcontou(Pj) = Xcontou(Pi)) Then 
                C1 = Xcontou(K) - Xcontou(Pi) 
            Else 
                C1 = Ycontou(K) - Xcontou(K) * A1 - B1 
            End If 
            If (C1 = 0#) Then 
                M2 = -1 
            Else 
                M2 = 1 
            End If 
            If (M1 <> M2) Then 
                AA = (Xcontou(Pj) - Xcontou(K)) ^ 2 + (Ycontou(Pj) - Ycontou(K)) ^ 2 
                 
                BB = (Xcontou(Pi) - Xcontou(K)) ^ 2 + (Ycontou(Pi) - Ycontou(K)) ^ 2 
                CC = (Xcontou(Pi) - Xcontou(Pj)) ^ 2 + (Ycontou(Pi) - Ycontou(Pj)) ^ 2 
                CosC = 1# - (AA + BB - CC) / (2# * Sqr(AA * BB)) 
                If (CosC > Tt + 0.00001) Then 
                    Tt = CosC 
                    Pk = K 
                    bCheck = True 
                End If 
            End If 
        End If 
    Next K 
    'End找下一点 
    If (bCheck = True) Then '找到下一点 
        bSJX = True 
        '找前邻、后邻 
        If (Pk = BD(Nlast)) Then '后邻,删除Pi点 
            '修改后邻点参数 
            BDij(Nlast) = Pi 
            bBD(Nlast) = True 
            bPoint(Pk) = 1 
             
            For J = Ni + 1 To nBD 
                BD(J - 1) = BD(J) 
                BDij(J - 1) = BDij(J) 
                bBD(J - 1) = bBD(J) 
            Next J 
             
            nBD = nBD - 1       '减少一个边 
            bPoint(Pi) = 2      'Pi点位于圈内 
        ElseIf (Pk = BD(Nnext)) Then '前邻,删除Pj点 
            '修改Ni点参数 
            BDij(Ni) = Pj 
            bBD(Ni) = True 
            bPoint(Pk) = 1 
             
            For J = Nj + 1 To nBD 
                BD(J - 1) = BD(J) 
                BDij(J - 1) = BDij(J) 
                bBD(J - 1) = bBD(J) 
            Next J 
             
            nBD = nBD - 1       '减少一个边 
            bPoint(Pj) = 2      'Pj点位于圈内 
        ElseIf (bPoint(Pk)  1) Then '下一点不在边界环上,插入Pk点 
            '修改Ni点参数 
            BDij(Ni) = Pj 
            bBD(Ni) = True 
            bPoint(Pk) = 1 
             
            '数据后推 
            For J = nBD To Ni + 1 Step -1 
                BD(J + 1) = BD(J) 
                BDij(J + 1) = BDij(J) 
                bBD(J + 1) = bBD(J) 
            Next J 
            nBD = nBD + 1 
             
            'Pk点参数 
            BD(Ni + 1) = Pk 
            BDij(Ni + 1) = Pi 
            bBD(Ni + 1) = True 
            Ni = Ni + 1 
        Else 
            bSJX = False 
        End If 
        If (bSJX = True) Then 
            '生成新三角形 
            nSJX = nSJX + 1 
            ID1(nSJX) = Pi 
            ID2(nSJX) = Pj 
            ID3(nSJX) = Pk 
             
            X1 = Xcontou(Pi) 
            X2 = Xcontou(Pj) 
            X3 = Xcontou(Pk) 
     
            Y1 = Ycontou(Pi) 
            Y2 = Ycontou(Pj) 
            Y3 = Ycontou(Pk) 
             
            PictureSJX.Line (X1, Y1)-(X2, Y2) 
            PictureSJX.Line (X2, Y2)-(X3, Y3) 
            PictureSJX.Line (X3, Y3)-(X1, Y1) 
            DoEvents 
        End If 
    Else '没找到下一点,该边界不再搜索 
        bBD(Ni) = False 
    End If 
Loop 
 
'整理边界 
nBorder = nBD - 1 
ReDim BorderX(0 To nBorder + 1), BorderY(0 To nBorder + 1) 
For J = 0 To nBorder 
    BorderX(J) = Xcontou(BD(J + 1)) 
    BorderY(J) = Ycontou(BD(J + 1)) 
Next J 
BorderX(nBorder + 1) = BorderX(0) 
BorderY(nBorder + 1) = BorderY(0) 
End Sub 
 
 
 
 
Private Sub CommandContouMeshWang_Click() 
    Dim FalseTrue As Boolean 
     
    On Error Resume Next 
 
    CommonDialog1.DialogTitle = "等值线数据文件" 
    CommonDialog1.FileName = TheContouFile 
    CommonDialog1.Filter = "*.Txt;*.Dat|*.TXT;*.DAT" 
    CommonDialog1.InitDir = TheContouPath 
    CommonDialog1.FilterIndex = 0 
    CommonDialog1.ShowOpen 
    If (Err = 0) Then '打开文件 
        TheContouFile = CommonDialog1.DialogTitle 
        TheContouPath = CommonDialog1.FileName 
        Call ReadContouFile 
         
        If (DataType = 0) Then 
            FalseTrue = False 
            MsgBox "已经是网格化数据,无需网格化!", vbOKOnly, "关于网格化" 
        Else 
            FalseTrue = True 
            DX = Sqr((Xmax - Xmin) / (NContou + 1) * (Ymax - Ymin)) 
            DY = DX 
 
            NX = Fix((Xmax - Xmin) / DX) + 1 
            NY = Fix((Ymax - Ymin) / DY) + 1 
            DX = (Xmax - Xmin) / (NX - 1) 
            DY = (Ymax - Ymin) / (NY - 1) 
         
            DX = Val(Format(DX, FMT)) 
            DY = Val(Format(DY, FMT)) 
            NX = Fix((Xmax - Xmin) / DX) + 1 
            NY = Fix((Ymax - Ymin) / DY) + 1 
             
            If ((NX - 1) * DX  Xmax - Xmin) Then NX = NX + 1 
            If ((NY - 1) * DY  Ymax - Ymin) Then NY = NY + 1 
        End If 
        LabelXmin.Enabled = FalseTrue 
        TextXmin.Enabled = FalseTrue 
        LabelXmax.Enabled = FalseTrue 
        TextXmax.Enabled = FalseTrue 
        LabelXStep.Enabled = FalseTrue 
        TextXStep.Enabled = FalseTrue 
        LabelXNX.Enabled = FalseTrue 
        TextXNX.Enabled = FalseTrue 
 
        LabelYmin.Enabled = FalseTrue 
        TextYmin.Enabled = FalseTrue 
        LabelYmax.Enabled = FalseTrue 
        TextYmax.Enabled = FalseTrue 
        LabelYStep.Enabled = FalseTrue 
        TextYStep.Enabled = FalseTrue 
        LabelYNY.Enabled = FalseTrue 
        TextYNY.Enabled = FalseTrue 
 
        LabelGrid.Enabled = FalseTrue 
        ListGrid.Enabled = FalseTrue 
        PictureGrid.Enabled = FalseTrue 
        CommandGridOK.Enabled = FalseTrue 
     
        TextXmin.Text = Xmin 
        TextXmax.Text = Xmax 
        TextYmin.Text = Ymin 
        TextYmax.Text = Ymax 
        TextXStep.Text = DX 
        TextYStep.Text = DY 
 
        TextXNX.Text = NX 
        TextYNY.Text = NY 
        ListGrid.ListIndex = 4 
 
        Call DrawOld 
    End If 
End Sub 
'数据网格化 
Private Sub Grid(iGrid As Integer, PictureGrid As Object) 
Dim CloseSJX(0 To 3) As POINTAPI, hRgnSJX As Long 
Dim I As Integer, K As Integer, II As Integer 
Dim IX As Integer, IY As Integer 
Dim X As Double, Y As Double, Z As Double, bPtInRegion As Long 
Dim X0 As Double, Y0 As Double, X1 As Double, Y1 As Double, Z1 As Double, X2 As Double, Y2 As Double, Z2 As Double, X3 As Double, Y3 As Double, Z3 As Double, X4 As Double, Y4 As Double, Z4 As Double 
Dim Ds As Double, Ds1 As Double, Ds2 As Double, Ds3 As Double, GoTo1 As Integer 
Dim Dr0 As Double, Delta As Double 
Dim L1(0 To 2) As Double, L2(0 To 2) As Double 
Dim RR0 As Double, R As Double, R0 As Double, R1 As Double, R2 As Double, R3 As Double 
Dim RR(1 To 50) As Double, VV(1 To 50) As Double, V As Double, C As Double 
Dim Fact As Double, X0c As Long, Y0c As Long 
Dim TheOutFile As String, N0 As Integer 
Dim AA() As Double, BB() As Double, XX() As Double 
Dim Xt() As Double, Yt() As Double, Zt() As Double, Wt() As Double, Nt As Integer, S As Double 
Dim Zgrid() As Double, bZgrid() As Boolean, bGrid As Boolean 
 
If (Xmax0 - Xmin0 > Ymax0 - Ymin0) Then 
    Fact = 500 / (Xmax0 - Xmin0) 
Else 
    Fact = 500 / (Ymax0 - Ymin0) 
End If 
 
PictureGrid.ForeColor = QBColor(2) 
Dr0 = 4 
Dr0 = Dr0 * (Xmax0 - Xmin0) / (PictureGrid.Width - 2 * Dr0) 
PictureGrid.DrawMode = 13 
ReDim Zgrid(1 To NX, 1 To NY), bZgrid(1 To NX, 1 To NY) 
For IX = 1 To NX 
    For IY = 1 To NY 
        bZgrid(IX, IY) = False 
    Next IY 
Next IX 
If (iGrid = 3) Then 
    'Begin对三角形区域内网格点插值 
    For I = 0 To nSJX 
        X1 = Xcontou(ID1(I)) 
        Y1 = Ycontou(ID1(I)) 
        Z1 = Zcontou(ID1(I)) 
 
        X2 = Xcontou(ID2(I)) 
        Y2 = Ycontou(ID2(I)) 
        Z2 = Zcontou(ID2(I)) 
     
        X3 = Xcontou(ID3(I)) 
        Y3 = Ycontou(ID3(I)) 
        Z3 = Zcontou(ID3(I)) 
     
        '建立三角形区域 
        CloseSJX(0).X = (X1 - Xmin0) * Fact 
        CloseSJX(0).Y = (Y1 - Ymin0) * Fact 
         
        CloseSJX(1).X = (X2 - Xmin0) * Fact 
        CloseSJX(1).Y = (Y2 - Ymin0) * Fact 
         
        CloseSJX(2).X = (X3 - Xmin0) * Fact 
        CloseSJX(2).Y = (Y3 - Ymin0) * Fact 
         
        CloseSJX(3).X = CloseSJX(0).X 
        CloseSJX(3).Y = CloseSJX(0).Y 
        hRgnSJX = CreatePolygonRgn(CloseSJX(1), 3, 2) 
     
        Y0 = YminT - DY 
        For IY = 1 To NY 
            Y0 = Y0 + DY 
            X0 = XminT - DX 
            For IX = 1 To NX 
                X0 = X0 + DX 
                If (bZgrid(IX, IY) = False) Then '该网格点未网格化 
                    X0c = (X0 - Xmin0) * Fact 
                    Y0c = (Y0 - Ymin0) * Fact 
                    bPtInRegion = PtInRegion(hRgnSJX, X0c, Y0c) 
                    If (bPtInRegion > 0) Then '在区域内 
                        Select Case iGrid 
                            Case 0 '三角平面插值 
                                L1(0) = Y2 - Y1 
                                L1(1) = X1 - X2 
                                L1(2) = Y1 * (X2 - X1) - X1 * (Y2 - Y1) 
                                 
                                L2(0) = Y3 - Y0 
                                L2(1) = X0 - X3 
                                L2(2) = Y0 * (X3 - X0) - X0 * (Y3 - Y0) 
                                 
                                Delta = L1(0) * L2(1) - L2(0) * L1(1) 
                                X = (L1(1) * L2(2) - L2(1) * L1(2)) / Delta 
                                Y = (-L1(0) * L2(2) + L2(0) * L1(2)) / Delta 
                                 
                                Ds1 = (X - X1) ^ 2 + (Y - Y1) ^ 2 
                                Ds = (X2 - X1) ^ 2 + (Y2 - Y1) ^ 2 
                                Z = Z1 + Ds1 / Ds * (Z2 - Z1) 
                             
                                Ds1 = (X0 - X3) ^ 2 + (Y0 - Y3) ^ 2 
                                Ds = (X - X3) ^ 2 + (Y - Y3) ^ 2 
                                Z = Z3 + Ds1 / Ds * (Z3 - Z) 
                            Case 1 '双二次Lagrange插值 
                                Call Lagrange(X1, Y1, Z1, X2, Y2, Z2, X3, Y3, Z3, X0, Y0, Z, 2) 
                            Case 2 '双三次Lagrange插值 
                                Call Lagrange(X1, Y1, Z1, X2, Y2, Z2, X3, Y3, Z3, X0, Y0, Z, 3) 
                            Case 3 '距离平方反比插值 
                                R1 = (X1 - X0) ^ 2 + (Y1 - Y0) ^ 2 
                                R2 = (X2 - X0) ^ 2 + (Y2 - Y0) ^ 2 
                                R3 = (X3 - X0) ^ 2 + (Y3 - Y0) ^ 2 
                                Z = (Z1 / R1 + Z2 / R2 + Z3 / R3) / (1# / R1 + 1# / R2 + 1# / R3) 
                        End Select 
                        Zgrid(IX, IY) = Z 
                        bZgrid(IX, IY) = True 
                        PictureGrid.Circle (X0, Y0), Dr0 
                        DoEvents 
                    Else 
                        'Begin判断是否在边线或顶点上 
                        Ds1 = Sqr((X0 - X1) ^ 2 + (Y0 - Y1) ^ 2) 
                        Ds2 = Sqr((X0 - X2) ^ 2 + (Y0 - Y2) ^ 2) 
                        Ds = Sqr((X2 - X1) ^ 2 + (Y2 - Y1) ^ 2) 
                        If (Abs(Ds - Ds1 - Ds2)  0.00001) Then '网格点为第一、二点边线上 
                            Zgrid(IX, IY) = Z1 + Ds1 / Ds * (Z2 - Z1) 
                            bZgrid(IX, IY) = True 
                            PictureGrid.Circle (X0, Y0), Dr0 
                            DoEvents 
                            GoTo GoTo1 
                        End If 
                     
                        Ds1 = Sqr((X0 - X2) ^ 2 + (Y0 - Y2) ^ 2) 
                        Ds2 = Sqr((X0 - X3) ^ 2 + (Y0 - Y3) ^ 2) 
                        Ds = Sqr((X3 - X2) ^ 2 + (Y3 - Y2) ^ 2) 
                        If (Abs(Ds - Ds1 - Ds2)  0.00001) Then '网格点为第二、三点边线上 
                            Zgrid(IX, IY) = Z2 + Ds1 / Ds * (Z3 - Z2) 
                            bZgrid(IX, IY) = True 
                            PictureGrid.Circle (X0, Y0), Dr0 
                            DoEvents 
                            GoTo GoTo1 
                        End If 
                     
                        Ds1 = Sqr((X0 - X1) ^ 2 + (Y0 - Y1) ^ 2) 
                        Ds2 = Sqr((X0 - X3) ^ 2 + (Y0 - Y3) ^ 2) 
                        Ds = Sqr((X3 - X1) ^ 2 + (Y3 - Y1) ^ 2) 
                        If (Abs(Ds - Ds1 - Ds2)  0.00001) Then '网格点为第一、三点边线上 
                            Zgrid(IX, IY) = Z1 + Ds1 / Ds * (Z3 - Z1) 
                            bZgrid(IX, IY) = True 
                            PictureGrid.Circle (X0, Y0), Dr0 
                            DoEvents 
                            GoTo GoTo1 
                        End If 
                        'End判断是否在边线或顶点上 
                    End If 
GoTo1: 
                End If 
            Next IX 
        Next IY 
        DeleteObject (hRgnSJX) 
    Next I 
    'End对三角形区域内网格点插值 
 
    'Begin对三角形区域外网格点插值 
    PictureGrid.ForeColor = QBColor(12) 
    If (DX > DY) Then 
        R0 = 1.5 * DX 
    Else 
        R0 = 1.5 * DY 
    End If 
 
    RR0 = R0 * R0 
 
    Y0 = YminT - DY 
    For IY = 1 To NY 
        Y0 = Y0 + DY 
        X0 = XminT - DX 
        For IX = 1 To NX 
        X0 = X0 + DX 
            If (bZgrid(IX, IY) = False) Then 
                R0 = RR0 
                Do 
                    II = 0 
                    For K = 0 To NContou 
                        R = (Xcontou(K) - X0) ^ 2 + (Ycontou(K) - Y0) ^ 2 
                        If (R = R0) Then 
                            II = II + 1 
                            VV(II) = Zcontou(K) 
                            RR(II) = R 
                        End If 
                    Next K 
                    If (II > 0) Then 
                        C = 0 
                        For K = 1 To II 
                            C = C + 1# / RR(K) 
                        Next K 
                        V = 0# 
                        For K = 1 To II 
                            V = V + VV(K) / RR(K) 
                        Next K 
                        V = V / C 
                        Exit Do 
                    End If 
                    R0 = 1.5 * R0 
                    bGrid = False 
                Loop 
                PictureGrid.Circle (X0, Y0), Dr0 
                DoEvents 
                Zgrid(IX, IY) = V 
                bZgrid(IX, IY) = True 
            End If 
        Next IX 
    Next IY 
ElseIf (iGrid = 4) Then '按方位取点加权插值 
    Call GridAZimuth(NY, NX, 4, XminT, YminT, DX, DY, Xcontou, Ycontou, Zcontou, NContou, Zgrid, bZgrid, Dr0) 
ElseIf (iGrid = 5) Then '趋势面拟合 
    N0 = Sqr(Sqr(NX * NY)) 
    If (N0  4) Then N0 = 4 
    Call GridTrendSurface(NY, NX, N0, XminT, YminT, DX, DY, Xcontou, Ycontou, Zcontou, NContou, Zgrid, bZgrid, Dr0) 
ElseIf (iGrid = 6) Then '加权最小二乘曲面拟合 
    ReDim BB(1 To 6), XX(1 To 6) 
    ReDim Xt(1 To 100), Yt(1 To 100), Zt(1 To 100), Wt(1 To 100) 
    PictureGrid.ForeColor = QBColor(12) 
    If (DX > DY) Then 
        R0 = 1.5 * DX 
    Else 
        R0 = 1.5 * DY 
    End If 
 
    RR0 = R0 * R0 
 
    Y0 = YminT - DY 
    For IY = 1 To NY 
        Y0 = Y0 + DY 
        X0 = XminT - DX 
        For IX = 1 To NX 
            X0 = X0 + DX 
            R0 = RR0 
            Do 
                Nt = 0 
                For K = 0 To NContou 
                    R = (Xcontou(K) - X0) ^ 2 + (Ycontou(K) - Y0) ^ 2 
                    If (R = 0.00001) Then 
                        R = 0# 
                        V = Zcontou(K) 
                        Exit For 
                    ElseIf (R = R0) Then 
                        Nt = Nt + 1 
                        Xt(Nt) = Xcontou(K) 
                        Yt(Nt) = Ycontou(K) 
                        Zt(Nt) = Zcontou(K) 
                        Wt(Nt) = 1# / R 
                    End If 
                Next K 
                If (R = 0.00001) Then 
                    Exit Do 
                ElseIf (Nt > 6) Then 
                    ReDim AA(1 To Nt, 1 To 6) 
                    'Z 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) * Zt(K) 
                    Next K 
                    BB(1) = S 
                    'ZX 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) * Zt(K) * Xt(K) 
                    Next K 
                    BB(2) = S 
                    'ZY 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) * Zt(K) * Yt(K) 
                    Next K 
                    BB(3) = S 
                    'ZXY 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) * Zt(K) * Xt(K) * Yt(K) 
                    Next K 
                    BB(4) = S 
                    'ZXX 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) * Zt(K) * Xt(K) * Xt(K) 
                    Next K 
                    BB(5) = S 
                    'ZYY 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) * Zt(K) * Yt(K) * Yt(K) 
                    Next K 
                    BB(6) = S 
                    '1----------- 
                    'AA(1,1) 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) 
                    Next K 
                    AA(1, 1) = S 
                    'AA(1,2) 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) * Xt(K) 
                    Next K 
                    AA(1, 2) = S 
                    'AA(1,3) 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) * Yt(K) 
                    Next K 
                    AA(1, 3) = S 
                    'AA(1,4) 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) * Xt(K) * Xt(K) 
                    Next K 
                    AA(1, 4) = S 
                    'AA(1,5) 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) * Xt(K) * Yt(K) 
                    Next K 
                    AA(1, 5) = S 
                    'AA(1,6) 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) * Yt(K) * Yt(K) 
                    Next K 
                    AA(1, 6) = S 
                    '2------------- 
                    'AA(2,1) 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) * Xt(K) 
                    Next K 
                    AA(2, 1) = S 
                    'AA(2,2) 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) * Xt(K) * Xt(K) 
                    Next K 
                    AA(2, 2) = S 
                    'AA(2,3) 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) * Yt(K) * Xt(K) 
                    Next K 
                    AA(2, 3) = S 
                    'AA(2,4) 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) * (Xt(K) ^ 3) 
                    Next K 
                    AA(2, 4) = S 
                    'AA(2,5) 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) * Xt(K) * Xt(K) * Yt(K) 
                    Next K 
                    AA(2, 5) = S 
                    'AA(2,6) 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) * Xt(K) * Yt(K) * Yt(K) 
                    Next K 
                    AA(2, 6) = S 
                    '3---------------------- 
                    'AA(3,1) 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) * Yt(K) 
                    Next K 
                    AA(3, 1) = S 
                    'AA(3,2) 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) * Xt(K) * Yt(K) 
                    Next K 
                    AA(3, 2) = S 
                    'AA(3,3) 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) * Yt(K) * Yt(K) 
                    Next K 
                    AA(3, 3) = S 
                    'AA(3,4) 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) * Xt(K) * Xt(K) * Yt(K) 
                    Next K 
                    AA(3, 4) = S 
                    'AA(3,5) 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) * Xt(K) * Yt(K) * Yt(K) 
                    Next K 
                    AA(3, 5) = S 
                    'AA(3,6) 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) * (Yt(K) ^ 3) 
                    Next K 
                    AA(3, 6) = S 
                    '4---------------- 
                    'AA(4,1) 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) * Yt(K) * Xt(K) 
                    Next K 
                    AA(4, 1) = S 
                    'AA(4,2) 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) * Xt(K) * Xt(K) * Yt(K) 
                    Next K 
                    AA(4, 2) = S 
                    'AA(4,3) 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) * Xt(K) * Yt(K) * Yt(K) 
                    Next K 
                    AA(4, 3) = S 
                    'AA(4,4) 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) * Yt(K) * (Xt(K) ^ 3) 
                    Next K 
                    AA(4, 4) = S 
                    'AA(4,5) 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) * ((Xt(K) * Yt(K)) ^ 2) 
                    Next K 
                    AA(4, 5) = S 
                    'AA(4,6) 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) * Xt(K) * (Yt(K) ^ 3) 
                    Next K 
                    AA(4, 6) = S 
                    '5------------- 
                    'AA(5,1) 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) * Xt(K) * Xt(K) 
                    Next K 
                    AA(5, 1) = S 
                    'AA(5,2) 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) * (Xt(K) ^ 3) 
                    Next K 
                    AA(5, 2) = S 
                    'AA(5,3) 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) * Xt(K) * Xt(K) * Yt(K) 
                    Next K 
                    AA(5, 3) = S 
                    'AA(5,4) 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) * (Xt(K) ^ 4) 
                    Next K 
                    AA(5, 4) = S 
                    'AA(5,5) 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) * Yt(K) * (Xt(K) ^ 3) 
                    Next K 
                    AA(5, 5) = S 
                    'AA(5,6) 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) * ((Xt(K) * Yt(K)) ^ 2) 
                    Next K 
                    AA(5, 6) = S 
                    '6-------------- 
                    'AA(6,1) 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) * Yt(K) * Yt(K) 
                    Next K 
                    AA(6, 1) = S 
                    'AA(6,2) 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) * Xt(K) * Yt(K) * Yt(K) 
                    Next K 
                    AA(6, 2) = S 
                    'AA(6,3) 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) * (Yt(K) ^ 3) 
                    Next K 
                    AA(6, 3) = S 
                    'AA(6,4) 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) * ((Xt(K) * Yt(K)) ^ 2) 
                    Next K 
                    AA(6, 4) = S 
                    'AA(6,5) 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) * Xt(K) * (Yt(K) ^ 3) 
                    Next K 
                    AA(6, 5) = S 
                    'AA(6,6) 
                    S = 0# 
                    For K = 1 To Nt 
                        S = S + Wt(K) * (Yt(K) ^ 4) 
                    Next K 
                    AA(6, 6) = S 
                     
                    Call Gauss(AA, BB, 6, XX, N0) 
 
                    V = XX(1) + XX(2) * X0 + XX(3) * Y0 + XX(4) * X0 * X0 + XX(5) * X0 * Y0 + XX(6) * Y0 * Y0 
                    Exit Do 
                End If 
                R0 = 1.5 * R0 
                bGrid = False 
            Loop 
            PictureGrid.Circle (X0, Y0), Dr0 
            DoEvents 
            Zgrid(IX, IY) = V 
            bZgrid(IX, IY) = True 
        Next IX 
    Next IY 
End If 
Vmin = 10000000000# 
Vmax = -Vmin 
For IX = 1 To NX 
    For IY = 1 To NY 
        If (Zgrid(IX, IY)  Vmin) Then Vmin = Zgrid(IX, IY) 
        If (Zgrid(IX, IY) > Vmax) Then Vmax = Zgrid(IX, IY) 
    Next IY 
Next IX 
'End对三角形区域外网格点插值 
 
I = InStr(TheContouPath, ".") 
If (I > 0) Then 
    TheOutFile = Left(TheContouPath, I - 1) + Format(iGrid, "0") + ".GRD" 
Else 
    TheOutFile = TheContouPath + Format(iGrid, "0") + ".GRD" 
End If 
Open TheOutFile For Output As #1 
Print #1, "DSAA" 
Print #1, Format(NX, "####0 "); Format(NY, "####0") 
Print #1, Format(XminT, "###0.000 "); Format(XmaxT, "###0.000") 
Print #1, Format(YminT, "###0.000 "); Format(YmaxT, "###0.000") 
Print #1, Format(Vmin, "###0.0000 "); Format(Vmax, "###0.0000") 
For IY = 1 To NY 
    For IX = 1 To NX - 1 
        Print #1, Format(Zgrid(IX, IY), "####0.0000 "); 
    Next IX 
    Print #1, Format(Zgrid(NX, IY), "####0.0") 
Next IY 
Close (1) 
End Sub 
'读绘等值线的数据 
Private Sub ReadContouFile() 
Dim IX As Integer, IY As Integer, II As Integer 
Dim I As Integer, J As Integer, K As Integer 
Dim I1 As Integer, L As Integer, Temp As String, DSAA_DSBB As String * 4, ValueTemp As Single 
Dim N0 As Long, N As Long 
Dim Xt As Double, Yt As Double 
Dim Lat As Double, Lon As Double, Rou As Double 
Dim VminTMP As Double, VmaxTMP As Double 
Dim iModeOld As Integer, StrMax As String 
Dim bSpace As Boolean 
Dim lNX As Long, lNY As Long, DouValueTemp As Double, xStep As Double, yStep As Double, VminT As Double, VmaxT As Double 
 
 
Open TheContouPath For Binary Access Read Lock Read As #1 
Get #1, 1, DSAA_DSBB 
Close (1) 
If (DSAA_DSBB = "DSAA") Then 
    Open TheContouPath For Input As #1 
    Line Input #1, Temp 
    Input #1, NX, NY 
    Input #1, Xmin, Xmax 
    Input #1, Ymin, Ymax 
    Input #1, Vmin, Vmax 
    For IX = 1 To NX 
        Input #1, ValueTemp 
    Next IX 
    Line Input #1, Temp 
    Close (1) 
    If (Len(Trim(Temp))  1) Then 
        bSpace = True 
    Else 
        bSpace = False 
    End If 
    Close (1) 
 
    DataType = 0 
    Open TheContouPath For Input As #1 
    Line Input #1, Temp 
    Input #1, NX, NY 
    Input #1, Xmin, Xmax 
    Input #1, Ymin, Ymax 
    Input #1, Vmin, Vmax 
    ReDim Zgrid(1 To NX, 1 To NY), bZgrid(1 To NX, 1 To NY) 
    N0 = NX * NY 
    ReDim Xcontou(0 To N0), Ycontou(0 To N0), Zcontou(0 To N0) 
     
    NContou = -1 
    DX = (Xmax - Xmin) / (NX - 1) 
    DY = (Ymax - Ymin) / (NY - 1) 
    Yt = Ymin - DY 
    If (bSpace = False) Then 
        For IY = 1 To NY 
            Yt = Yt + DY 
            Xt = Xmin - DX 
            For IX = 1 To NX 
                Xt = Xt + DX 
                NContou = NContou + 1 
                Input #1, Zcontou(NContou) 
                Xcontou(NContou) = Xt 
                Ycontou(NContou) = Yt 
                Zgrid(IX, IY) = Zcontou(NContou) 
            Next IX 
        Next IY 
    Else 
        For IY = 1 To NY 
            Yt = Yt + DY 
            Xt = Xmin - DX 
            For IX = 1 To NX 
                Xt = Xt + DX 
                NContou = NContou + 1 
                Input #1, Zcontou(NContou) 
                Xcontou(NContou) = Xt 
                Ycontou(NContou) = Yt 
                Zgrid(IX, IY) = Zcontou(NContou) 
            Next IX 
            Line Input #1, Temp 
        Next IY 
    End If 
    Close (1) 
ElseIf (DSAA_DSBB = "DSBB") Then 
    DataType = 0 
    Open TheContouPath For Binary Access Read Lock Read As #1 
    Seek #1, 5 
    Get #1, , NX 
    Get #1, , NY 
    Get #1, , Xmin 
    Get #1, , Xmax 
    Get #1, , Ymin 
    Get #1, , Ymax 
    Get #1, , Vmin 
    Get #1, , Vmax 
     
    ReDim Zgrid(1 To NX, 1 To NY), bZgrid(1 To NX, 1 To NY) 
     
    N0 = NX 
    N0 = N0 * NY 
    ReDim Xcontou(0 To N0), Ycontou(0 To N0), Zcontou(0 To N0) 
     
    NContou = -1 
    DX = (Xmax - Xmin) / (NX - 1) 
    DY = (Ymax - Ymin) / (NY - 1) 
    Yt = Ymin - DY 
    For IY = 1 To NY 
        Yt = Yt + DY 
        Xt = Xmin - DX 
        For IX = 1 To NX 
            Xt = Xt + DX 
            NContou = NContou + 1 
            Get #1, , ValueTemp 
             
            Xcontou(NContou) = Xt 
            Ycontou(NContou) = Yt 
            Zcontou(NContou) = ValueTemp 
            Zgrid(IX, IY) = ValueTemp 
        Next IX 
    Next IY 
    Close (1) 
ElseIf (DSAA_DSBB = "DSRB") Then 
    DataType = 0 
    Open TheContouPath For Binary Access Read Lock Read As #1 
    Seek #1, 17 
    Get #1, , lNY 
    Get #1, , lNY 
    Get #1, , lNX 
    Get #1, , XminT 
    Get #1, , YminT 
    Get #1, , xStep 
    Get #1, , yStep 
    Get #1, , VminT 
    Get #1, , VmaxT 
         
    NX = lNX 
    NY = lNY 
    DX = xStep 
    DY = yStep 
    Xmin = XminT 
    Xmax = Xmin + (NX - 1) * xStep 
    Ymin = YminT 
    Ymax = Ymin + (NY - 1) * yStep 
    Vmin = VminT 
    Vmax = VmaxT 
     
    ReDim Zgrid(1 To NX, 1 To NY), bZgrid(1 To NX, 1 To NY) 
    N0 = NX 
    N0 = N0 * NY 
    ReDim Xcontou(0 To N0), Ycontou(0 To N0), Zcontou(0 To N0) 
     
    Seek #1, 101 
    NContou = -1 
    Yt = Ymin - DY 
    For IY = 1 To NY 
        Yt = Yt + DY 
        Xt = Xmin - DX 
        For IX = 1 To NX 
            Xt = Xt + DX 
            NContou = NContou + 1 
            Get #1, , DouValueTemp 
             
            Xcontou(NContou) = Xt 
            Ycontou(NContou) = Yt 
            Zcontou(NContou) = DouValueTemp 
            Zgrid(IX, IY) = DouValueTemp 
        Next IX 
    Next IY 
    Close (1) 
Else 
    '判断一行有几个数 
    Open TheContouPath For Input As #1 
    For I = 1 To 3 
        Line Input #1, Temp 
        Temp = Trim(Temp) 
        J = Len(Temp) 
        I1 = 2 
        K = 1 
        Do While I1  J 
            If (Mid(Temp, I1, 1) = " " Or Mid(Temp, I1, 1) = ",") Then 
                K = K + 1 
                For L = I1 + 1 To J 
                    If (Mid(Temp, L, 1) = " " Or Mid(Temp, L, 1) = ",") Then 
                        I1 = L 
                    Else 
                        I1 = I1 + 1 
                        Exit For 
                    End If 
                Next L 
            Else 
                I1 = I1 + 1 
            End If 
        Loop 
        If (K <> 3) Then Exit For 
    Next I 
    Close (1) 
    If (K <> 3) Then 
        MsgBox "非本程序识别格式!请按如下格式存放:" + Chr(10) + Chr(13) + "纬度,经度,观测值", vbOKOnly, "关于绘平面图等" 
        Exit Sub 
    End If 
    N0 = 1000 
    ReDim Xcontou(0 To N0), Ycontou(0 To N0), Zcontou(0 To N0) 
    N = -1 
    Open TheContouPath For Input As #1 
    Do While Not EOF(1) 
        N = N + 1 
        If (N > N0) Then 
            N0 = N0 + 100 
            ReDim Preserve Xcontou(0 To N0), Ycontou(0 To N0), Zcontou(0 To N0) 
        End If 
        Input #1, Ycontou(N), Xcontou(N), Zcontou(N) 
    Loop 
    NContou = N 
    Close (1) 
    Call SortXY(Xcontou, Ycontou, Zcontou, NContou) 
     
    '判断是否是网格数据 
    Call CheckGrid(Xcontou, Ycontou, NContou, NX, NY) 
    If (DataType = 0) Then 
        ReDim Zgrid(1 To NX, 1 To NY), bZgrid(1 To NX, 1 To NY) 
        II = -1 
        For IX = 1 To NX 
            For IY = 1 To NY 
                II = II + 1 
                Zgrid(IX, IY) = Zcontou(II) 
            Next IY 
        Next IX 
    End If 
     
    Xmin = Xcontou(0) 
    Xmax = Xcontou(0) 
    Ymin = Ycontou(0) 
    Ymax = Ycontou(0) 
    Vmin = Zcontou(0) 
    Vmax = Zcontou(0) 
    For I = 0 To NContou 
        If (Xcontou(I)  Xmin) Then Xmin = Xcontou(I) 
        If (Xcontou(I) > Xmax) Then Xmax = Xcontou(I) 
             
        If (Ycontou(I)  Ymin) Then Ymin = Ycontou(I) 
        If (Ycontou(I) > Ymax) Then Ymax = Ycontou(I) 
             
        If (Zcontou(I)  Vmin) Then Vmin = Zcontou(I) 
        If (Zcontou(I) > Vmax) Then Vmax = Zcontou(I) 
    Next I 
 
    'Begin判断经纬度是否颠倒 
    If (Ymin >= -180 And Ymax = 180 And Xmin >= -90 And Xmax = 90) Then 
        ReDim Xcontou(0 To NContou), Ycontou(0 To NContou), Zcontou(0 To NContou) 
        Open TheContouPath For Input As #1 
        For I = 0 To NContou 
            Input #1, Xcontou(I), Ycontou(I), Zcontou(I) 
        Next I 
        Close (1) 
        Call SortXY(Xcontou, Ycontou, Zcontou, NContou) 
     
        '判断是否是网格数据 
        Call CheckGrid(Xcontou, Ycontou, NContou, NX, NY) 
        If (DataType = 0) Then 
            ReDim Zgrid(1 To NX, 1 To NY), bZgrid(1 To NX, 1 To NY) 
            II = -1 
            For IX = 1 To NX 
                For IY = 1 To NY 
                    II = II + 1 
                    Zgrid(IX, IY) = Zcontou(II) 
                Next IY 
            Next IX 
        End If 
     
        Xmin = Xcontou(0) 
        Xmax = Xcontou(0) 
        Ymin = Ycontou(0) 
        Ymax = Ycontou(0) 
        Vmin = Zcontou(0) 
        Vmax = Zcontou(0) 
        For I = 0 To NContou 
            If (Xcontou(I)  Xmin) Then Xmin = Xcontou(I) 
            If (Xcontou(I) > Xmax) Then Xmax = Xcontou(I) 
             
            If (Ycontou(I)  Ymin) Then Ymin = Ycontou(I) 
            If (Ycontou(I) > Ymax) Then Ymax = Ycontou(I) 
             
            If (Zcontou(I)  Vmin) Then Vmin = Zcontou(I) 
            If (Zcontou(I) > Vmax) Then Vmax = Zcontou(I) 
        Next I 
    End If 
    'End判断经纬度是否颠倒 
End If 
 
'设置等值线参数 
Call MaxnDec(Vmin, Vmax, nDec, StrMax, FMT) 
 
Vmin = Val(Format(Vmin, FMT)) 
Vmax = Val(Format(Vmax, FMT)) 
 
Xmin0 = Xmin 
Xmax0 = Xmax 
Ymin0 = Ymin 
Ymax0 = Ymax 
End Sub 
 
 
'判断是否为网格数据 
Private Sub CheckGrid(X() As Double, Y() As Double, N As Long, NX As Integer, NY As Integer) 
Dim IX As Long, IY As Long 
Dim RR() As Double, VV() As Double, V As Double, C As Double 
Dim Xtemp As Double, Ytemp As Double, Error1 As Integer 
Dim I As Long 
 
DataType = 0 
'判断是否是网格数据 
Xtemp = X(0) 
Ytemp = Y(0) 
NX = 0 
NY = 0 
DY = Y(2) - Y(1) 
For I = 0 To N 
    If (X(I) <> Xtemp) Then Exit For 
    NY = NY + 1 
Next I 
If (NY  3) Then 'X方向数据小于3个,肯定非网格数据 
    DataType = 1 
    GoTo Error1 
End If 
NX = Fix((N + 1) / NY) 
If (NY * NX = N + 1) Then '有可能是网格数据 
    DataType = 0 
    '判断X坐标是否等间距 
    DX = X(NY) - X(0) 
    For IX = 2 To NX - 1 
        Xtemp = X(IX * NY) - X((IX - 1) * NY) 
        If (Abs(Xtemp - DX) > 0.000001) Then 
            DataType = 1 
            GoTo Error1 
        End If 
    Next IX 
    '判断Y是否等间距 
    DY = Y(1) - Y(0) 
    For IY = 2 To NY - 1 
        Ytemp = Y(IY) - Y(IY - 1) 
        If (Abs(Ytemp - DY) > 0.000001) Then 
            DataType = 1 
            GoTo Error1 
        End If 
    Next IY 
Else '肯定不是网格数据 
    DataType = 1 
End If 
Error1: 
End Sub 
 
'数据按X、Y排序 
Private Sub SortXY(X() As Double, Y() As Double, Z() As Double, N As Long) 
Dim N1 As Long, N2 As Long, X1 As Double 
Dim I As Long, J As Long 
 
'按X坐标排序 
Call ShellSort(X, Y, Z, N, 0, N) 
'按Y坐标排序 
X1 = X(0) 
N1 = 0 
N2 = 0 
For I = 1 To N 
    If (X(I) = X1) Then 
        N2 = N2 + 1 
    Else 
        If (N2 > N1) Then '相同X按Y坐标排序 
            Call ShellSort(Y, X, Z, N, N1, N2) 
        End If 
        X1 = X(I) 
        N1 = I 
        N2 = I 
    End If 
Next I 
If (N2 > N1) Then '相同X按Y坐标排序 
    Call ShellSort(Y, X, Z, N, N1, N2) 
End If 
 
'平均重合点 
J = -1 
X1 = Z(0) 
N1 = 1 
For I = 1 To N 
    If (Abs(X(I) - X(I - 1)) + Abs(Y(I) - Y(I - 1))  0.00001) Then 
        X1 = X1 + Z(I) 
        N1 = N1 + 1 
    Else 
        J = J + 1 
        Z(J) = X1 / N1 
        X(J) = X(I - 1) 
        Y(J) = Y(I - 1) 
        X1 = Z(I) 
        N1 = 1 
    End If 
Next I 
J = J + 1 
Z(J) = X1 / N1 
X(J) = X(N) 
Y(J) = Y(N) 
N = J 
End Sub 
'排序子程序 
Private Sub ShellSort(X() As Double, Y() As Double, Z() As Double, N As Long, N1 As Long, N2 As Long) 
Dim B As Long, M As Long, L As Long, I As Long, J As Long, K As Long 
Dim Xtemp As Double, Ytemp As Double, Ztemp As Double, jk As Long 
 
B = N2 - N1 + 1 
B = Log(B) / Log(2#) 
M = B 
L = 2 ^ M 
For I = 1 To M 
    K = L - 1 
    L = L / 2 
    For J = K + N1 To N2 
        Xtemp = X(J) 
        Ytemp = Y(J) 
        Ztemp = Z(J) 
        jk = J - K 
        Do While (jk > N1 - 1 And X(jk) > Xtemp) 
            X(jk + K) = X(jk) 
            Y(jk + K) = Y(jk) 
            Z(jk + K) = Z(jk) 
            jk = jk - K 
            If (jk  0) Then Exit Do 
        Loop 
        X(jk + K) = Xtemp 
        Y(jk + K) = Ytemp 
        Z(jk + K) = Ztemp 
    Next J 
Next I 
End Sub 
 
Private Sub MaxnDec(Ymin As Single, Ymax As Single, nDec As Integer, StrMax As String, FormatTMP As String) 
Dim ValueMax As Single, Delta As Single, StrYmin As String, StrYmax As String 
 
If (Abs(Ymax) > Abs(Ymin)) Then 
    ValueMax = Abs(Ymax) 
Else 
    ValueMax = Abs(Ymin) 
End If 
Delta = Abs(Ymax - Ymin) 
If (Delta  0.001 Or ValueMax  0.001) Then 
    nDec = 5 
    FormatTMP = "######0.00000" 
    StrYmin = Format(Ymin, "######0.00000") 
    StrYmax = Format(Ymax, "######0.00000") 
ElseIf (Delta  0.01 Or ValueMax  0.01) Then 
    nDec = 4 
    FormatTMP = "######0.0000" 
    StrYmin = Format(Ymin, "######0.0000") 
    StrYmax = Format(Ymax, "######0.0000") 
ElseIf (Delta  0.1 Or ValueMax  0.1) Then 
    nDec = 3 
    FormatTMP = "######0.000" 
    StrYmin = Format(Ymin, "######0.000") 
    StrYmax = Format(Ymax, "######0.000") 
ElseIf (Delta  1# Or ValueMax  1#) Then 
    nDec = 2 
    FormatTMP = "######0.00" 
    StrYmin = Format(Ymin, "######0.00") 
    StrYmax = Format(Ymax, "######0.00") 
ElseIf (Delta  10# Or ValueMax  10#) Then 
    nDec = 1 
    FormatTMP = "######0.0" 
    StrYmin = Format(Ymin, "######0.0") 
    StrYmax = Format(Ymax, "######0.0") 
Else 
    FormatTMP = "######0" 
    StrYmin = Format(Ymin, "######0") 
    StrYmax = Format(Ymax, "######0") 
    nDec = 0 
End If 
StrMax = StrYmax 
If (Len(StrYmin) > Len(StrMax)) Then StrMax = StrYmin 
 
End Sub 
'双二次Lagrange、双三次Lagrange插值网格化 
Private Sub Lagrange(X1 As Double, Y1 As Double, Z1 As Double, X2 As Double, Y2 As Double, Z2 As Double, X3 As Double, Y3 As Double, Z3 As Double, XX As Double, YY As Double, ZZ As Double, b23 As Integer) 
Dim S As Double, S1 As Double, S2 As Double, S3 As Double, L As Double, A As Double, B As Double, C As Double 
Dim U1 As Double, U2 As Double, U3 As Double 
Dim Q(1 To 10) As Double, Z(1 To 10) As Double 
Dim I As Integer 
 
'Begin求大三角形V1V2V3的面积S 
A = Sqr((X2 - X1) ^ 2 + (Y2 - Y1) ^ 2) 
B = Sqr((X3 - X2) ^ 2 + (Y3 - Y2) ^ 2) 
C = Sqr((X3 - X1) ^ 2 + (Y3 - Y1) ^ 2) 
L = (A + B + C) / 2 
S = Sqr(L * (L - A) * (L - B) * (L - C)) 
'End求大三角形V1V2V3的面积S 
 
'Begin求小三角形VV2V3、VV1V3、VV1V2的面积S1、S2、S3 
A = Sqr((X2 - XX) ^ 2 + (Y2 - YY) ^ 2) 
B = Sqr((X3 - X2) ^ 2 + (Y3 - Y2) ^ 2) 
C = Sqr((X3 - XX) ^ 2 + (Y3 - YY) ^ 2) 
L = (A + B + C) / 2 
S1 = Sqr(L * (L - A) * (L - B) * (L - C)) 
 
A = Sqr((XX - X1) ^ 2 + (YY - Y1) ^ 2) 
B = Sqr((X3 - XX) ^ 2 + (Y3 - YY) ^ 2) 
C = Sqr((X3 - X1) ^ 2 + (Y3 - Y1) ^ 2) 
L = (A + B + C) / 2 
S2 = Sqr(L * (L - A) * (L - B) * (L - C)) 
 
A = Sqr((X2 - X1) ^ 2 + (Y2 - Y1) ^ 2) 
B = Sqr((XX - X2) ^ 2 + (YY - Y2) ^ 2) 
C = Sqr((XX - X1) ^ 2 + (YY - Y1) ^ 2) 
L = (A + B + C) / 2 
S3 = Sqr(L * (L - A) * (L - B) * (L - C)) 
'End求小三角形VV2V3、VV1V3、VV1V2的面积S1、S2、S3 
 
'Begin求V相对于三角形V1V2V3的重心坐标u1、u2、u3 
U1 = S1 / S 
U2 = S2 / S 
U3 = S3 / S 
'End求V相对于三角形V1V2V3的重心坐标u1、u2、u3 
 
If (b23 = 3) Then '三次 
    'Begin求双三次多项式函数类 
    Q(1) = 4.5 * U1 * (U1 - 1# / 3) * (U1 - 2# / 3) 
    Q(2) = 4.5 * U2 * (U2 - 1# / 3) * (U2 - 2# / 3) 
    Q(3) = 4.5 * U3 * (U3 - 1# / 3) * (U3 - 2# / 3) 
    Q(4) = 13.5 * U1 * U2 * (U1 - 1# / 3) 
    Q(5) = 13.5 * U1 * U2 * (U2 - 1# / 3) 
    Q(6) = 13.5 * U1 * U3 * (U1 - 1# / 3) 
    Q(7) = 13.5 * U2 * U3 * (U2 - 1# / 3) 
    Q(8) = 13.5 * U1 * U3 * (U3 - 1# / 3) 
    Q(9) = 13.5 * U2 * U3 * (U3 - 1# / 3) 
    Q(10) = 27# * U1 * U2 * U3 
    'End求双三次多项式函数类 
 
    'Begin求10个插值点z坐标 
    Z(1) = Z1 
    Z(2) = Z2 
    Z(3) = Z3 
    Z(4) = (Z(1) + 0.5 * Z(2)) / 1.5 
    Z(5) = (Z(1) + 2# * Z(2)) / 3# 
    Z(6) = (Z(1) + 0.5 * Z(3)) / 1.5 
    Z(7) = (Z(2) + 0.5 * Z(3)) / 1.5 
    Z(8) = (Z(1) + 2# * Z(3)) / 3# 
    Z(9) = (Z(2) + 2# * Z(3)) / 3# 
    Z(10) = (Z(4) + Z(5) + Z(6) + Z(7) + Z(8) + Z(9)) / 6 
    'End求10个插值点z坐标 
 
    'Begin求双三次Lagrange网格化值 
    ZZ = 0# 
    For I = 1 To 10 
        ZZ = ZZ + Z(I) * Q(I) 
    Next I 
    'End求双三次Lagrange网格化值 
Else '二次 
    'Begin求双二次多项式函数类 
    Q(1) = U1 * (2 * U1 - 1) 
    Q(2) = U2 * (2 * U2 - 1) 
    Q(3) = U3 * (2 * U3 - 1) 
    Q(4) = 4# * U2 * U3 
    Q(5) = 4# * U1 * U3 
    Q(6) = 4# * U1 * U2 
    'End求双二次多项式函数类 
 
    'Begin求6个插值点z坐标 
    Z(1) = Z1 
    Z(2) = Z2 
    Z(3) = Z3 
    Z(4) = (Z(2) + Z(3)) / 2# 
    Z(5) = (Z(1) + Z(3)) / 2# 
    Z(6) = (Z(1) + Z(2)) / 2 
    'End求6个插值点z坐标 
 
    'Begin求双二次Lagrange网格化值 
    ZZ = 0# 
    For I = 1 To 6 
        ZZ = ZZ + Z(I) * Q(I) 
    Next I 
    'End求双二次Lagrange网格化值 
End If 
End Sub 
 
 
Private Sub DrawOld() 
Dim Dx0 As Double, Dy0 As Double, I As Integer, J As Integer 
Dim X As Double, Y As Double, YmaxNew As Double, XmaxNew As Double 
 
PictureGrid.Picture = LoadPicture() 
PictureGrid.DrawWidth = 1 
 
XminT = Val(TextXmin.Text) 
XmaxT = Val(TextXmax.Text) 
YminT = Val(TextYmin.Text) 
YmaxT = Val(TextYmax.Text) 
 
DX = Val(TextXStep.Text) 
DY = Val(TextYStep.Text) 
NX = Val(TextXNX.Text) 
NY = Val(TextYNY.Text) 
If (XmaxT  XminT + DX * (NX - 1)) Then XmaxT = XminT + DX * (NX - 1) 
If (YmaxT  YminT + DY * (NY - 1)) Then YmaxT = YminT + DY * (NY - 1) 
If (Xmin  XminT) Then 
    Xmin0 = Xmin 
Else 
    Xmin0 = XminT 
End If 
If (Ymin  YminT) Then 
    Ymin0 = Ymin 
Else 
    Ymin0 = YminT 
End If 
If (Xmax > XmaxT) Then 
    Xmax0 = Xmax 
Else 
    Xmax0 = XmaxT 
End If 
If (Ymax > YmaxT) Then 
    Ymax0 = Ymax 
Else 
    Ymax0 = YmaxT 
End If 
 
 
Dx0 = 30 
Dy0 = 30 
Dx0 = Dx0 * (Xmax0 - Xmin0) / (PictureGrid.Width - 2 * Dx0) 
Dy0 = Dy0 * (Ymax0 - Ymin0) / (PictureGrid.Height - 2 * Dy0) 
PictureGrid.ScaleLeft = Xmin0 - Dx0 
PictureGrid.ScaleWidth = (Xmax0 + Dx0) - (Xmin0 - Dy0) 
PictureGrid.ScaleTop = Ymax0 + Dy0 
PictureGrid.ScaleHeight = (Ymin0 - Dy0) - (Ymax0 + Dy0) 
 
PictureGrid.ForeColor = 0 ' QBColor(4) 
Dx0 = 3 
Dx0 = Dx0 * (XmaxT - XminT) / (PictureGrid.Width - 2 * Dx0) 
PictureGrid.DrawMode = 13 
For I = 0 To NContou 
    PictureGrid.Circle (Xcontou(I), Ycontou(I)), Dx0 
Next I 
PictureGrid.ForeColor = QBColor(8) 
PictureGrid.DrawMode = 10 
 
XmaxNew = XminT + (NX - 1) * DX 
YmaxNew = YminT + (NY - 1) * DY 
X = XminT - DX 
For I = 1 To NX 
    X = X + DX 
    PictureGrid.Line (X, YminT)-(X, YmaxNew) 
Next I 
 
Y = YminT - DY 
For I = 1 To NY 
    Y = Y + DY 
    PictureGrid.Line (XminT, Y)-(XmaxNew, Y) 
Next I 
PictureGrid.ForeColor = QBColor(0) 
 
End Sub 
 
Private Sub Form_Load() 
    TheInstallPath = App.Path 
    If (Right(TheInstallPath, 1) <> "\") Then 
        TheInstallPath = App.Path + "\" 
    End If 
     
    TheContouPath = TheInstallPath + "等值线数据\" 
    TheContouFile = "" 
End Sub 
 
Private Sub TextXmax_KeyDown(KeyCode As Integer, Shift As Integer) 
If (KeyCode = 13) Then 
    Call DrawOld 
End If 
End Sub 
 
 
Private Sub TextXmin_KeyDown(KeyCode As Integer, Shift As Integer) 
If (KeyCode = 13) Then 
    Call DrawOld 
End If 
End Sub 
 
 
Private Sub TextXNX_KeyDown(KeyCode As Integer, Shift As Integer) 
If (KeyCode = 13) Then 
    Call DrawOld 
End If 
End Sub 
 
Private Sub TextXStep_KeyDown(KeyCode As Integer, Shift As Integer) 
If (KeyCode = 13) Then 
    Call DrawOld 
End If 
End Sub 
 
Private Sub TextYmax_KeyDown(KeyCode As Integer, Shift As Integer) 
If (KeyCode = 13) Then 
    Call DrawOld 
End If 
 
End Sub 
 
 
Private Sub TextYmin_KeyDown(KeyCode As Integer, Shift As Integer) 
If (KeyCode = 13) Then 
    Call DrawOld 
End If 
 
End Sub 
 
 
Private Sub TextYNY_KeyDown(KeyCode As Integer, Shift As Integer) 
If (KeyCode = 13) Then 
    Call DrawOld 
End If 
End Sub 
 
Private Sub TextYStep_KeyDown(KeyCode As Integer, Shift As Integer) 
If (KeyCode = 13) Then 
    Call DrawOld 
End If 
End Sub 
 
 
Private Sub Gauss(A() As Double, B() As Double, N As Integer, X() As Double, L As Integer) 
Dim JS() As Integer 
Dim I As Integer, J As Integer, K As Integer 
Dim T As Double, D As Double, IIS As Integer 
 
ReDim JS(1 To N) 
L = 1 
For K = 1 To N - 1 
    D = 0# 
    For I = K To N 
        For J = K To N 
            If (Abs(A(I, J)) > D) Then 
                D = Abs(A(I, J)) 
                JS(K) = J 
                IIS = I 
            End If 
        Next J 
    Next I 
    If (D + 1# = 1#) Then 
        L = 0 
    Else 
        If (JS(K) <> K) Then 
            For I = 1 To N 
                T = A(I, K) 
                A(I, K) = A(I, JS(K)) 
                A(I, JS(K)) = T 
            Next I 
        End If 
        If (IIS <> K) Then 
            For J = K To N 
                T = A(K, J) 
                A(K, J) = A(IIS, J) 
                A(IIS, J) = T 
            Next J 
            T = B(K) 
            B(K) = B(IIS) 
            B(IIS) = T 
        End If 
    End If 
    If (L = 0) Then Exit Sub 
    For J = K + 1 To N 
        A(K, J) = A(K, J) / A(K, K) 
    Next J 
    B(K) = B(K) / A(K, K) 
    For I = K + 1 To N 
        For J = K + 1 To N 
            A(I, J) = A(I, J) - A(I, K) * A(K, J) 
        Next J 
        B(I) = B(I) - A(I, K) * B(K) 
    Next I 
Next K 
If (Abs(A(N, N)) + 1# = 1#) Then 
    L = 0 
    Exit Sub 
End If 
X(N) = B(N) / A(N, N) 
For I = N - 1 To 1 Step -1 
    T = 0# 
    For J = I + 1 To N 
        T = T + A(I, J) * X(J) 
    Next J 
    X(I) = B(I) - T 
Next I 
JS(N) = N 
For K = N To 1 Step -1 
    If (JS(K) <> K) Then 
        T = X(K) 
        X(K) = X(JS(K)) 
        X(JS(K)) = T 
    End If 
Next K 
End Sub