Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Array.au3>
- #include <GDIPlus.au3>
- ; gdiplus
- Global $g_hGfxCtxt, $hGraphic, $g_hBitmap
- ; pen & color
- Global $hPen[0], $hPenPading, $hPenChoosing
- Global $c_Pen, $c_PenPadding, $c_Choosing
- Global $cBackground = 0xFF000000
- ; value
- Global $nValues = 200 ; number of array
- Global $Values[ $nValues ]
- Global $maxValue = 1000
- Global $isLoop = False
- Global $sVal = 0
- Global $sLoop = 0
- Global $Steps = $nValues / 20 ; step for sorting, bigger = faster
- ; gui
- Global $iPadding = 10
- Global $GuiW = 800, $GuiH = 600
- Global $valueWidth = $GuiW / $nValues
- Global $iChoosing = 0
- $GuiW += $iPadding * 2
- $GuiH += $iPadding * 2
- Global $DisplayMode = 0 ; Displaymode: 0 = color; 1 = length
- $GUI = GUICreate("", $GuiW, $GuiH)
- GUISetState()
- Sleep(1000)
- _Graphic_StartUp()
- CreateValues()
- While 1
- For $i = 1 To $Steps
- $iChoosing = Sort()
- Next
- Draw()
- Switch GUIGetMsg()
- Case - 3
- Exit
- EndSwitch
- WEnd
- Func Draw()
- _GDIPlus_GraphicsClear($g_hGfxCtxt, $cBackground)
- Switch $DisplayMode
- Case 0
- $x = $iPadding + $valueWidth / 2
- For $iVal = 0 To $nValues - 1
- _GDIPlus_GraphicsDrawLine($g_hGfxCtxt, $x, $iPadding, $x, $GuiH - $iPadding, $hPen[$iVal])
- If $iVal = $iChoosing Then _GDIPlus_GraphicsDrawLine($g_hGfxCtxt, $x, $iPadding, $x, $GuiH - $iPadding, $hPenChoosing)
- $x += $valueWidth ; padding + index of value * width of value
- Next
- Case 1
- $x = $iPadding + $valueWidth / 2
- For $iVal = 0 To $nValues - 1
- $height = __map( $Values[$iVal], 0, $maxValue, $iPadding, $GuiH - $iPadding * 2)
- _GDIPlus_GraphicsDrawLine($g_hGfxCtxt, $x, $GuiH - $iPadding - $height, $x, $GuiH - $iPadding, $hPen)
- If $iVal = $iChoosing Then _GDIPlus_GraphicsDrawLine($g_hGfxCtxt, $x, $GuiH - $iPadding - $height, $x, $GuiH - $iPadding, $hPenChoosing)
- $x += $valueWidth ; padding + index of value * width of value
- Next
- EndSwitch
- $padXY = $iPadding - 1
- $padW = $GuiW - $iPadding * 2 + 2
- $padH = $GuiH - $iPadding * 2 + 2
- _GDIPlus_GraphicsDrawRect($g_hGfxCtxt, $padXY, $padXY, $padW, $padH, $hPenPading) ; padding line
- _GDIPlus_GraphicsDrawImageRect($hGraphic, $g_hBitmap, 0, 0, $GuiW, $GuiH)
- EndFunc
- Func DrawFinal()
- For $i = 0 To $nValues - 1 Step + 2
- $iChoosing = $i
- Draw()
- Next
- EndFunc
- Func Sort()
- ;~ If $sLoop <= $nValues - 1 Then
- If $sVal < $nValues - 1 Then
- _sort()
- If $isLoop = False Then
- $sVal += 1
- Return $sVal
- Else
- $sLoop -= 1
- If $sLoop < 1 Then $isLoop = False
- Return $sLoop
- EndIf
- Else
- $sVal = 0
- DrawFinal()
- CreateValues()
- EndIf
- Return False
- EndFunc
- Func _sort()
- If $isLoop = False Then
- If $Values[ $sVal ] > $Values[ $sVal + 1] Then
- _swap( $Values[ $sVal ], $Values[ $sVal + 1] )
- If $DisplayMode = 0 Then _swap( $hPen[ $sVal ], $hPen[ $sVal + 1] )
- $isLoop = True
- $sLoop = $sVal + 1
- EndIf
- Else
- If $Values[$sLoop] >= $Values[$sLoop - 1] Then $isLoop = False
- If $isLoop Then
- _swap( $Values[ $sLoop ], $Values[ $sLoop - 1] )
- If $DisplayMode = 0 Then _swap( $hPen[ $sLoop ], $hPen[ $sLoop - 1] )
- EndIf
- EndIf
- EndFunc
- Func _swap(ByRef $x, ByRef $y)
- $temp = $x
- $x = $y
- $y = $temp
- EndFunc
- Func CreateValues()
- For $iVal = 0 To $nValues - 1
- $Values[ $iVal ] = Random(0, $maxValue, 1) ; 000000 - FFFFFF hex colors
- Next
- Switch $DisplayMode
- Case 0
- ReDim $hPen[$nValues]
- For $iVal = 0 To $nValues - 1
- $hPen[$iVal] = _GDIPlus_PenCreate( __getColor( $Values[$iVal] ), $valueWidth)
- Next
- Case 1
- $hPen = _GDIPlus_PenCreate( $c_Pen, $valueWidth)
- EndSwitch
- EndFunc
- Func _Graphic_StartUp()
- _GDIPlus_Startup()
- ; install gdi
- $hGraphic = _GDIPlus_GraphicsCreateFromHWND($GUI)
- $g_hBitmap = _GDIPlus_BitmapCreateFromGraphics($GuiW, $GuiH, $hGraphic)
- $g_hGfxCtxt = _GDIPlus_ImageGetGraphicsContext($g_hBitmap)
- _GDIPlus_GraphicsSetSmoothingMode($g_hGfxCtxt, 2)
- Switch $DisplayMode
- Case 0
- $c_Pen = 0xFFFF0000
- $c_PenPadding = 0xFFFFFFFF
- $c_Choosing = 0xFFFFFFFF
- Case 1
- $c_Pen = 0xFFFFFFFF
- $c_PenPadding = 0xFFFFFFFF
- $c_Choosing = 0xFF00FF00
- EndSwitch
- $hPenPading = _GDIPlus_PenCreate($c_PenPadding, 2)
- $hPenChoosing = _GDIPlus_PenCreate($c_Choosing, $valueWidth)
- EndFunc
- Func __getColor($value)
- Local $Step[5]
- $istep = 5
- For $i = 0 To 4
- $Step[$i] = $maxValue * $istep / 6
- $istep -= 1
- Next
- If $value >= $Step[0] Then
- $color = __map($value, $Step[0], $maxValue, 0xFF, 0x00)
- $color = Round( $color )
- Return 0xFFFF0000 + $color ; FF 00 xx
- ElseIf $value >= $Step[1] Then
- $color = __map($value, $Step[1], $Step[0], 0x00, 0xFF)
- $color = Round( $color )
- Return 0xFF0000FF + $color * 0x10000 ; xx 00 FF
- ElseIf $value >= $Step[2] Then
- $color = __map($value, $Step[2], $Step[1], 0xFF, 0x00)
- $color = Round( $color )
- Return 0xFF0000FF + $color * 0x100; 00 xx FF
- ElseIf $value >= $Step[3] Then
- $color = __map($value, $Step[3], $Step[2], 0x00, 0xFF)
- $color = Round( $color )
- Return 0xFF00FF00 + $color ; 00 FF xx
- ElseIf $value >= $Step[4] Then
- $color = __map($value, $Step[4], $Step[3], 0xFF, 0x00)
- $color = Round( $color )
- Return 0xFF00FF00 + $color * 0x10000; xx FF 00
- Else
- $color = __map($value, 0, $Step[4], 0x00, 0xFF)
- $color = Round( $color )
- Return 0xFFFF0000 + $color * 0x100; xx FF 00
- EndIf
- EndFunc
- Func __minmax($x, $min, $max)
- Return ($x - $min) / ($max - $min)
- EndFunc
- Func __map($x, $min1, $max1, $min2, $max2)
- If $max2 > $min2 Then
- Return __minmax($x, $min1, $max1) * ($max2 - $min2) + $min2
- Else
- Return (1 - __minmax($x, $min1, $max1)) * ($min2 - $max2) + $max2
- EndIf
- EndFunc
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement