VB模拟下雨

2024-01-20 00:59
文章标签 模拟 vb 下雨

本文主要是介绍VB模拟下雨,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

窗体代码如下:

Option Explicit


'视觉上看到的雨,可能是这样的:
'在近似位置反复看到雨丝,
'而不是完全杂乱无章,也不是看到同一个雨丝下落的全过程
'雨的颜色可能是浅灰色混合了背景色
'基于以上认识,用vb模拟下雨。


Dim tmItv As Long '定时器间隔毫秒,>0
Dim howMany As Integer '雨丝数量,≥0
Dim reNew As Single '每帧更新率,0到1的浮点数,比如0.15就是更新15%
Dim alP As Single '像素混合系数,0到1的浮点数,值越大、雨的颜色越接近背景色
Dim Swing As Integer '雨丝在两个相近位置“摆动”的幅度,≥0
Dim leNgth As Integer '雨丝的长度,>0
Dim angLe As Single '雨丝下落的角度,0到180
Dim preciSion As Single '位移的精度,0到1的浮点数,越大越精确


Dim angleHu As Single '雨丝下落的角度转换为弧度
Const PI = 3.14159265358979


Dim inputVar As String '输入的一组参数


Private Type Rain
  Rx As Long '雨丝line上端点的坐标
  Ry As Long
End Type


Dim rainArr() As Rain
Dim I As Integer


Private Sub Form_Load()
  
  '设计时给窗体指定了一个picture作为背景图片。只有一个定时器控件
  Form1.Caption = "It's raining outside...Click to set"
  '点击窗体,设置各参数
  Form1.ScaleMode = 1 '缇
  Form1.AutoRedraw = True
    
  tmItv = 200
  howMany = 300
  reNew = 0.2
  alP = 0.6
  Swing = 100
  leNgth = 250
  angLe = 60: angleHu = angLe * PI / 180
  preciSion = 0.8
  
  inputVar = CStr(tmItv) & "," & CStr(howMany) & "," & Format(CStr(reNew), "0.00") & "," & Format(CStr(alP), "0.00") & "," & CStr(Swing) & "," & CStr(leNgth) & "," & Format(CStr(angLe), "0.00") & "," & Format(CStr(preciSion), "0.00")
  
  Timer1.Interval = tmItv
  Timer1.Enabled = True
  Form1.ForeColor = RGB(180, 200, 200) '假定雨本身的颜色
  DrawWidth = 1


  ReDim rainArr(0 To howMany)
  Randomize
  For I = 0 To howMany
    rainArr(I).Rx = Int(Rnd * Form1.ScaleWidth)
    rainArr(I).Ry = Int(Rnd * Form1.ScaleHeight)
  Next 'I


End Sub


Private Sub Form_Click() '单击窗体设置参数
  Dim InputvarTemp As String
  InputvarTemp = InputBox(prompt:="请对现有各参数进行修改,依次是:" & vbCrLf & vbCrLf & "定时器、雨丝数量、每帧更新率、像素混合系数、幅度、长度、角度、精度," & vbCrLf & vbCrLf & "用西文逗号分隔", Title:="设置下雨参数", Default:=inputVar)
  
  If InputvarTemp <> "" Then
  '不检查输入值是否符合值域。如果设置不当、可能引起运行错误
    tmItv = Val(Split(InputvarTemp, ",")(0))
    howMany = Val(Split(InputvarTemp, ",")(1))
    reNew = Val(Split(InputvarTemp, ",")(2))
    alP = Val(Split(InputvarTemp, ",")(3))
    Swing = Val(Split(InputvarTemp, ",")(4))
    leNgth = Val(Split(InputvarTemp, ",")(5))
    angLe = Val(Split(InputvarTemp, ",")(6)): angleHu = angLe * PI / 180
    preciSion = Val(Split(InputvarTemp, ",")(7))
    
    Timer1.Interval = tmItv
    ReDim Preserve rainArr(0 To howMany)
    '如果增加了雨丝数量,默认坐标是0,0
    inputVar = CStr(tmItv) & "," & CStr(howMany) & "," & Format(CStr(reNew), "0.00") & "," & Format(CStr(alP), "0.00") & "," & CStr(Swing) & "," & CStr(leNgth) & "," & Format(CStr(angLe), "0.00") & "," & Format(CStr(preciSion), "0.00")
  End If
End Sub


Private Sub Timer1_Timer()
  Static N As Integer
  N = (N Mod 2) + 1
 
  Cls
  For I = 0 To howMany
    Randomize
    If Rnd < reNew Or (rainArr(I).Rx = 0 And rainArr(I).Ry = 0) Then
    '以指定的更新率随机‘消失’,在新位置出现
    '增加的雨丝数量也在随机位置出现,而不是窗体左上角
      rainArr(I).Rx = Int(Rnd * Form1.ScaleWidth)
      rainArr(I).Ry = Int(Rnd * Form1.ScaleHeight)
    Else
      '雨丝上端点平移:来回反复,四种方向,移动距离根据精度有微调
      ' xy
      '0++
      '1+-
      '2-+
      '3--
      rainArr(I).Rx = rainArr(I).Rx + Int((Swing * (2 - preciSion) - Swing * preciSion + 1) * Rnd + Swing * preciSion) * IIf(N = 1, 1, -1) * IIf((I Mod 4) < 2, 1, -1)
      rainArr(I).Ry = rainArr(I).Ry + Int((Swing * (2 - preciSion) - Swing * preciSion + 1) * Rnd + Swing * preciSion) * IIf(N = 1, 1, -1) * IIf(((I Mod 4) Mod 2) = 0, 1, -1)
    End If
   
    If Form1.Point(rainArr(I).Rx, rainArr(I).Ry) <> -1 Then
      Dim rmoD As Byte, gmoD As Byte, bmoD As Byte
      Call getRgbMod(Form1.Point(rainArr(I).Rx, rainArr(I).Ry), rmoD, gmoD, bmoD)
    
      '''混合颜色的伪代码
      '''
      '''dd = 颜色1
      '''ss = 颜色2
      '''aa=混合度(0-1的浮点数)
      '''
      '''dr = GetRValue(dd)
      '''dg = GetGValue(dd)
      '''db = GetBValue(dd)
      '''
      '''sr = GetRValue(ss)
      '''sg = GetGValue(ss)
      '''sb = GetBValue(ss)
      '''
      '''nr = dr * aa + sr * (1 - aa)
      '''ng = dg * aa + sg * (1 - aa)
      '''nb = db * aa + sb * (1 - aa)
      '''
      '''合成后的颜色 = RGB(nr, ng, nb)
    
      Form1.ForeColor = RGB(rmoD * alP + 180 * (1 - alP), gmoD * alP + 200 * (1 - alP), bmoD * alP + 200 * (1 - alP))
    Else
      Form1.ForeColor = RGB(180, 200, 200)
    End If
  
    Line (rainArr(I).Rx, rainArr(I).Ry)-(rainArr(I).Rx + Int((leNgth * Cos(angleHu) * (2 - preciSion) - leNgth * Cos(angleHu) * preciSion + 1) * Rnd + leNgth * Cos(angleHu) * preciSion), rainArr(I).Ry + Int((leNgth * Sin(angleHu) * (2 - preciSion) - leNgth * Sin(angleHu) * preciSion + 1) * Rnd + leNgth * Sin(angleHu) * preciSion))
    'line方法画雨丝,长度和角度根据精度有微调(即调整下端点的坐标)
  
  Next 'I
End Sub


Sub getRgbMod(ByVal ColoR As Long, Optional ByRef GetR As Byte, _
  Optional ByRef GetG As Byte, Optional ByRef GetB As Byte)
  '分解r、g、b
  GetR = ColoR Mod &H100 '等于十进制256
  GetG = (ColoR \ &H100) Mod &H100 '等于十进制256
  GetB = (ColoR \ &H10000) Mod &H100 '等于十进制65536 256
End Sub

这篇关于VB模拟下雨的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/624297

相关文章

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

hdu4431麻将模拟

给13张牌。问增加哪些牌可以胡牌。 胡牌有以下几种情况: 1、一个对子 + 4组 3个相同的牌或者顺子。 2、7个不同的对子。 3、13幺 贪心的思想: 对于某张牌>=3个,先减去3个相同,再组合顺子。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOExcepti

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

【算法专场】模拟(下)

目录 前言 38. 外观数列 算法分析 算法思路 算法代码 1419. 数青蛙 算法分析 算法思路 算法代码  2671. 频率跟踪器 算法分析 算法思路 算法代码 前言 在前面我们已经讲解了什么是模拟算法,这篇主要是讲解在leetcode上遇到的一些模拟题目~ 38. 外观数列 算法分析 这道题其实就是要将连续且相同的字符替换成字符重复的次数+

模拟实现vector中的常见接口

insert void insert(iterator pos, const T& x){if (_finish == _endofstorage){int n = pos - _start;size_t newcapacity = capacity() == 0 ? 2 : capacity() * 2;reserve(newcapacity);pos = _start + n;//防止迭代

PHP实现二叉树遍历(非递归方式,栈模拟实现)

二叉树定义是这样的:一棵非空的二叉树由根结点及左、右子树这三个基本部分组成,根据节点的访问位置不同有三种遍历方式: ① NLR:前序遍历(PreorderTraversal亦称(先序遍历)) ——访问结点的操作发生在遍历其左右子树之前。 ② LNR:中序遍历(InorderTraversal) ——访问结点的操作发生在遍历其左右子树之中(间)。 ③ LRN:后序遍历(PostorderT

1 模拟——67. 二进制求和

1 模拟 67. 二进制求和 给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。 示例 1:输入:a = "11", b = "1"输出:"100"示例 2:输入:a = "1010", b = "1011"输出:"10101" 算法设计 可以从低位到高位(从后向前)计算,用一个变量carry记录进位,如果有字符没处理完或者有进位,则循环处理。两个字符串对

用VB创建开始菜单快捷方式(无需其他DLL)

Option Explicit   Private Sub Command1_Click()   CreateProgManGroup Me, "测试", "test.grp"   CreateProgManItem Me, "d:\ghost.exe", "Ghost"   CreateProgManItem Me, "d:\setupQQ.exe", "QQ"   End