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

📄 大摆角有阻尼的摆.frm

📁 一个大摆脚有阻尼的单摆的物理演示vb源程序
💻 FRM
📖 第 1 页 / 共 2 页
字号:
         Caption         =   "0.1"
         BeginProperty Font 
            Name            =   "宋体"
            Size            =   10.5
            Charset         =   134
            Weight          =   400
            Underline       =   0   'False
            Italic          =   0   'False
            Strikethrough   =   0   'False
         EndProperty
         ForeColor       =   &H000000FF&
         Height          =   315
         Left            =   1410
         TabIndex        =   7
         Top             =   2220
         Width           =   645
      End
   End
   Begin VB.Line Line4 
      BorderColor     =   &H0000FF00&
      X1              =   6450
      X2              =   6450
      Y1              =   30
      Y2              =   3230
   End
   Begin VB.Line Line3 
      BorderColor     =   &H0000FF00&
      X1              =   6450
      X2              =   12000
      Y1              =   1590
      Y2              =   1590
   End
   Begin VB.Line Line2 
      BorderColor     =   &H0080FFFF&
      BorderStyle     =   3  'Dot
      X1              =   2940
      X2              =   2940
      Y1              =   2340
      Y2              =   840
   End
   Begin VB.Image Image1 
      Appearance      =   0  'Flat
      Height          =   540
      Left            =   2790
      Picture         =   "大摆角有阻尼的摆.frx":002B
      Top             =   7260
      Width           =   540
   End
   Begin VB.Menu showMnu 
      Caption         =   "showMnu"
      Visible         =   0   'False
      Begin VB.Menu readMe 
         Caption         =   "课件说明…"
      End
      Begin VB.Menu about 
         Caption         =   "关于本课件…"
      End
      Begin VB.Menu k1 
         Caption         =   "-"
      End
      Begin VB.Menu showLine 
         Caption         =   "显示振动图线"
         Checked         =   -1  'True
      End
      Begin VB.Menu change 
         Caption         =   "显示参数与命令对话框"
         Checked         =   -1  'True
      End
      Begin VB.Menu k2 
         Caption         =   "-"
      End
      Begin VB.Menu exitThis 
         Caption         =   "退出程序"
      End
   End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit
   Const PI As Single = 3.1415926
   Const g As Single = 9.8                    '重力加速度,单位:米/秒/秒
   Const k As Single = 3000  '摆长的换算系数,将缇换算为米,3000缇代表一米
   Const x00 As Single = 6450, y00 As Single = 1590   '图线坐标原点
   Const h As Single = 1590, w As Single = 5550       '图线高和宽
   Const s As Single = 150, f As Single = 1600        '图线的疏密度与幅度
   Public noStart As Boolean                          '运动未开始标记
   Public x000 As Single, y000 As Single              '图线绘图坐标
   Public flage As Integer                     '初始位置,=1在右,=-1在左
   Public x0 As Integer, y0 As Integer         '坐标原点
   Public xx As Integer, yy As Integer         '保存鼠标坐标
   Public t As Double                          '时间计数器
   Public b As Single                          '阻尼系数
   Public l As Single, l0 As Single    '以米为单位的摆长和以缇为单位的摆长
   Public p As Single                  '判别式
   Public p1 As Single, p2 As Single   '中间变量
   Public r1 As Single, r2 As Single   '中间变量
   Public j0 As Single, j As Single    '最大摆幅角和摆角
   Public x1 As Single, y1 As Single   '绘图用
   
Sub compute()                          '计算绘图程序
   t = t + Timer1.Interval / 1000      '以秒为单位
   l = l0 / k                          '摆长,以米为单位
   b = HScroll1.Value / 100            '取得阻尼系数
   'b= Sqr(g * l) / 5                  '若用此行,强制成临界阻尼
   p = 100 * b * b / l / l - 4 * g / l '判别式
   p2 = -5 * b / l                     '根的一部分
   If p < 0 Then                       '虚根,振动解
      p1 = Sqr(-p) / 2
      j = flage * j0 * Exp(p2 * t) * Cos(p1 * t)      '摆角
   ElseIf p = 0 Then                                  '二重根
      j = flage * j0 * Exp(-p2 * t) * (1 + p2 * t)    '摆角
   Else                                               '两个不相等的实根
      p1 = Sqr(p)
      r1 = p2 + p1 / 2                                '两个特征根
      r2 = p2 - p1 / 2
      j = flage * j0 * ((1 - r1 / p1) * Exp(r1 * t) + _
         r1 / p1 * Exp(r2 * t))                       '摆角
   End If
   Form1.Line (x0, y0)-(x1, y1), Form1.BackColor      '擦除原来的摆线
   x1 = x0 + l0 * Sin(j)                              '新摆线坐标
   y1 = y0 + l0 * Cos(j)
   Image1.Left = x1 - Image1.Width / 2                '移动摆球
   Image1.Top = y1 - Image1.Height / 2
   Form1.Line (x0, y0)-(x1, y1), vbRed                '画新摆线
   If t = Timer1.Interval / 1000 Then    '第一个线段,特殊处理
      CurrentX = x00                     '起点坐标
      CurrentY = y00 - f
   Else
      CurrentX = x000
      CurrentY = y000
   End If
   '绘制振动图线
   If showLine.Checked Then              '只有允许画图线时才画
      Form1.Line -(x00 + s * t, y00 - f * j / j0), vbYellow '画图线
   End If
   x000 = x00 + s * t                    '保存终点坐标
   y000 = y00 - f * j / j0
   Label5.Caption = CStr(j * 180 / PI)   '显示摆角(度)
End Sub

Private Sub about_Click()
   Dim say As String
   say = say + "“大摆角有阻尼的摆”课件" + Chr(13) + Chr(13)
   say = say + "制作:毕广吉" + Chr(13)
   say = say + "天津师范大学物理与电子信息学院" + Chr(13)
   say = say + "2001年7月" + Chr(13)
   say = MsgBox(say, vbOKOnly, "关于“大摆角有阻尼的摆”课件")
End Sub

Private Sub Check1_Click()               '强制
   If Check1.Value = 1 Then
      HScroll1.Enabled = True            '滚动条可用
      HScroll1.Value = 100 * Sqr(g * l) / 5  '设定滚动条为临界阻尼的值
      Label1.Caption = HScroll1.Value / 100  '显示
      Check1.Enabled = False             '本复选钮不可用
      HScroll1.Enabled = False           '滚动条不可用
   Else
      HScroll1.Enabled = True            '滚动条可用
   End If
End Sub

Private Sub change_Click()               '显示/隐去修改参数对话框
   change.Checked = Not change.Checked   '对钩取反
   Frame1.Visible = change.Checked       '是否显示修改参数对话框
End Sub

Private Sub Command1_Click()             '“开始”按钮处理
   j0 = Atn(Abs((x1 - x0) / (y1 - y0)))  '摆角最大值
   If showLine.Checked Then              '如果显示振动图线
      Line3.x1 = x00                     '各坐标轴位置
      Line3.X2 = x00 + w
      Line3.y1 = h
      Line3.Y2 = h
      Line4.x1 = x00
      Line4.X2 = x00
      Line4.y1 = 0
      Line4.Y2 = h * 2
   End If
   x000 = x00                            '绘图始点
   y000 = y00
   Timer1.Enabled = True                 '打开定时器
   Command1.Enabled = False              '“开始”按钮不可用
   Command2.Enabled = True               '“单步”按钮可用
   Command3.Enabled = True               '“暂停”按钮可用
   Check1.Enabled = False                '强制临界阻尼不可用
   noStart = False                       '运动已开始
   t = 0                                 '时间初值,以秒为单位
End Sub

Private Sub Command2_Click()             '“单步”按钮处理
   Timer1.Enabled = False                '关闭定时器
   Command3.Caption = "继续"             '改变“暂停”按钮标题
   Call compute                          '计算,绘图
End Sub

Private Sub Command3_Click()             '“暂停”按钮处理
   Timer1.Enabled = Not Timer1.Enabled   '定时器可用性取反
   Command3.Caption = IIf(Timer1.Enabled, "暂停", "继续")  '改变“暂停”按钮标题
End Sub

Private Sub Command4_Click()             '“退出”按钮处理
   End
End Sub

Private Sub exitThis_Click()             '“退出”菜单处理
   End
End Sub

Private Sub Form_Load()
   Timer1.Interval = 50                  '此参数影响刷新曲线的时间间隔,单位:毫秒
   Form1.Left = 0                        '以下四行决定窗体位置和大小
   Form1.Top = 0
   Form1.Width = Screen.Width
   Form1.Height = Screen.Height
   x0 = Frame2.Left + Frame2.Width / 2   '计算坐标原点
   y0 = Frame2.Top + Line1.y1
   Image1.Left = x0 - Image1.Width / 2   '安放摆球
   Image1.Top = 7600
   Line2.x1 = x0                         '安放法线
   Line2.X2 = x0
   Form1.DrawWidth = 2                   '画线宽度
   Form1.Line (x0, y0)-(Image1.Left + Image1.Width / 2, _
   Image1.Top + Image1.Height / 2), vbRed  '画初始摆线
   HScroll1.Value = 0                    '阻尼初始值
   Label1.Caption = HScroll1.Value / 100 '显示阻尼值
   Frame1.Visible = change.Checked       '修改参数面板的可见性
   l0 = Image1.Top + Image1.Height       '以缇为单位的摆长
   l = l0 / k                            '以米为单位的摆长
   Label3.Caption = CStr(l)              '显示摆长
   Label4.Caption = CStr(2 * PI * Sqr(l / g))  '显示周期
   Label5.Caption = "0"                  '显示摆角
   Timer1.Enabled = False                '关闭定时器
   Check1.Enabled = False                '强制临界阻尼不可用
   noStart = True                        '运动未开始标记
End Sub

Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
   If Button = 2 Then                    '如果右击
      Form1.PopupMenu showMnu            '弹出快捷菜单
   End If
End Sub

Private Sub Frame1_Click()               '单击修改参数面板,隐去
   change.Checked = False
   Frame1.Visible = False
End Sub

Private Sub HScroll1_Change()            '水平滚动条改变处理
   Label1.Caption = HScroll1.Value / 100 '显示值
End Sub

Private Sub HScroll1_Scroll()            '滚动条滚蛋处理
   Label1.Caption = HScroll1.Value / 100
End Sub

Private Sub Image1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
   If Button = 1 And noStart Then                    '拖动摆球处理
      x1 = Image1.Left + Image1.Width / 2
      y1 = Image1.Top + Image1.Height / 2
      Image1.Left = Image1.Left + X - Image1.Width / 2   '拖动后摆球位置
      Image1.Top = Image1.Top + Y - Image1.Height / 2
      If Image1.Top < y0 - Image1.Height / 2 Then        '限制摆球位置范围
         Image1.Top = y0 - Image1.Height / 2
      End If
      Form1.Line (x0, y0)-(x1, y1), Form1.BackColor      '擦掉原来的摆线
      x1 = Image1.Left + Image1.Width / 2                '摆球新坐标
      y1 = Image1.Top + Image1.Height / 2
      Form1.Line (x0, y0)-(x1, y1), vbRed                '画摆线
      flage = IIf(x1 > x0, 1, -1)         '标记摆球的初始位置,=1在右,=-1在左
      l0 = Sqr((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0))  '新摆长
      l = l0 / k                          '以米为单位的摆长
      Label3.Caption = CStr(l0 / k)                            '显示摆长
      Label4.Caption = CStr(2 * PI * Sqr(l0 / k / g))          '显示周期
      Label5.Caption = Atn((x1 - x0) / (y1 - y0)) * 180 / PI   '显示初始摆角
      Command1.Enabled = True                             '“开始”按钮可用
      Check1.Enabled = True                               '强制临界阻尼可用
   End If
End Sub

Private Sub readMe_Click()
   Dim say As String
   say = say + "1.从快捷菜单中选择是否显示振动图线。" + Chr(13)
   say = say + "2.从快捷菜单中选择是否显示“参数与命令”对话框。" + Chr(13)
   say = say + "3.拖动摆球至初始位置,此时“开始”按钮可用。" + Chr(13)
   say = say + "4.通过滑动条调整阻尼的大小。" + Chr(13)
   say = say + "5.单击“开始”按钮,摆开始振动。此时仍可通过滑" + Chr(13)
   say = say + "  动条调整阻尼的大小。 " + Chr(13)
   say = say + "6.单击“单步”按钮以后,每一次单击前进一步。若" + Chr(13)
   say = say + "  要继续,应单击“继续”按钮" + Chr(13)
   say = say + "7.单击“暂停”按钮后程序暂停,若要继续,应单击" + Chr(13)
   say = say + "  “继续”按钮。" + Chr(13)
   say = say + "8.调整参数和摆球运动时,在“参数与命令”对话框" + Chr(13)
   say = say + "  中动态显示各参数。" + Chr(13)
   say = MsgBox(say, vbOKOnly, "“大摆角有阻尼的摆”课件使用说明:")
End Sub

Private Sub showLine_Click()                    '显示图线菜单处理
   showLine.Checked = Not showLine.Checked      '显示图线标记取反
   Line3.Visible = showLine.Checked             '图线坐标轴的可见性
   Line4.Visible = showLine.Checked
   If Not showLine.Checked Then                 '如果隐去绘图区
      Form1.Line (x00 - 10, 0)-(x00 + w + 10, h * 2), 0, BF  '遮盖绘图区
   End If
End Sub

Private Sub Timer1_Timer()       '定时器处理
   Call compute                  '计算绘图
End Sub

⌨️ 快捷键说明

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