找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 4530|回复: 3

【VB】模拟电弧- -

[复制链接]
发表于 2015-3-1 20:23:23 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
20150301195803.png
代码没什么用。纯属娱乐。
事实上这个并不太科学。就是看起来像而已。加上音效也许更像了。
电弧的幅度可以调整。因此可以用作音乐电平显示。
  1. VERSION 5.00
  2. Begin VB.Form frmMain
  3.    AutoRedraw      =   -1  'True
  4.    BackColor       =   &H00000000&
  5.    Caption         =   "模拟电弧"
  6.    ClientHeight    =   1320
  7.    ClientLeft      =   120
  8.    ClientTop       =   450
  9.    ClientWidth     =   2685
  10.    ForeColor       =   &H0000FF00&
  11.    LinkTopic       =   "ElecBolt"
  12.    ScaleHeight     =   88
  13.    ScaleMode       =   3  'Pixel
  14.    ScaleWidth      =   179
  15.    StartUpPosition =   3  '窗口缺省
  16. End
  17. Attribute VB_Name = "frmMain"
  18. Attribute VB_GlobalNameSpace = False
  19. Attribute VB_Creatable = False
  20. Attribute VB_PredeclaredId = True
  21. Attribute VB_Exposed = False
  22. Option Explicit

  23. Private Type PointType
  24.     X As Single
  25.     Y As Single
  26. End Type

  27. Dim Pos As PointType
  28. Dim Neg As PointType

  29. Dim MovingPos As Boolean
  30. Dim MovingNeg As Boolean

  31. Private Const PosRadius = 5
  32. Private Const NegRadius = 5

  33. Private Const Pi = 3.14159265358979

  34. Private Sub Form_Load()
  35. Randomize Timer
  36. Show

  37. Neg.X = ScaleWidth * 0.1
  38. Neg.Y = ScaleHeight / 2
  39. Pos.X = ScaleWidth * 0.9
  40. Pos.Y = Neg.Y


  41. Do
  42.     Cls
  43.     Circle (Pos.X, Pos.Y), PosRadius
  44.     Circle (Neg.X, Neg.Y), NegRadius
  45.     DrawBolt Neg.X, Neg.Y, Pos.X, Pos.Y, 0.7 '这个数值越大,电弧越扭曲,数值到1时电弧因为过于扭曲无法走到终点。
  46. Loop While DoEvents
  47. End Sub

  48. Function GenBoltColor() As Long
  49. Dim R!, G!, B!
  50. R = Rnd
  51. B = Rnd
  52. G = (R + B) * Rnd * 0.5
  53. GenBoltColor = RGB(R * 255, G * 255, B * 255)
  54. End Function

  55. Sub DrawBolt(ByVal StartX!, ByVal StartY!, ByVal EndX!, ByVal EndY!, ByVal Motion!)
  56. Dim X!, Y! '当前位置

  57. Dim Dist! '距离

  58. Dim DirX!, DirY!, DirD! '目标方向、距离
  59. Dim Angle! '转向的角度
  60. Dim M11!, M12! '转向矩阵
  61. Dim M21!, M22!
  62. Dim NewX!, NewY! '新的坐标

  63. Dim StepLen! '步长

  64. DirX = EndX - StartX
  65. DirY = EndY - StartY
  66. Dist = Sqr(DirX * DirX + DirY * DirY)
  67. StepLen = Dist * 0.001 '最大步长,以距离来算。用于适当减少函数运行时间
  68. If StepLen < 1 Then StepLen = 1 '步长小于1个像素时,以1个像素为步长

  69. X = StartX
  70. Y = StartY

  71. Do
  72.     DirX = EndX - X
  73.     DirY = EndY - Y
  74.     DirD = Sqr(DirX * DirX + DirY * DirY)
  75.     If DirD <= StepLen Then Exit Do '距离低于步长则结束
  76.    
  77.     DirX = DirX / DirD
  78.     DirY = DirY / DirD

  79.     '偏离方向的角度
  80.     Angle = (Rnd * 2 - 1) * Pi * Motion

  81.     DirD = StepLen * Rnd
  82.     If DirD < 1 Then DirD = 1
  83.     If DirD > 4 Then DirD = 4
  84.     M11 = Cos(Angle) * DirD
  85.     M12 = Sin(Angle) * DirD
  86.     M21 = -M12
  87.     M22 = M11
  88.    
  89.     NewX = DirX * M11 + DirY * M21 + X
  90.     NewY = DirX * M12 + DirY * M22 + Y
  91.    
  92.     Line (X, Y)-(NewX, NewY), GenBoltColor
  93.     X = NewX
  94.     Y = NewY
  95. Loop
  96. Line (X, Y)-(EndX, EndY), GenBoltColor
  97. End Sub

  98. Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  99. Dim Dist!, DistX!, DistY!
  100. If Button And 1 Then
  101.     DistX = X - Pos.X
  102.     DistY = Y - Pos.Y
  103.     Dist = Sqr(DistX * DistX + DistY * DistY)
  104.    
  105.     If Dist < PosRadius Then
  106.         MovingPos = True
  107.         GoTo NoMoreMoving
  108.     End If

  109.     DistX = X - Neg.X
  110.     DistY = Y - Neg.Y
  111.     Dist = Sqr(DistX * DistX + DistY * DistY)
  112.    
  113.     If Dist < NegRadius Then
  114.         MovingNeg = True
  115.         GoTo NoMoreMoving
  116.     End If
  117.    
  118. NoMoreMoving:
  119. End If
  120. End Sub

  121. Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  122. If Button And 1 Then
  123.     If MovingPos Then
  124.         Pos.X = X
  125.         Pos.Y = Y
  126.     End If
  127.     If MovingNeg Then
  128.         Neg.X = X
  129.         Neg.Y = Y
  130.     End If
  131. End If
  132. End Sub

  133. Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
  134. MovingPos = False
  135. MovingNeg = False
  136. End Sub
复制代码
BIN: ElecBolt.exe (23.59 KB, 下载次数: 13)
SRC: ElecBolt.7z (7.83 KB, 下载次数: 11)

本帖被以下淘专辑推荐:

回复

使用道具 举报

发表于 2015-7-31 00:59:06 | 显示全部楼层
这个挺好玩!
回复 赞! 靠!

使用道具 举报

发表于 2020-7-8 14:19:10 | 显示全部楼层
本帖最后由 china_shy_wzb 于 2020-7-20 14:05 编辑

这个挺好玩!,学习了
回复 赞! 靠!

使用道具 举报

发表于 2022-5-9 16:15:00 | 显示全部楼层

正需要,支持楼主大人了!
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-12-22 12:07 , Processed in 0.038494 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表