Guest User

Stress Simulator

a guest
May 1st, 2012
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VB.NET 7.40 KB | None | 0 0
  1. Public Class Main
  2.  
  3.     Dim logicarray(64, 48, 1) As Decimal '0=type 1=value
  4.     Dim q_exit As Boolean = False
  5.     Dim display As New Bitmap(640, 480)
  6.     Dim displaybuffer As Graphics = Graphics.FromImage(display)
  7.     Dim q_mousedown As Boolean = False
  8.     Dim mp As Point
  9.     Dim chronometer As New Stopwatch
  10.     Dim chronometer2 As New Stopwatch
  11.     Dim last As Integer
  12.     Dim ttr As Integer
  13.     Dim count As Integer
  14.  
  15.     Private Sub Main_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
  16.         q_exit = True
  17.     End Sub
  18.  
  19.     Private Sub Main_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  20.  
  21.     End Sub
  22.  
  23.     Private Sub Main_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
  24.         chronometer.Start()
  25.         Do Until q_exit = True
  26.             logic()
  27.             draw()
  28.             Application.DoEvents()
  29.             GC.Collect()
  30.         Loop
  31.     End Sub
  32.  
  33.     Sub logic()
  34.         If q_mousedown = True Then
  35.             If rb_base.Checked = True Then
  36.                 logicarray(mp.X, mp.Y, 0) = 2
  37.                 logicarray(mp.X, mp.Y, 1) = 0
  38.             End If
  39.             If rb_metal.Checked = True Then
  40.                 logicarray(mp.X, mp.Y, 0) = 1
  41.                 logicarray(mp.X, mp.Y, 1) = 0
  42.             End If
  43.             If rb_eraser.Checked = True Then
  44.                 logicarray(mp.X, mp.Y, 0) = 0
  45.                 logicarray(mp.X, mp.Y, 1) = 0
  46.             End If
  47.         End If
  48.  
  49.         If chronometer.ElapsedMilliseconds > last + 20 Then
  50.  
  51.             If cb_processing.Checked = True Then
  52.                 count = 0
  53.                 chronometer2.Start()
  54.                 If cb_step.Checked = True Then cb_processing.Checked = False
  55.                 'DO PROCESSING HERE
  56.                 For x As Integer = 1 To 62
  57.                     For y As Integer = 1 To 46
  58.                         If logicarray(x, y, 0) = 1 Then 'is metal?
  59.                             count += 1
  60.                             'Spread stress
  61.                             Dim totalsplit As Integer = 1
  62.                             If logicarray(x + 1, y, 0) = 1 Then totalsplit += 1
  63.                             If logicarray(x, y - 1, 0) = 1 Then totalsplit += 1
  64.                             If logicarray(x - 1, y, 0) = 1 Then totalsplit += 1
  65.                             If logicarray(x, y + 1, 0) = 1 Then totalsplit += 2
  66.  
  67.                             Dim valuesplit = logicarray(x, y, 1) / totalsplit
  68.                             logicarray(x + 1, y, 1) += valuesplit
  69.                             logicarray(x, y - 1, 1) += valuesplit
  70.                             logicarray(x - 1, y, 1) += valuesplit
  71.                             logicarray(x, y + 1, 1) += (valuesplit * 2)
  72.                             logicarray(x, y, 1) = valuesplit
  73.  
  74.                         End If
  75.                     Next
  76.                 Next
  77.  
  78.                 For x As Integer = 1 To 62
  79.                     For y As Integer = 1 To 46
  80.                         If logicarray(x, y, 0) = 2 Then 'is base?
  81.                             If logicarray(x, y - 1, 0) = 1 Then
  82.                                 logicarray(x, y - 1, 1) -= 50 'minus 5
  83.                                 If logicarray(x, y - 1, 1) <= 0 Then 'Below minimum?
  84.                                     logicarray(x, y - 1, 1) = 0
  85.                                 End If
  86.                             End If
  87.                         End If
  88.                     Next
  89.                 Next
  90.  
  91.                 For x As Integer = 1 To 62
  92.                     For y As Integer = 1 To 46
  93.                         If logicarray(x, y, 0) = 1 Then 'is metal?
  94.                             logicarray(x, y, 1) += 1 'Add one
  95.                             If logicarray(x, y, 1) >= 255 Then 'Above maximum?
  96.                                 Dim totalsplit As Integer = 0
  97.                                 If logicarray(x + 1, y, 0) = 1 Then totalsplit += 1
  98.                                 If logicarray(x, y - 1, 0) = 1 Then totalsplit += 1
  99.                                 If logicarray(x - 1, y, 0) = 1 Then totalsplit += 1
  100.                                 If logicarray(x, y + 1, 0) = 1 Then totalsplit += 2
  101.                                 If Not totalsplit = 0 Then
  102.                                     Dim valuesplit = logicarray(x, y, 1) / totalsplit
  103.                                     logicarray(x + 1, y, 1) += valuesplit
  104.                                     logicarray(x, y - 1, 1) += valuesplit
  105.                                     logicarray(x - 1, y, 1) += valuesplit
  106.                                     logicarray(x, y + 1, 1) += (valuesplit * 2)
  107.                                 End If
  108.                                 logicarray(x, y, 0) = 0
  109.                                 logicarray(x, y, 1) = 0
  110.                             End If
  111.                         End If
  112.                     Next
  113.                 Next
  114.  
  115.             End If
  116.             ttr = chronometer2.ElapsedMilliseconds
  117.             last = chronometer.ElapsedMilliseconds
  118.             chronometer2.Stop()
  119.             chronometer2.Reset()
  120.         End If
  121.     End Sub
  122.  
  123.     Sub draw()
  124.         displaybuffer.Clear(Color.Black)
  125.         For x As Integer = 0 To 63
  126.             For y As Integer = 0 To 47
  127.                 Select Case logicarray(x, y, 0)
  128.                     Case 0 'Nothing
  129.                     Case 1 'Metal
  130.                         displaybuffer.FillRectangle(Brushes.Gray, x * 10, y * 10, 10, 10)
  131.                         Dim alphavar As Integer = logicarray(x, y, 1)
  132.                         If alphavar > 255 Then alphavar = 255
  133.                         Dim mybrush As New SolidBrush(Color.FromArgb(alphavar, Color.Red))
  134.                         displaybuffer.FillRectangle(mybrush, x * 10, y * 10, 10, 10)
  135.                     Case 2 'Base
  136.                         displaybuffer.FillRectangle(Brushes.Blue, x * 10, y * 10, 10, 10)
  137.                 End Select
  138.             Next
  139.         Next
  140.         displaybuffer.DrawString("Logic: " & ttr, New Font("Arial", 12), Brushes.Yellow, 4, 4)
  141.         displaybuffer.DrawString("Draw: " & count, New Font("Arial", 12), Brushes.Yellow, 4, 24)
  142.  
  143.         If Me.IsDisposed = False Then Canvas.CreateGraphics.DrawImage(display, 0, 0, 640, 480)
  144.     End Sub
  145.  
  146.     Private Sub Canvas_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Canvas.MouseDown
  147.         q_mousedown = True
  148.     End Sub
  149.  
  150.     Private Sub Canvas_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Canvas.MouseMove
  151.         mp.X = (e.X - 5) / 10
  152.         mp.Y = (e.Y - 5) / 10
  153.     End Sub
  154.  
  155.     Private Sub Canvas_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Canvas.MouseUp
  156.         q_mousedown = False
  157.     End Sub
  158.  
  159.     Private Sub btn_resetstress_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_resetstress.Click
  160.         For x As Integer = 0 To 63
  161.             For y As Integer = 0 To 47
  162.                 logicarray(x, y, 1) = 0
  163.             Next
  164.         Next
  165.     End Sub
  166.  
  167.     Private Sub btn_reset_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_reset.Click
  168.         For x As Integer = 0 To 63
  169.             For y As Integer = 0 To 47
  170.                 logicarray(x, y, 1) = 0
  171.                 logicarray(x, y, 0) = 0
  172.             Next
  173.         Next
  174.     End Sub
  175. End Class
Advertisement
Add Comment
Please, Sign In to add comment