GDI+ Spielerei

  • Moin

    Heute ist alles in Graustufen.

    Komischerweise habe ich heute an die Sinusfunktion gedacht und was man damit alles schönes anstellen kann.
    Herausgekommen ist wirres Zeug, was aber Teils interessant aussieht.

    Alles ab Zeile 43 ist kombinierbar. (Es ist jetzt alles außer der "Qualle" auskommentiert)
    Man kann also beliebige Muster übereinanderlegen und eigene entwerfen (mit einer Funktion für X und Y).

    Aus Geschwindigkeitsgründen ist aber das Errorhandeling entfernt. Sollte also ein Pixel außerhalb liegen gibt es einen Error.
    Durch Strikte Sin/Cos nutzung kann das natürlich umgangen werden. Der Sinus wird ja bekanntlich nie größer als 1 ;)
    [Blockierte Grafik: http://i.imgur.com/Qi6vp.png]

    Spoiler anzeigen
    [autoit]


    #include <GDIPlus.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt('GUIOnEventMode', 1)

    [/autoit] [autoit][/autoit] [autoit]

    Global $iW = 800, $iH = 800, $hGUI, $hDC, $vBuf, $hBuf, $X = 0, $Y = 0, $Z = 0, $vPx, $Exit = False, $hGFX

    [/autoit] [autoit][/autoit] [autoit]

    $hGUI = GUICreate('Test', $iW, $iH)

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    $hDC = _WinAPI_GetDC($hGUI)
    $vBuf = _Image_Create($iW, $iH)
    $hBuf = DllStructGetData($vBuf, 1, 1)
    $hGFX = _GDIPlus_GraphicsCreateFromHDC($hBuf)

    [/autoit] [autoit][/autoit] [autoit]

    $vPx = DllStructCreate('int[' & DllStructGetData($vBuf, 1, 2) * DllStructGetData($vBuf, 1, 3) * 4 & ']', DllStructGetData($vBuf, 1, 4))

    [/autoit] [autoit][/autoit] [autoit]

    GUISetOnEvent(-3, '_Exit', $hGUI)
    GUIRegisterMsg(0xF, 'WM_PAINT')
    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsClear($hGFX, 0xFF000000)

    [/autoit] [autoit][/autoit] [autoit]

    While Not $Exit
    _Pixel()
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsDispose($hGFX)
    _WinAPI_ReleaseDC($hGUI, $hDC)
    _Image_Delete($vBuf)
    _GDIPlus_Shutdown()

    [/autoit] [autoit][/autoit] [autoit]

    Func WM_PAINT()
    _WinAPI_BitBlt($hDC, 0, 0, $iW, $iH, $hBuf, 0, 0, 0xCC0020)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    $Exit = True
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Pixel()
    Local Static $a = 2 , $b = 3, $c = 4, $Zoom = $iH/3

    [/autoit] [autoit][/autoit] [autoit]

    ; Test 1
    ;~ $X = Sin($Z*3.141/180+Sin($Z*$Z*3.141/180))*$Zoom
    ;~ $Y = Cos($Z*3.141/180+Cos($Z*3.141/180))*$Zoom
    ;~ DllStructSetData($vPx, 1, _Max255(0x151515 + DllStructGetData($vPx, 1, Int($Y+$iH/2)*$iW+Int($X + $iW/2))), Int($Y+$iH/2)*$iW+Int($X + $iW/2))

    [/autoit] [autoit][/autoit] [autoit]

    ; Test 2
    ;~ $X = Sin($Z*3.14159/180+Sin($Z*$Z*3.14159/180))*$Zoom
    ;~ $Y = Cos($Z*3.14159/180+Cos($Z*3.14159/180))*$Zoom
    ;~ DllStructSetData($vPx, 1, _Max255(0x151515 + DllStructGetData($vPx, 1, Int($Y+$iH/2)*$iW+Int($X + $iW/2))), Int($Y+$iH/2)*$iW+Int($X + $iW/2))

    [/autoit] [autoit][/autoit] [autoit]

    ;~ ; Horizontal
    ;~ $X = Sin($Z*$Z*3.141/180+Sin($Z*3.141/180))*$Zoom
    ;~ $Y = Cos($Z*3.141/180+Cos($Z*3.141/180))*$Zoom
    ;~ DllStructSetData($vPx, 1, _Max255(0x151515 + DllStructGetData($vPx, 1, Int($Y+$iH/2)*$iW+Int($X + $iW/2))), Int($Y+$iH/2)*$iW+Int($X + $iW/2))

    [/autoit] [autoit][/autoit] [autoit]

    ;~ ; Vertikal
    ;~ $Y = Sin($Z*$Z*3.141/180+Sin($Z*3.141/180))*$Zoom
    ;~ $X = Cos($Z*3.141/180+Cos($Z*3.141/180))*$Zoom
    ;~ DllStructSetData($vPx, 1, _Max255(0x151515 + DllStructGetData($vPx, 1, Int($Y+$iH/2)*$iW+Int($X + $iW/2))), Int($Y+$iH/2)*$iW+Int($X + $iW/2))

    [/autoit] [autoit][/autoit] [autoit]

    ;~ ; X - Zeichen
    ;~ $X = Sin($Z*$Z*3.141/180+Sin($Z*3.141/180))*$Zoom
    ;~ $Y = Cos($Z*$Z*3.141/180+Cos($Z*3.141/180))*$Zoom
    ;~ DllStructSetData($vPx, 1, _Max255(0x151515 + DllStructGetData($vPx, 1, Int($Y+$iH/2)*$iW+Int($X + $iW/2))), Int($Y+$iH/2)*$iW+Int($X + $iW/2))

    [/autoit] [autoit][/autoit] [autoit]

    ; Test 4
    ;~ $X = Sin($Z*3.141/180+Sin($Z*$Z*3.141/180+Sin($Z*$Z*3.141/180)))*$Zoom
    ;~ $Y = Cos($Z*3.141/180+Cos($Z*$Z*3.141/180+Cos($Z*$Z*3.141/180)))*$Zoom
    ;~ DllStructSetData($vPx, 1, _Max255(0x151515 + DllStructGetData($vPx, 1, Int($Y+$iH/2)*$iW+Int($X + $iW/2))), Int($Y+$iH/2)*$iW+Int($X + $iW/2))

    [/autoit] [autoit][/autoit] [autoit]

    ; Qualle die nach Rechts Oben schwimmt
    $X = Sin($Z*$Z*3.141/180+Sin($Z*$Z*3.141/180+Sin($Z*3.141/180)))*$Zoom
    $Y = Cos($Z*3.141/180+Cos($Z*3.141/180+Cos($Z*$Z*3.141/180)))*$Zoom
    DllStructSetData($vPx, 1, _Max255(0x151515 + DllStructGetData($vPx, 1, Int($Y+$iH/2)*$iW+Int($X + $iW/2))), Int($Y+$iH/2)*$iW+Int($X + $iW/2))

    [/autoit] [autoit][/autoit] [autoit]

    ; Kugel in Plastikfolie
    ;~ $X = Sin($Z*3.141/180+Cos($Z*3.141/180+Sin($Z*$Z*3.141/180)))*$Zoom
    ;~ $Y = Cos($Z*3.141/180+Sin($Z*3.141/180+Cos($Z*$Z*3.141/180)))*$Zoom
    ;~ DllStructSetData($vPx, 1, _Max255(0x151515 + DllStructGetData($vPx, 1, Int($Y+$iH/2)*$iW+Int($X + $iW/2))), Int($Y+$iH/2)*$iW+Int($X + $iW/2))

    [/autoit] [autoit][/autoit] [autoit]

    ; Test 5
    ;~ $X = Sin($Z*3.141/180+Cos($Z*3.141/180+Cos($Z*$Z*3.141/180)))*$Zoom
    ;~ $Y = Cos($Z*3.141/180+Sin($Z*3.141/180+Cos($Z*$Z*3.141/180)))*$Zoom
    ;~ DllStructSetData($vPx, 1, _Max255(0x151515 + DllStructGetData($vPx, 1, Int($Y+$iH/2)*$iW+Int($X + $iW/2))), Int($Y+$iH/2)*$iW+Int($X + $iW/2))

    [/autoit] [autoit][/autoit] [autoit]

    ; Oval
    ;~ $X = Cos($Z*$Z*3.141/180+Cos($Z*3.141/180+Cos($Z*$Z*3.141/180)))*$Zoom
    ;~ $Y = Cos($Z*$Z*3.141/180+Sin($Z*3.141/180+Cos($Z*$Z*3.141/180)))*$Zoom
    ;~ DllStructSetData($vPx, 1, _Max255(0x151515 + DllStructGetData($vPx, 1, Int($Y+$iH/2)*$iW+Int($X + $iW/2))), Int($Y+$iH/2)*$iW+Int($X + $iW/2))

    [/autoit] [autoit][/autoit] [autoit]

    ; Scheibe OU
    ;~ $X = Cos($Z*3.141/180+Sin($Z*$Z*3.141/180))*$Zoom
    ;~ $Y = Cos($Z*$Z*3.141/180+Cos($Z*3.141/180))*$Zoom
    ;~ DllStructSetData($vPx, 1, _Max255(0x151515 + DllStructGetData($vPx, 1, Int($Y+$iH/2)*$iW+Int($X + $iW/2))), Int($Y+$iH/2)*$iW+Int($X + $iW/2))

    [/autoit] [autoit][/autoit] [autoit]

    ; Scheibe LR
    ;~ $Y = Cos($Z*3.141/180+Sin($Z*$Z*3.141/180))*$Zoom
    ;~ $X = Cos($Z*$Z*3.141/180+Cos($Z*3.141/180))*$Zoom
    ;~ DllStructSetData($vPx, 1, _Max255(0x151515 + DllStructGetData($vPx, 1, Int($Y+$iH/2)*$iW+Int($X + $iW/2))), Int($Y+$iH/2)*$iW+Int($X + $iW/2))

    [/autoit] [autoit][/autoit] [autoit]

    $Z += 1
    If IsInt($Z/100) Then WM_PAINT()

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Image_SetPx($X, $Y, $iCol)
    DllStructSetData($vPx, 1, _Max255($iCol + DllStructGetData($vPx, 1, $Y*$iW+$X)), $Y*$iW+$X)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Max255($a)
    If StringLeft(Hex($a,8), 2) <> 'FF' Then Return 0xFFFFFFFF
    Return $a
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Image_Create($iW, $iH)
    Local $Ptr, $hDC, $hBmp, $tBMI, $aDIB, $vStruct
    $hDC = _WinAPI_CreateCompatibleDC(0)
    $tBMI = DllStructCreate('struct;dword Size;long Width;long Height;word Planes;word BitCount;dword Compression;dword SizeImage;long XPelsPerMeter;long YPelsPerMeter;dword ClrUsed;dword ClrImportant;endstruct;dword RGBQuad')
    DllStructSetData($tBMI, "Size", DllStructGetSize($tBMI) - 4)
    DllStructSetData($tBMI, "Width", $iW)
    DllStructSetData($tBMI, "Height", -$iH)
    DllStructSetData($tBMI, "Planes", 1)
    DllStructSetData($tBMI, "BitCount", 32)
    $aDIB = DllCall('gdi32.dll', 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBMI), 'uint', 0, 'ptr*', 0, 'ptr', 0, 'uint', 0)
    $hBmp = $aDIB[0]
    $Ptr = $aDIB[4]
    _WinAPI_SelectObject($hDC, $hBmp)
    $vStruct = DllStructCreate('int[5]')
    DllStructSetData($vStruct, 1, $hDC, 1)
    DllStructSetData($vStruct, 1, $iW, 2)
    DllStructSetData($vStruct, 1, $iH, 3)
    DllStructSetData($vStruct, 1, $Ptr, 4)
    DllStructSetData($vStruct, 1, $hBmp, 5)
    Return $vStruct
    EndFunc ;==>_Image_Create

    [/autoit] [autoit][/autoit] [autoit]

    Func _Image_Delete(ByRef $vStruct)
    _WinAPI_DeleteObject(DllStructGetData($vStruct, 1, 5))
    _WinAPI_DeleteDC(DllStructGetData($vStruct, 1, 1))
    $vStruct = 0
    EndFunc ;==>_Image_Delete

    [/autoit]