⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 曲面_网状立体图f2.frm

📁 <VB数理统计实用算法>书中的算法源程序
💻 FRM
字号:
VERSION 5.00
Begin VB.Form frmSurface 
   Appearance      =   0  'Flat
   BackColor       =   &H80000005&
   Caption         =   "立体图"
   ClientHeight    =   8250
   ClientLeft      =   165
   ClientTop       =   735
   ClientWidth     =   13815
   LinkTopic       =   "Form1"
   ScaleHeight     =   14.552
   ScaleMode       =   7  'Centimeter
   ScaleWidth      =   24.368
   StartUpPosition =   3  '窗口缺省
   Begin VB.TextBox txtTZ 
      Alignment       =   2  'Center
      Appearance      =   0  'Flat
      Height          =   270
      Left            =   12480
      TabIndex        =   8
      Text            =   "1"
      Top             =   2520
      Width           =   855
   End
   Begin VB.TextBox txtTH 
      Alignment       =   2  'Center
      Appearance      =   0  'Flat
      Height          =   270
      Left            =   12480
      TabIndex        =   6
      Text            =   "1"
      Top             =   1800
      Width           =   855
   End
   Begin VB.TextBox txtGAMMA 
      Alignment       =   2  'Center
      Appearance      =   0  'Flat
      Height          =   270
      Left            =   12480
      TabIndex        =   4
      Text            =   "30"
      Top             =   1080
      Width           =   855
   End
   Begin VB.TextBox txtALPHA 
      Alignment       =   2  'Center
      Appearance      =   0  'Flat
      Height          =   270
      Left            =   12480
      TabIndex        =   2
      Text            =   "30"
      Top             =   360
      Width           =   855
   End
   Begin VB.PictureBox pic 
      Appearance      =   0  'Flat
      AutoRedraw      =   -1  'True
      BackColor       =   &H80000005&
      ForeColor       =   &H80000008&
      Height          =   8055
      Left            =   240
      ScaleHeight     =   14.155
      ScaleMode       =   7  'Centimeter
      ScaleWidth      =   20.929
      TabIndex        =   0
      Top             =   0
      Width           =   11895
      Begin VB.Label lblTitle 
         Alignment       =   2  'Center
         Appearance      =   0  'Flat
         AutoSize        =   -1  'True
         BackColor       =   &H80000005&
         Caption         =   "图题"
         DragMode        =   1  'Automatic
         BeginProperty Font 
            Name            =   "隶书"
            Size            =   21.75
            Charset         =   134
            Weight          =   400
            Underline       =   0   'False
            Italic          =   0   'False
            Strikethrough   =   0   'False
         EndProperty
         ForeColor       =   &H80000008&
         Height          =   435
         Left            =   2175
         TabIndex        =   9
         Top             =   0
         Width           =   915
      End
   End
   Begin VB.Label lblTZ 
      Alignment       =   2  'Center
      Appearance      =   0  'Flat
      BackColor       =   &H80000005&
      Caption         =   "垂直伸缩"
      ForeColor       =   &H80000008&
      Height          =   255
      Left            =   12360
      TabIndex        =   7
      Top             =   2280
      Width           =   1095
   End
   Begin VB.Label lblTH 
      Alignment       =   2  'Center
      Appearance      =   0  'Flat
      BackColor       =   &H80000005&
      Caption         =   "数据点间距"
      ForeColor       =   &H80000008&
      Height          =   255
      Left            =   12360
      TabIndex        =   5
      Top             =   1560
      Width           =   1095
   End
   Begin VB.Label lblGAMMA 
      Alignment       =   2  'Center
      Appearance      =   0  'Flat
      BackColor       =   &H80000005&
      Caption         =   "视角(0-90)"
      ForeColor       =   &H80000008&
      Height          =   255
      Left            =   12120
      TabIndex        =   3
      Top             =   840
      Width           =   1695
   End
   Begin VB.Label lblALPHA 
      Alignment       =   2  'Center
      Appearance      =   0  'Flat
      BackColor       =   &H80000005&
      Caption         =   "旋转角(0-360)"
      ForeColor       =   &H80000008&
      Height          =   255
      Left            =   12240
      TabIndex        =   1
      Top             =   120
      Width           =   1695
   End
   Begin VB.Menu mnuDraw 
      Caption         =   "作图"
   End
   Begin VB.Menu mnuExit 
      Caption         =   "退出"
   End
   Begin VB.Menu mnuMove 
      Caption         =   "移动图题"
      Begin VB.Menu mnuDown 
         Caption         =   "下移"
         Shortcut        =   ^D
      End
      Begin VB.Menu mnuRight 
         Caption         =   "右移"
         Shortcut        =   ^R
      End
      Begin VB.Menu mnuUP 
         Caption         =   "上移"
         Shortcut        =   ^U
      End
      Begin VB.Menu mnuLeft 
         Caption         =   "左移"
         Shortcut        =   ^L
      End
   End
   Begin VB.Menu mnuData 
      Caption         =   "数据处理"
      Begin VB.Menu mnuRow 
         Caption         =   "数据行倒转"
      End
      Begin VB.Menu mnuCol 
         Caption         =   "数据列倒转"
      End
      Begin VB.Menu mnuADD 
         Caption         =   "加常数(+或-)"
      End
      Begin VB.Menu mnuMul 
         Caption         =   "乘因子"
      End
      Begin VB.Menu mnuReNew 
         Caption         =   "恢复为原始数据"
      End
   End
End
Attribute VB_Name = "frmSurface"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit
Dim I As Integer, J As Integer, D As Double
Dim XY() As Double
Dim X() As Double, Y() As Double
Dim TH As Double, TZ As Double                  '数据点间距和垂直缩放系数
Dim ALPHA As Double, GAMMA As Double            '旋转角和视角

'绘网格线
'L为切割方式。L=1,垂直Y轴切割;L=2,垂直X轴切割
'M为数据的行数
'N为数据的列数
Private Sub DL(L As Integer, M As Integer, N As Integer)
    Dim IC As Integer, I As Integer, J As Integer, K As Integer
    Dim GN As Integer, GM As Integer
    Dim A As Integer, B As Integer, C As Integer, D As Double
    Dim T() As Double, F() As Double, C1 As Double
    Dim HH(-1000 To 1000) As Double     '隐藏线数组
    ReDim X(1 To N), Y(1 To N)
    For I = -1000 To 1000
        HH(I) = -200                    '给隐藏线数组赋绝对值大的负数为初值
    Next I
    GN = 0: GM = 0
    IC = -1
L1:
    GM = GM + 1
    K = 1
    IC = -IC
    GN = GN + IC
    For J = 1 To N
        If L = 1 Then
            X(J) = XY(GM, J, 1) * 10
            Y(J) = XY(GM, J, 2)
        Else
            X(J) = XY(J, GM, 1) * 10
            Y(J) = XY(J, GM, 2)
        End If
    Next J
    If X(1) > X(N) Then
        For J = 1 To N \ 2
            D = X(J)
            X(J) = X(N - J + 1)
            X(N - J + 1) = D
            D = Y(J)
            Y(J) = Y(N - J + 1)
            Y(N - J + 1) = D
        Next J
    End If
    C = X(N) - X(1)
    ReDim T(1 To C), F(1 To C)
    C1 = C + 0.000001
    For J = 1 To C
        T(J) = X(1) + ((X(N) - X(1)) / (C1 - 1)) * (J - 1)
    Next J
    LIP N, X, Y, C, T, F                            '线性插值
    For J = 1 To C
'作隐藏线处理
        If F(J) > HH(T(J) + 0.5) Then HH(T(J) + 0.5) = F(J)
    Next J
L2:
    If K = 1 Then
'这是新的一条线,需要确定当前坐标
        pic.CurrentX = T(GN) / 10
        pic.CurrentY = HH(T(GN) + 0.5)
    Else
        pic.Line -(T(GN) / 10, HH(T(GN) + 0.5))     '画线
    End If
    K = 3
    GN = GN + IC
    If GN > 0 And GN < C + 1 Then GoTo L2           '一条线未画完
    If GM <= M - 1 Then GoTo L1                     '开始新的一条线
End Sub

'立体图过程
'S:物体的切割方式。S=1,垂直Y轴切割;S=2,垂直X轴切割;S=3,双向切割
'ALPHA:旋转角,0-360度
'GAMMA:视角,0-90度
'M:数据的行数
'N:数据的列数
'Z:保存绘图数据的数组,网格节点上的高度值
'TH:网格的边长。要求网格在X方向和Y方向是一样的
'TZ:垂直方向的缩放系数
Private Sub Surface(S As Integer, ALPHA As Double, GAMMA As Double, _
            M As Integer, N As Integer, Z() As Double, TH As Double, TZ As Double)
    Dim I As Integer, J As Integer
    Dim BB As Double, DD As Double
    Dim A As Double, B As Double, C As Double, D As Double, E As Double
    Dim F As Double, G As Double
    Const P = 3.141592653: Const Q = 0.01745329
    ReDim XY(1 To M, 1 To N, 1 To 2)
    A = Sin(GAMMA * Q): B = Sin(ALPHA * Q): C = Cos(ALPHA * Q)
    D = Sqr(1 - B * B * A * A): E = Sqr(1 - C * C * A * A)
    F = Sqr(1 - (C / D) ^ 2): G = Sqr(1 - (B / E) ^ 2)
    If F < 0.000001 Then F = 0.000001
    If G < 0.000001 Then G = 0.000001
    BB = P / 2 - Atn((C / D) / F)
    DD = P / 2 - Atn((B / E) / G)
    For I = 1 To M
        For J = 1 To N
            XY(I, J, 1) = TH * (J - 1) * D * Cos(BB) - TH * (I - 1) * E * Cos(DD)
            XY(I, J, 2) = TH * (J - 1) * D * Sin(BB) + _
                TH * (I - 1) * E * Sin(DD) - Abs(TZ) * Z(I, J) * A
        Next J
    Next I
    If S = 1 Then DL 1, M, N                '沿物体X方向切割
    If S = 2 Then DL 2, N, M                '沿物体Y方向切割
    If S = 3 Then                           '双向切割
        DL 1, M, N
        DL 2, N, M
    End If
End Sub

Private Sub Form_Load()
    Me.Top = 0
    Me.Left = 0
    lblTitle.Caption = strLabelName         '图题
    mnuMove.Enabled = False
End Sub

'屏幕绘图
Private Sub mnuDraw_Click()
    Dim WW As Double, WX As Double, WY As Double
    pic.Cls                                     '清除屏幕
    TH = Val(txtTH.Text)                        '数据点间距
    WX = TH * (N - 1): WY = TH * (M - 1)
    If WX > WY Then WW = WX Else WW = WY
'建立自定义坐标系
    pic.Scale (-1.2 * WW / TH, -1.2 * WW / TH)-(1.8 * WW / TH, 1.8 * WW / TH)
    ALPHA = Val(txtALPHA.Text): GAMMA = 90 - Val(txtGAMMA.Text)
    TZ = Val(txtTZ.Text)                            '数据值在垂直方向的放大系数
    If ALPHA < 90 Then
        If ALPHA < 1 Then ALPHA = 1
        Surface 3, ALPHA, GAMMA, M, N, U, TH, TZ    '旋转角在90度内
'******************************************************************
    ElseIf ALPHA >= 90 And ALPHA < 180 Then         '90----180
        ALPHA = ALPHA - 90                          '将旋转角变为锐角
        If ALPHA < 1 Then ALPHA = 1
        For I = 1 To intRow \ 2                     '行倒转
            For J = 1 To intCol
                D = V(J, intRow - I + 1)
                V(J, intRow - I + 1) = V(J, I)
                V(J, I) = D
            Next J
        Next I
        Surface 3, ALPHA, GAMMA, N, M, V, TH, TZ    '旋转角在90-180度
'*******************************************************************
    ElseIf ALPHA >= 180 And ALPHA < 270 Then        '180----270
        ALPHA = ALPHA - 180                         '将旋转角变为锐角
        If ALPHA < 1 Then ALPHA = 1
        For I = 1 To intRow                         '列倒转
            For J = 1 To intCol \ 2
                D = U(I, intCol - J + 1)
                U(I, intCol - J + 1) = U(I, J)
                U(I, J) = D
            Next J
        Next I
        For I = 1 To intRow \ 2                     '行倒转
            For J = 1 To intCol
                D = U(intRow - I + 1, J)
                U(intRow - I + 1, J) = U(I, J)
                U(I, J) = D
            Next J
        Next I
        Surface 3, ALPHA, GAMMA, M, N, U, TH, TZ    '旋转角在180-270度
'*******************************************************************
    ElseIf ALPHA >= 270 And ALPHA < 360 Then        '270----360
        ALPHA = ALPHA - 270                         '将旋转角变为锐角
        If ALPHA < 1 Then ALPHA = 1
        For I = 1 To intRow                         '列倒转
            For J = 1 To intCol \ 2
                D = V(intCol - J + 1, I)
                V(intCol - J + 1, I) = V(J, I)
                V(J, I) = D
            Next J
        Next I
        Surface 3, ALPHA, GAMMA, N, M, V, TH, TZ    '旋转角在270-360度
'********************************************************************
    Else
        MsgBox "旋转角应该小于360度!"
        Exit Sub
    End If
    mnuMove.Enabled = True
End Sub

'退出,结束程序运行
Private Sub mnuExit_Click()
    Unload Me
    frmFileName.Visible = True
End Sub

'下移标题
Private Sub mnuDown_Click()
    lblTitle.Top = lblTitle.Top + 0.1
    lblTitle.Move lblTitle.Left, lblTitle.Top
End Sub

'左移标题
Private Sub mnuLeft_Click()
    lblTitle.Left = lblTitle.Left - 0.1
    lblTitle.Move lblTitle.Left, lblTitle.Top
End Sub

'右移标题
Private Sub mnuRight_Click()
    lblTitle.Left = lblTitle.Left + 0.1
    lblTitle.Move lblTitle.Left, lblTitle.Top
End Sub

'上移标题
Private Sub mnuUP_Click()
    lblTitle.Top = lblTitle.Top - 0.1
    lblTitle.Move lblTitle.Left, lblTitle.Top
End Sub

'自动拖放图题
'保存“图题”的标签的DragMode属性在属性窗口设置为1-Automatic
Private Sub pic_DragDrop(Source As Control, X As Single, Y As Single)
    Source.Move X, Y
End Sub

'数据行倒转
Private Sub mnuRow_Click()
    For I = 1 To intRow \ 2
        For J = 1 To intCol
            D = U(intRow - I + 1, J)
            U(intRow - I + 1, J) = U(I, J)
            U(I, J) = D
            D = V(J, intRow - I + 1)
            V(J, intRow - I + 1) = V(J, I)
            V(J, I) = D
        Next J
    Next I
End Sub

'数据列倒转
Private Sub mnuCol_Click()
    For I = 1 To intRow
        For J = 1 To intCol \ 2
            D = U(I, intCol - J + 1)
            U(I, intCol - J + 1) = U(I, J)
            U(I, J) = D
            D = V(intCol - J + 1, I)
            V(intCol - J + 1, I) = V(J, I)
            V(J, I) = D
        Next J
    Next I
End Sub

'常数处理
Private Sub mnuADD_Click()
    Dim sngAdd As Single
    sngAdd = InputBox("键入常数(正数或负数)")
    For I = 1 To intRow
        For J = 1 To intCol
            U(I, J) = U(I, J) + sngAdd
            V(J, I) = V(J, I) + sngAdd
        Next J
    Next I
End Sub

'因子处理
Private Sub mnuMul_Click()
    Dim sngMul As Single
    sngMul = InputBox("键入因子")
    For I = 1 To intRow
        For J = 1 To intCol
            U(I, J) = U(I, J) * sngMul
            V(J, I) = V(J, I) * sngMul
        Next J
    Next I
End Sub

'恢复原始数据
Private Sub mnuReNew_Click()
    For I = 1 To intRow
        For J = 1 To intCol
            U(I, J) = U1(I, J)
            V(J, I) = V1(J, I)
        Next J
    Next I
End Sub





⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -