Броуновское движение (отталкивание рандомных частиц друг от друга и заданных границ) - VB

Узнай цену своей работы

Формулировка задачи:

Пожалуйста помогите с написанием программы по Броуновскому движению суть в создании макета движения частит от заданной точки, в пределах экрана, движения должны быть хаотичными и цвета частиц разными, частицы должны быть абсолютно упругими и отталкиваться либо от столкновения с другими частицами либо от ударов об углы монитора. Нужно построить траектории движения частиц. Очень нужно на проект заранее спасибо.

Решение задачи: «Броуновское движение (отталкивание рандомных частиц друг от друга и заданных границ)»

textual
Листинг программы
  1. Option Explicit
  2.  'X направлен вниз (совпадает с Top, Height)
  3. 'Y -------- влево (----------- Left, Width)
  4.  
  5.  Const kv As Double = 0.999 'потеря энергии при ударе
  6. Const dV As Double = 0.001 'потеря скорости в очередном Timer1_Timer()
  7.  
  8.  Const N As Long = 15
  9.  Const D As Double = 40
  10.  Const TI As Long = 10
  11.  Const Z As Double = 1.000001
  12.  
  13.  Dim meWidth As Double, meHeight As Double
  14.  Dim meWidthOld As Double, meHeightOld As Double
  15.  Dim a_VX(N) As Double
  16.  Dim a_VY(N) As Double
  17.  Dim a_V(N) As Double
  18.  Dim a_X(N) As Double, a_Y(N) As Double
  19.  Dim TN As Double, TN0 As Double, tik As Long
  20.  Dim II As Integer, JJ As Integer
  21.  Dim vXij As Double, vYij As Double
  22.  Dim xI As Double, yI As Double, xRel As Double, yRel As Double, xJ As Double, yJ As Double
  23.  
  24.  Private Sub Form_Load()
  25.  Dim x1 As Double, y1 As Double, x2 As Double, y2 As Double, X As Double, Y As Double, xn As Double, yn As Double
  26.  Dim I As Integer, J As Integer
  27.  Timer1.Enabled = False
  28.  Me.BorderStyle = 1
  29.  Me.Left = 0
  30.  Me.Top = 0
  31.  Me.Height = 9480
  32.  Me.Width = 18090
  33.  Me.ScaleMode = 3
  34.  Me.BackColor = vbGreen / 1.5
  35.  Shape1(0).Height = D
  36.  Shape1(0).Width = D
  37.  Shape1(0).Shape = 3 '2
  38. Shape1(0).BackStyle = 1
  39.  Shape1(0).BackColor = vbYellow
  40.  Shape1(0).BorderColor = vbYellow
  41.  a_X(0) = Me.ScaleHeight / 2
  42.  Shape1(0).Top = a_X(0)
  43.  a_Y(0) = 0
  44.  Shape1(0).Left = a_Y(0)
  45.  a_VX(0) = 0
  46.  a_VY(0) = 10
  47.  a_V(0) = Sqr(a_VX(0) * a_VX(0) + a_VY(0) * a_VY(0))
  48.  Y = Me.ScaleWidth / 2 - 3 * D
  49.  Do
  50.    X = Me.ScaleHeight / 2 - J * D * Z / 2
  51.    For J = 0 To J
  52.      I = I + 1
  53.      Load Shape1(I)
  54.      With Shape1(I)
  55.       .Visible = True
  56.       .Shape = 3
  57.       .Width = D
  58.       .Height = D
  59.       a_X(I) = X
  60.       .Top = a_X(I)
  61.       a_Y(I) = Y
  62.       .Left = a_Y(I)
  63.      End With
  64.      
  65.      If I > N Then Exit For
  66.      X = X + D * Z
  67.    Next J
  68.    Y = Y + D * Z * Sqr(3) / 2
  69.  Loop While I < N
  70.  
  71.  For I = N + 1 To N + 6
  72.    Load Shape1(I)
  73.    With Shape1(I)
  74.      .Visible = True
  75.      .Shape = 4
  76.      .BackColor = vbGreen / 2
  77.      .BorderColor = vbBlack
  78.      If I <= N + 2 Then
  79.        .Width = D * 4
  80.        .Height = Me.ScaleHeight - 2 * D
  81.        .Top = D
  82.        .Left = -D * 3.5 - (I = N + 2) * (Me.ScaleWidth + D * 3)
  83.      Else
  84.        .Width = Me.ScaleWidth / 2 - D * 1.5
  85.        .Height = D * 4
  86.        If I <= N + 4 Then
  87.          .Top = -3.5 * D
  88.          .Left = D - (I = N + 4) * (Me.ScaleWidth / 2 - D / 2)
  89.        Else
  90.          .Top = -D * 3.5 + (Me.ScaleHeight + D * 3)
  91.          .Left = D - (I = N + 6) * (Me.ScaleWidth / 2 - D / 2)
  92.        End If
  93.      End If
  94.    End With
  95.  
  96.  Next I
  97.  
  98.  near_Bac
  99.  Timer1_Timer
  100.  Timer1.Enabled = True
  101.  End Sub
  102.  
  103.  Sub near_Bac()
  104.  Dim I As Integer, J As Integer, T As Double
  105.  Dim V As Double, xn As Double, yn As Double
  106.  Dim dX As Double, dY As Double
  107.  
  108.  TN = 1.79769313486231E+308
  109.  For I = 0 To N - 1
  110.    For J = I + 1 To N
  111.      vXij = a_VX(J) - a_VX(I)
  112.      vYij = a_VY(J) - a_VY(I)
  113.      If vXij <> 0 Or vYij <> 0 Then
  114.        T = 1.79769313486231E+308
  115.        dX = a_X(I) - a_X(J)
  116.        dY = a_Y(I) - a_Y(J)
  117.        V = Sqr(vXij * vXij + vYij * vYij)
  118.        yn = (dX * vYij - vXij * dY) / V
  119.        If Abs(yn) <= D Then
  120.          xn = (dX * vXij + vYij * dY) / V
  121.          If xn >= 0 Then T = (xn - Sqr(D * D - yn * yn)) / V
  122.        End If
  123.        If T < TN Then
  124.          TN = T: II = I: JJ = J
  125.        End If
  126.      End If
  127.    Next J
  128.  Next I
  129.  For I = 0 To N
  130.    If a_VX(I) > 0 Then
  131.      T = (Me.ScaleHeight - a_X(I) - D * 1.5) / a_VX(I): If T < TN Then II = I: JJ = -1: TN = T
  132.    ElseIf a_VX(I) < 0 Then
  133.      T = (D / 2 - a_X(I)) / a_VX(I): If T < TN Then II = I: JJ = -1: TN = T
  134.    End If
  135.    If a_VY(I) > 0 Then
  136.      T = (Me.ScaleWidth - a_Y(I) - D * 1.5) / a_VY(I): If T < TN Then II = I: JJ = -2: TN = T
  137.    ElseIf a_VY(I) < 0 Then
  138.      T = (D / 2 - a_Y(I)) / a_VY(I): If T < TN Then II = I: JJ = -2: TN = T
  139.    End If
  140.  Next I
  141.  If TN < 0 Then TN = 0
  142.  TN0 = TN
  143.  tik = 0
  144.  End Sub
  145.  
  146.  Private Sub Timer1_Timer()
  147.  Dim I As Long
  148.  Dim K As Double, dX As Double, dY As Double
  149.  Dim VIR As Double, VJR As Double
  150.  Do
  151.    If TN < 1 Then
  152.        For I = 0 To N
  153.          a_Y(I) = a_Y(I) + a_VY(I) * TN: Shape1(I).Left = a_Y(I)
  154.          a_X(I) = a_X(I) + a_VX(I) * TN: Shape1(I).Top = a_X(I)
  155.          If a_V(I) > 0 Then
  156.            K = (a_V(I) - TN0 * dV) / a_V(I): If K < 0 Then K = 0
  157.            a_V(I) = a_V(I) * K
  158.            a_VX(I) = a_VX(I) * K
  159.            a_VY(I) = a_VY(I) * K
  160.          End If
  161.        Next I
  162.        Select Case JJ
  163.          Case -1: a_VX(II) = -a_VX(II) * kv: a_VY(II) = a_VY(II) * kv
  164.          Case -2: a_VY(II) = -a_VY(II) * kv: a_VX(II) = a_VX(II) * kv
  165.          Case Else
  166.            dX = (a_X(II) - a_X(JJ)) / D
  167.            dY = (a_Y(II) - a_Y(JJ)) / D
  168.            vXij = a_VX(JJ) - a_VX(II)
  169.            vYij = a_VY(JJ) - a_VY(II)
  170.            VIR = (dY * vYij + dX * vXij)
  171.            VJR = (dX * vYij - vXij * dY)
  172.            a_VX(JJ) = (a_VX(II) - VJR * dY) * kv
  173.            a_VY(JJ) = (a_VY(II) + VJR * dX) * kv
  174.            a_VX(II) = (a_VX(II) + VIR * dX) * kv
  175.            a_VY(II) = (a_VY(II) + VIR * dY) * kv
  176.            a_V(II) = Sqr(a_VX(II) * a_VX(II) + a_VY(II) * a_VY(II))
  177.            a_V(JJ) = Sqr(a_VX(JJ) * a_VX(JJ) + a_VY(JJ) * a_VY(JJ))
  178.        End Select
  179.        near_Bac
  180.    Else
  181.      For I = 0 To N
  182.        a_Y(I) = a_Y(I) + a_VY(I): Shape1(I).Left = a_Y(I)
  183.        a_X(I) = a_X(I) + a_VX(I): Shape1(I).Top = a_X(I)
  184.      Next I
  185.      TN = TN - 1
  186.    End If
  187.    If TN < 1 Then
  188.      Timer1.Interval = TN * TI
  189.      Me.Caption = Timer1.Interval
  190.    Else
  191.      Timer1.Interval = TI
  192.    End If
  193.  Loop While Timer1.Interval = 0
  194.  End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.833 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы