• Ich hatte Langeweile und hab kurz etwas zusammengescriptet: es erstellt aus einer Zufallszahl unterschiedliche Bilder bzw. Muster, die teilweise ganz gut aussehen.
    Ein paar Beispiele:
    [unten]


    Und der Code:

    Spoiler anzeigen
    [autoit]

    #include <gdip.au3>

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

    _GDIPlus_Startup()

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

    Local $w=500
    Local $h=500
    Local $path=FileSaveDialog("Speichern...","D:\Downloads\zzzzztest.png","PNG(*.png)")

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

    Local $gra=_GDIPlus_GraphicsCreateFromHDC(_WinAPI_GetDC(0))
    Local $bmp=_GDIPlus_BitmapCreateFromGraphics($w,$h,$gra)
    _GDIPlus_GraphicsDispose($gra)

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

    Local $start=Random(0,256)
    ConsoleWrite($start&@CRLF)

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

    For $y=0 To $h
    For $x=0 To $w
    $r=$x*Sin($y*$start)
    $g=$x*Cos($y*$start)
    $b=$x*Tan($y*$start)
    $color="0xFF"&Hex($r,2)&Hex($g,2)&Hex($b,2)
    _GDIPlus_BitmapSetPixel($bmp,$x,$y,$color)
    Next
    Next

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

    FileDelete($path)
    _GDIPlus_ImageSaveToFile($bmp,$path)
    _GDIPlus_BitmapDispose($bmp)
    _GDIPlus_Shutdown()

    [/autoit]
    Beispiele


    EDIT: versucht mal $start=0.01 und $start=0.005, das sieht wie gezoomt aus


    EDIT:
    Das ganze ist jetzt in ASM fertig, es ist wirklich viiieeel schneller! (Dank der Hilfe von Andy fertig :rolleyes:, sonst würde ich noch dran sitzen)

    ---Berichtigt und verbessert---

    Spoiler anzeigen
    [autoit]

    #include "AssembleIt.au3"
    #include <GDIPlus.au3>
    #include <WindowsConstants.au3>

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

    ;##########################
    Local $von=0.01,$bis=0.01,$step=0.001

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

    ;Local $path = "D:\Downloads\zzzzztest.png"
    Local $bmp, $lock, $w = 500, $h = 500
    Local $fps=0
    _GDIPlus_Startup()
    Local $gra = _GDIPlus_GraphicsCreateFromHDC(_WinAPI_GetDC(0))
    $bmp = _GDIPlus_BitmapCreateFromGraphics($w, $h, $gra)
    _GDIPlus_GraphicsDispose($gra)

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

    $hgui=GUICreate("Show",$w,$h)
    GUISetState()
    $DC_gui=_WinAPI_GetDC($hgui)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $DC_gui = ' & $DC_gui & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    global $ptr,$hbmp
    $DC_bitmap=_CreateNewBmp32($w, $h, $ptr, $hbmp)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $ptr = ' & $ptr & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $DC_bitmap = ' & $DC_bitmap & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

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

    AdlibRegister("fps",1000)

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

    For $bildwert=$von To $bis Step $step
    If GUIGetMsg()=-3 Then _exit()
    Local $ret = _AssembleIt("float", "F", "int", $W, "int", $H, "ptr", $ptr, "float", $bildwert)
    ;ConsoleWrite("Benutzter Wert: " & $ret & @CRLF)
    _WinAPI_BitBlt($DC_gui,0,0,$w,$h,$DC_bitmap,0,0,$srccopy)
    $fps+=1
    Sleep(10)
    Next

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

    While GUIGetMsg()<>-3
    _WinAPI_BitBlt($DC_gui,0,0,$w,$h,$DC_bitmap,0,0,$srccopy)
    Sleep(10)
    WEnd

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

    ;FileDelete($path)
    ;_GDIPlus_ImageSaveToFile($bmp, $path)
    _exit()

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

    Func _exit()
    _DeleteBitmap32($DC_bitmap,$ptr,$hbmp)
    _GDIPlus_Shutdown()
    Exit
    EndFunc
    ;##########################

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

    Func fps()
    ConsoleWrite("FPS: "&$fps&@CRLF)
    $fps=0
    EndFunc

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

    Func _CreateNewBmp32($iwidth, $iheight, ByRef $ptr, ByRef $hbmp) ;erstellt leere 32-bit-Bitmap; Rückgabe $HDC und $ptr und handle auf die Bitmapdaten
    $hcdc = _WinAPI_CreateCompatibleDC(0) ;Desktop-Kompatiblen DeviceContext erstellen lassen
    $tBMI = DllStructCreate($tagBITMAPINFO) ;Struktur der Bitmapinfo erstellen und Daten eintragen
    DllStructSetData($tBMI, "Size", DllStructGetSize($tBMI) - 4);Structgröße abzüglich der Daten für die Palette
    DllStructSetData($tBMI, "Width", $iwidth)
    DllStructSetData($tBMI, "Height", -$iheight) ;minus =standard = bottomup
    DllStructSetData($tBMI, "Planes", 1)
    DllStructSetData($tBMI, "BitCount", 32) ;32 Bit = 4 Bytes => AABBGGRR
    $adib = DllCall('gdi32.dll', 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBMI), 'uint', 0, 'ptr*', 0, 'ptr', 0, 'uint', 0)
    $hbmp = $adib[0] ;hbitmap handle auf die Bitmap, auch per GDI+ zu verwenden
    $ptr = $adib[4] ;pointer auf den Anfang der Bitmapdaten, vom Assembler verwendet
    _WinAPI_SelectObject($hcdc, $hbmp) ;objekt hbitmap in DC
    Return $hcdc ;DC der Bitmap zurückgeben
    EndFunc ;==>_CreateNewBmp32

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

    Func _DeleteBitmap32($DC, $ptr, $hbmp)
    _WinAPI_DeleteDC($DC)
    _WinAPI_DeleteObject($hbmp)
    $ptr = 0
    EndFunc ;==>_DeleteBitmap32

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

    Func F()
    _("use32")
    _("org " & FasmGetBasePtr($Fasm))
    _("finit") ;Co Prozessor starten
    ;
    _("mov eax,[esp+4]") ;
    _("mov [w],eax") ;w
    _("mov eax,[esp+8]") ;
    _("mov [h],eax") ;h
    ;startadresse in ebx, dann muss ebx immer nur um 4 erhöht werden, um das nächste pixel zu schreiben
    _("mov ebx,[esp+12]") ;scan0
    _("mov eax,[w]") ;an das ende setzen, weil die schleifen auch von hinten anfangen
    _("imul eax,[h]") ;w*h
    _("imul eax,4") ;je pixel 4 bytes: w*h*4
    _("add ebx,eax") ;scan0 += size
    _("mov eax,[esp+16]") ;start / bildwert
    _("mov [start],eax") ;

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

    ;register im coprostack belegen,

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

    _("fld [start]") ;st0=start
    _("mov edx,[h]") ;Schleifenzähler edx für y, For $edx=$h to 0 Step -1
    _("for_y:") ;Schleifenlabel

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

    _("mov ecx,[w]") ;Schleifenzähler ecx für x
    _("for_x:") ;Schleifenlabel
    ;Berechung
    ;st0=start
    _("mov [ftemp],edx") ;st0=start
    _("fild [ftemp]") ;st0=y st1=start
    _("fmul st0,st1") ;st0=y*start st1=start
    _("fptan") ;st0=1 st1=tangens !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!, (tan, in ASM umgekehrt, bgra)
    _("fstp st0") ;stack sauber machen
    _("mov [ftemp],ecx") ;
    _("fild [ftemp]") ;st0=x st1=sin(y*start) st2=start
    _("fmulp") ;st0=x*sin(y*start) st1=start
    _("fistp dword[r]") ;st0=start ACHTUNG, entweder stack immer komplett leermachen oder einfach die werte weiterbenutzen!!
    ;ansonsten läuft der stack über...stackoverflow

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

    _("mov [ftemp],edx") ;das ganze mit g und cos
    _("fild [ftemp]") ;st0=y st1=start
    _("fmul st0,st1") ;st0=y*start st1=start
    _("fcos") ;
    _("mov [ftemp],ecx") ;
    _("fild [ftemp]") ;st0=x st1=y*start st2=start
    _("fmulp") ;st1=x*(y*start) st1=start
    _("fistp dword[g]") ;st0=start

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

    _("mov [ftemp],edx") ;und b und tan
    _("fild [ftemp]") ;
    _("fmul st0,st1") ;
    _("fsin") ;st0=sin(y*start) st1=start
    _("mov [ftemp],ecx") ;st0=tangens
    _("fild [ftemp]") ;
    _("fmulp") ;
    _("fistp dword[b]") ;st0=start, stack muss gecleant werden in der schleife!

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

    _("mov byte[code=c],255") ;alpha auf 255 setzen
    _("mov eax,dword[r]") ;die 4 aufeinanderfolgenden bytes holen
    _("mov DWORD[ebx],eax") ;color in [ebx] (bild) schreiben
    _("sub ebx,4") ;ein pixel weiter bzw. zurück

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

    _("dec ecx") ;Zähler dekrementieren
    _("jnz for_x") ;Wenn Zähler <> 0 dann wiederhole Schleife
    _("dec edx") ;Zähler dekrementieren
    _("jnz for_y") ;Wenn Zähler <> 0 dann wiederhole Schleife

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

    _("fstp st0") ;stack sauber machen
    _("fld [start]") ;Rückgabewert=Start / Bildwert
    _("ret") ;Ende, Rückgabewert ist der letzte Wert des ERSTEN! Pixels (Scheife geht Rückwärts)

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

    _("r db 0") ;
    _("g db 0") ;
    _("b db 0") ;
    _("c dd 0") ;dummy, platz zum schreiben von dword nach [b]
    _("ftemp dd 0.0") ;zum schreiben von edx/ecx auf floating stack

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

    _("start dd 0.0") ;für berechnung
    _("w dd 0") ;Speicher für Parameter reservieren
    _("h dd 0") ;
    EndFunc

    [/autoit]

    EDIT:
    Das ganze nochmal schneller (es wird in der Schleife nicht mehr assemblet):

    Spoiler anzeigen
    [autoit]

    ;#include "AssembleIt.au3"
    #include "Fasm.au3"
    #include <GDIPlus.au3>
    #include <WindowsConstants.au3>

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

    ;##########################
    Local $von=0.0,$bis=ACos(-1)*2,$step=0.001

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

    ;Local $path = "D:\Downloads\zzzzztest.png"
    Local $bmp, $lock, $w = 500, $h = 500
    Local $fps=0
    _GDIPlus_Startup()
    Local $gra = _GDIPlus_GraphicsCreateFromHDC(_WinAPI_GetDC(0))
    $bmp = _GDIPlus_BitmapCreateFromGraphics($w, $h, $gra)
    _GDIPlus_GraphicsDispose($gra)

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

    $hgui=GUICreate("Show",$w,$h)
    GUISetState()
    $DC_gui=_WinAPI_GetDC($hgui)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $DC_gui = ' & $DC_gui & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    global $ptr,$hbmp
    $DC_bitmap=_CreateNewBmp32($w, $h, $ptr, $hbmp)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $ptr = ' & $ptr & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $DC_bitmap = ' & $DC_bitmap & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

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

    Local $Fasm = FasmInit()
    FasmReset($Fasm)
    F()
    $bcode=FasmGetBinary($Fasm)
    Local $tCodebuffer=DllStructCreate("byte["&StringLen($bcode)/2-1&"]")
    DllStructSetData($tCodeBuffer,1,$bcode)
    Local $user32=DllOpen("user32.dll")

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

    AdlibRegister("fps",1000)

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

    For $bildwert=$von To $bis Step $step
    If GUIGetMsg()=-3 Then _exit()
    ;Local $ret = _AssembleIt("float", "F", "int", $W, "int", $H, "ptr", $ptr, "float", $bildwert)
    ;ConsoleWrite("Benutzter Wert: " & $ret & @CRLF)
    Local $ret=DllCall($user32, "float", "CallWindowProcW", "ptr", DllStructGetPtr($tCodeBuffer), "int", $W, "int", $H, "ptr", $ptr, "float", $bildwert)
    ;ConsoleWrite("Benutzter Wert: " & $ret[0] & @CRLF)
    _WinAPI_BitBlt($DC_gui,0,0,$w,$h,$DC_bitmap,0,0,$srccopy)
    $fps+=1
    Sleep(10)
    Next

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

    While GUIGetMsg()<>-3
    _WinAPI_BitBlt($DC_gui,0,0,$w,$h,$DC_bitmap,0,0,$srccopy)
    Sleep(10)
    WEnd

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

    ;FileDelete($path)
    ;_GDIPlus_ImageSaveToFile($bmp, $path)
    _exit()

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

    Func _exit()
    _DeleteBitmap32($DC_bitmap,$ptr,$hbmp)
    _GDIPlus_Shutdown()
    DllClose($user32)
    Exit
    EndFunc
    ;##########################

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

    Func fps()
    ConsoleWrite("FPS: "&$fps&@CRLF)
    $fps=0
    EndFunc

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

    Func _CreateNewBmp32($iwidth, $iheight, ByRef $ptr, ByRef $hbmp) ;erstellt leere 32-bit-Bitmap; Rückgabe $HDC und $ptr und handle auf die Bitmapdaten
    $hcdc = _WinAPI_CreateCompatibleDC(0) ;Desktop-Kompatiblen DeviceContext erstellen lassen
    $tBMI = DllStructCreate($tagBITMAPINFO) ;Struktur der Bitmapinfo erstellen und Daten eintragen
    DllStructSetData($tBMI, "Size", DllStructGetSize($tBMI) - 4);Structgröße abzüglich der Daten für die Palette
    DllStructSetData($tBMI, "Width", $iwidth)
    DllStructSetData($tBMI, "Height", -$iheight) ;minus =standard = bottomup
    DllStructSetData($tBMI, "Planes", 1)
    DllStructSetData($tBMI, "BitCount", 32) ;32 Bit = 4 Bytes => AABBGGRR
    $adib = DllCall('gdi32.dll', 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBMI), 'uint', 0, 'ptr*', 0, 'ptr', 0, 'uint', 0)
    $hbmp = $adib[0] ;hbitmap handle auf die Bitmap, auch per GDI+ zu verwenden
    $ptr = $adib[4] ;pointer auf den Anfang der Bitmapdaten, vom Assembler verwendet
    _WinAPI_SelectObject($hcdc, $hbmp) ;objekt hbitmap in DC
    Return $hcdc ;DC der Bitmap zurückgeben
    EndFunc ;==>_CreateNewBmp32

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

    Func _DeleteBitmap32($DC, $ptr, $hbmp)
    _WinAPI_DeleteDC($DC)
    _WinAPI_DeleteObject($hbmp)
    $ptr = 0
    EndFunc ;==>_DeleteBitmap32

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

    Func F()
    _("use32")
    _("org " & FasmGetBasePtr($Fasm))
    _("finit") ;Co Prozessor starten
    ;
    _("mov eax,[esp+4]") ;
    _("mov [w],eax") ;w
    _("mov eax,[esp+8]") ;
    _("mov [h],eax") ;h
    ;startadresse in ebx, dann muss ebx immer nur um 4 erhöht werden, um das nächste pixel zu schreiben
    _("mov ebx,[esp+12]") ;scan0
    _("mov eax,[w]") ;an das ende setzen, weil die schleifen auch von hinten anfangen
    _("imul eax,[h]") ;w*h
    _("imul eax,4") ;je pixel 4 bytes: w*h*4
    _("add ebx,eax") ;scan0 += size
    _("mov eax,[esp+16]") ;start / bildwert
    _("mov [start],eax") ;

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

    ;register im coprostack belegen,

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

    _("fld [start]") ;st0=start
    _("mov edx,[h]") ;Schleifenzähler edx für y, For $edx=$h to 0 Step -1
    _("for_y:") ;Schleifenlabel

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

    _("mov ecx,[w]") ;Schleifenzähler ecx für x
    _("for_x:") ;Schleifenlabel
    ;Berechung
    ;st0=start
    _("mov [ftemp],edx") ;st0=start
    _("fild [ftemp]") ;st0=y st1=start
    _("fmul st0,st1") ;st0=y*start st1=start
    _("fptan") ;st0=1 st1=tangens !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!, (tan, in ASM umgekehrt, bgra)
    _("fstp st0") ;stack sauber machen
    _("mov [ftemp],ecx") ;
    _("fild [ftemp]") ;st0=x st1=sin(y*start) st2=start
    _("fmulp") ;st0=x*sin(y*start) st1=start
    _("fistp dword[r]") ;st0=start ACHTUNG, entweder stack immer komplett leermachen oder einfach die werte weiterbenutzen!!
    ;ansonsten läuft der stack über...stackoverflow

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

    _("mov [ftemp],edx") ;das ganze mit g und cos
    _("fild [ftemp]") ;st0=y st1=start
    _("fmul st0,st1") ;st0=y*start st1=start
    _("fcos") ;
    _("mov [ftemp],ecx") ;
    _("fild [ftemp]") ;st0=x st1=y*start st2=start
    _("fmulp") ;st1=x*(y*start) st1=start
    _("fistp dword[g]") ;st0=start

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

    _("mov [ftemp],edx") ;und b und tan
    _("fild [ftemp]") ;
    _("fmul st0,st1") ;
    _("fsin") ;st0=sin(y*start) st1=start
    _("mov [ftemp],ecx") ;st0=tangens
    _("fild [ftemp]") ;
    _("fmulp") ;
    _("fistp dword[b]") ;st0=start, stack muss gecleant werden in der schleife!

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

    _("mov byte[code=c],255") ;alpha auf 255 setzen
    _("mov eax,dword[r]") ;die 4 aufeinanderfolgenden bytes holen
    _("mov DWORD[ebx],eax") ;color in [ebx] (bild) schreiben
    _("sub ebx,4") ;ein pixel weiter bzw. zurück

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

    _("dec ecx") ;Zähler dekrementieren
    _("jnz for_x") ;Wenn Zähler <> 0 dann wiederhole Schleife
    _("dec edx") ;Zähler dekrementieren
    _("jnz for_y") ;Wenn Zähler <> 0 dann wiederhole Schleife

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

    _("fstp st0") ;stack sauber machen
    _("fld [start]") ;Rückgabewert=Start / Bildwert
    _("ret") ;Ende, Rückgabewert ist der letzte Wert des ERSTEN! Pixels (Scheife geht Rückwärts)

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

    _("r db 0") ;
    _("g db 0") ;
    _("b db 0") ;
    _("c dd 0") ;dummy, platz zum schreiben von dword nach [b]
    _("ftemp dd 0.0") ;zum schreiben von edx/ecx auf floating stack

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

    _("start dd 0.0") ;für berechnung
    _("w dd 0") ;Speicher für Parameter reservieren
    _("h dd 0") ;
    EndFunc

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

    Func _($str)
    FasmAdd($Fasm, $str)
    EndFunc

    [/autoit]


    Jetzt 21,5 FPS bei 500x500px

    8 Mal editiert, zuletzt von TheShadowAE (7. Februar 2011 um 18:08)

  • Da kommen echt coole Sachen bei raus^^

    Spoiler anzeigen

    mfg BB

    "IF YOU'RE GOING TO KILL IT
    OPEN SOURCE IT!"

    by Phillip Torrone

    Zitat von Shoutbox

    [Heute, 11:16] Andy: ....böseböseböseböse....da erinnere ich mich daran, dass man den Puschelschwanz eines KaRnickels auch "Blume" nennt....ob da eins zum anderen passt? :rofl: :rofl: :rofl: :rofl:

    https://autoit.de/index.php?page…leIt#post251138

    Neon Snake

  • Genau die Gleiche Idee hatte ich heute Vormittag auch schon. (Also die Idee eines Mustergenerators)
    Allerdings wollte ich ihn basteln um Formeln zu finden die irgendwelche lustigen Formen ergeben.

    Mustergenerator
    [autoit]


    #include <Misc.au3>
    #include <WinAPIEX.au3>
    #include <GDIPlus.au3>

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

    Opt("MustDeclareVars", 1)
    Opt("GUIOnEventMode", 1)

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

    Global Const $Size = 512
    Global Const $Breite = $Size
    Global Const $Hoehe = $Size
    Global Const $Titel = 'Mustergenerator...'
    Global Const $WS_EX_LAYERED = 0x00080000
    Global Const $WS_POPUP = 0x80000000
    Global Const $SRCCOPY = 0x00CC0020
    Global Const $BLACKNESS = 0x00000042
    Global Const $h_NTDLL_DLL = DllOpen('ntdll.dll')
    Global Const $Stretch = 1

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

    Global $hGUI = GUICreate($Titel, $Breite * $Stretch, $Hoehe * $Stretch, _C($Breite * $Stretch, 1), _C($Hoehe * $Stretch, 0), $WS_POPUP, $WS_EX_LAYERED)
    GUISetBkColor(0x000000, $hGUI)
    WinSetTrans($hGUI, '', 255)
    GUISetOnEvent(-3, '_Exit', $hGUI)
    GUISetState(@SW_SHOW, $hGUI)

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

    Global $hDC_GUI = _WinAPI_GetDC($hGUI)
    Global $ptr_Backbuffer, $hbmp_Backbuffer
    Global $hDC_Backbuffer = _CreateNewBmp32($Breite, $Hoehe, $ptr_Backbuffer, $hbmp_Backbuffer)
    Global $DLL_Struct = DllStructCreate('int[' & $Breite * $Hoehe & ']', $ptr_Backbuffer)

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

    Global $Frame, $Struct, $ptr, $hbmp
    Global $Counter = 0
    Global $Mode = 0 ;0 = Vorwärts, 1 = Rückwärts
    Global $Neu = True

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

    OnAutoItExitRegister('_Exit')

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

    _NeuesBild()

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

    While Sleep(20)
    _Winapi_StretchBlt($hDC_GUI, 0, 0, $Breite * $Stretch, $Hoehe * $Stretch, $Frame, 0, 0, $Breite, $Hoehe, $SRCCOPY)
    If _IsPressed('20') Then _NeuesBild()
    If _IsPressed('53') Then _Save()
    WEnd

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

    ;##########################HIER EIGENE FORMELN EINBAUEN############################################
    ; r = Rotanteil
    ; g = Grünanteil
    ; b = Blauanteil
    ; Es muss das Hex-Format verwendet werden. Hex(blabla, 2)
    Func _Funktion($x, $y, ByRef $r, ByRef $g, ByRef $b)

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

    Local Static $start = Random(0, 255, 1)
    If $Neu Then
    $Neu = False
    $start = Random(0, 255, 1)
    ;~ $start += 1
    ToolTip($start)
    EndIf

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

    $r=Hex($x*Sin($y*$start), 2)
    $g=Hex($x*Cos($y*$start), 2)
    $b=Hex($x*Tan($y*$start), 2)

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

    EndFunc
    ;###################################################################################################

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

    Func _NeuesBild()

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

    _GDIPlus_Startup()
    _Winapi_StretchBlt($hDC_Backbuffer, 0, 0, $Breite * $Stretch, $Hoehe * $Stretch, $Frame, 0, 0, $Breite, $Hoehe, $SRCCOPY)
    Local $hBuffer = _GDIPlus_GraphicsCreateFromHDC($hDC_Backbuffer)
    Local $hPen = _GDIPlus_PenCreate(0xFFFFFFFF)
    Local $hBrush = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)
    Local $g = '88', $r = '34', $b = '99'
    Local $Prozent = 0
    Local $pxGes = $Hoehe * $Breite

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

    $Frame = _CreateNewBmp32($Breite, $Hoehe, $ptr, $hbmp)
    $Struct = DllStructCreate('int[' & $Breite * $Hoehe & ']', $ptr)

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

    For $i = 0 To $Hoehe Step 1
    For $j = 0 To $Breite Step 1
    _Funktion($j, $i, $r, $g, $b)
    DllStructSetData($Struct, 1, '0xFF' & $r & $g & $b, $j * $Breite + $i)
    Next
    $Prozent = ($i * $Hoehe + $j) / $pxGes
    _GDIPlus_GraphicsDrawRect($hBuffer, 5, $Hoehe - 20, $Breite - 10, 15, $hPen)
    _GDIPlus_GraphicsFillRect($hBuffer, 7, $Hoehe - 18, ($Breite - 13) * $Prozent, 12, $hBrush)
    _Winapi_StretchBlt($hDC_GUI, 0, 0, $Breite * $Stretch, $Hoehe * $Stretch, $hDC_Backbuffer, 0, 0, $Breite, $Hoehe, $SRCCOPY)
    Next

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

    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_Shutdown()
    $Neu = True
    Sleep(100)

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

    EndFunc ;==>_BilderLaden

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

    Func _Save()
    Local $Pfad = FileSaveDialog('BildSpeichern', @ScriptDir & '\Muster', '(*,.png)', Default, Hex(Random(256, 16^3, 1), 3) & '.png')
    _GDIPlus_Startup()
    Local $bm = _GDIPlus_BitmapCreateFromHBITMAP($hbmp)
    _GDIPlus_ImageSaveToFile($bm, $Pfad)
    _GDIPlus_BitmapDispose($bm)
    _GDIPlus_Shutdown()
    EndFunc

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

    Func _Exit()
    ConsoleWrite('Blubb')
    _WinAPI_ReleaseDC($hGUI, $hDC_GUI)
    _Delete_Bitmap32($hDC_Backbuffer, $hbmp_Backbuffer)
    _Delete_Bitmap32($Frame, $hbmp)
    DllClose($h_NTDLL_DLL)
    Exit
    EndFunc ;==>_Exit

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

    Func _Delete_Bitmap32($hDC, $hBmp)
    _WinAPI_DeleteObject($hBmp)
    _WinAPI_ReleaseDC(0, $hDC)
    EndFunc ;==>_Delete_Bitmap32

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

    Func _CreateNewBmp32($iWidth, $iHeight, ByRef $ptr, ByRef $hBmp) ;erstellt leere 32-bit-Bitmap; Rückgabe DC und ptr und handle auf die Bitmapdaten
    ;by Andy
    Local $hcdc = _WinAPI_CreateCompatibleDC(0) ;Desktop-Kompatiblen DeviceContext erstellen lassen
    Local $tBMI = DllStructCreate($tagBITMAPINFO) ;Struktur der Bitmapinfo erstellen und Daten eintragen
    DllStructSetData($tBMI, "Size", DllStructGetSize($tBMI) - 4);Structgröße abzüglich der Daten für die Palette
    DllStructSetData($tBMI, "Width", $iWidth)
    DllStructSetData($tBMI, "Height", -$iHeight) ;minus =standard = bottomup
    DllStructSetData($tBMI, "Planes", 1)
    DllStructSetData($tBMI, "BitCount", 32) ;32 Bit = 4 Bytes => AABBGGRR
    Local $adib = DllCall('gdi32.dll', 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBMI), 'uint', $DIB_RGB_COLORS, 'ptr*', 0, 'ptr', 0, 'uint', 0)
    $hBmp = $adib[0] ;hbitmap handle auf die Bitmap, auch per GDI+ zu verwenden
    $ptr = $adib[4] ;pointer auf den Anfang der Bitmapdaten, vom Assembler verwendet
    ;_arraydisplay($adib)
    _WinAPI_SelectObject($hcdc, $hBmp) ;objekt hbitmap in DC
    Return $hcdc ;DC der Bitmap zurückgeben
    EndFunc ;==>_CreateNewBmp32

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

    Func _C($a, $b)
    Switch $b
    Case 0 ;Y
    Return @DesktopHeight / 2 - $a / 2
    Case 1 ;X
    Return @DesktopWidth / 2 - $a / 2
    EndSwitch
    EndFunc ;==>_C

    [/autoit]

    in die Func: _Funktion kann man eine Beliebige Formel zur Berechnung der Pixel eingeben.
    Ich habe mal die von TheShadowAE eingebaut zur Demonstration.

    Wenn man Auf Space drückt wird ein Neues Bild generiert. (mit einem Static Counter kann man so auch eine Bildreihe machen)
    wenn man S drückt kann man das Bild auch Speichern.


    Viel Spaß :P
    Und wenn jemand Formeln für gut aussehende Bilder findet lasst es mich wissen :P

  • Bei deiner Formel musst du noch $x und $y vertauschen um es wie ich zu haben, schönes Programm ^^

    EDIT: doch nicht, aber bei mir ist es wenn ich x und y vertausche auch so. Damit es so wie bei mir aussieht muss es aber trotzdem vertauscht werden

  • Es kann sein, dass da iwas vertauscht werden muss.
    Hab da nicht sooo drauf geachtet, da bei mir das Ergebnis immer rechteckig ist. (daher ist es egal^^)

  • Das sieht auch gut aus :P
    (0.09 war der Startwert und 900x900px Auflösung habs auf 450 verkleinert fürs Forum)

    Spoiler anzeigen
    [autoit]

    #include <Misc.au3>
    #include <WinAPIEX.au3>
    #include <GDIPlus.au3>

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

    Opt("MustDeclareVars", 1)
    Opt("GUIOnEventMode", 1)

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

    Global Const $Size = 900
    Global Const $Breite = $Size
    Global Const $Hoehe = $Size
    Global Const $Titel = 'Mustergenerator...'
    Global Const $WS_EX_LAYERED = 0x00080000
    Global Const $WS_POPUP = 0x80000000
    Global Const $SRCCOPY = 0x00CC0020
    Global Const $BLACKNESS = 0x00000042
    Global Const $h_NTDLL_DLL = DllOpen('ntdll.dll')
    Global Const $Stretch = 1

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

    Global $hGUI = GUICreate($Titel, $Breite * $Stretch, $Hoehe * $Stretch, _C($Breite * $Stretch, 1), _C($Hoehe * $Stretch, 0), $WS_POPUP, $WS_EX_LAYERED)
    GUISetBkColor(0x000000, $hGUI)
    WinSetTrans($hGUI, '', 255)
    GUISetOnEvent(-3, '_Exit', $hGUI)
    GUISetState(@SW_SHOW, $hGUI)

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

    Global $hDC_GUI = _WinAPI_GetDC($hGUI)
    Global $ptr_Backbuffer, $hbmp_Backbuffer
    Global $hDC_Backbuffer = _CreateNewBmp32($Breite, $Hoehe, $ptr_Backbuffer, $hbmp_Backbuffer)
    Global $DLL_Struct = DllStructCreate('int[' & $Breite * $Hoehe & ']', $ptr_Backbuffer)

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

    Global $Frame, $Struct, $ptr, $hbmp
    Global $Counter = 0
    Global $Mode = 0 ;0 = Vorwärts, 1 = Rückwärts
    Global $Neu = True

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

    OnAutoItExitRegister('_Exit')

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

    _NeuesBild()

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

    While Sleep(20)
    _Winapi_StretchBlt($hDC_GUI, 0, 0, $Breite * $Stretch, $Hoehe * $Stretch, $Frame, 0, 0, $Breite, $Hoehe, $SRCCOPY)
    If _IsPressed('20') Then _NeuesBild()
    If _IsPressed('53') Then _Save()
    WEnd

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

    ;##########################HIER EIGENE FORMELN EINBAUEN############################################
    ; r = Rotanteil
    ; g = Grünanteil
    ; b = Blauanteil
    ; Es muss das Hex-Format verwendet werden. Hex(blabla, 2)
    Func _Funktion($x, $y, ByRef $r1, ByRef $g1, ByRef $b1)

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

    Local $r, $g, $b, $w = $Breite, $h = $Hoehe, $p, $l, $col
    Local Static $Counter = 0
    $Counter += 1

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

    Local Static $start = 0.08
    If $Neu Then
    $Neu = False
    $start += 0.01
    ToolTip($start)
    EndIf

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

    $x = $x/$Breite * 256
    $y = $y/$Hoehe * 256

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

    ;~ $r=sqrt((($w/2)-$x)^2+(($h/2)-$y)^2)/150
    ;~ $p=atan2(($w/2)-$x,($h/2)-$y)
    ;~ $l=$r/(((1+cos(4*$p))^0.125)-(1/40*(1+cos(8*$p))^2))
    ;~ $col=int(1/4*(1-$l)^0.125*(1+$l^16)*(1+3*$r)*256)*256

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

    ;~ Return $col

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

    $r=$x*Sin($y*$start)
    $g=$x*Cos($y*$start)
    $b=$x*Tan($y*$start)

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

    $r1 = Hex($r, 2)
    $g1 = Hex($g, 2)
    $b1 = Hex($b, 2)

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

    Return 0
    EndFunc
    ;###################################################################################################

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

    func atan2($y,$x)
    return (2*atan($y/($x+sqrt($x*$x+$y*$y))))
    endfunc

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

    Func _NeuesBild()

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

    _GDIPlus_Startup()
    _Winapi_StretchBlt($hDC_Backbuffer, 0, 0, $Breite * $Stretch, $Hoehe * $Stretch, $Frame, 0, 0, $Breite, $Hoehe, $SRCCOPY)
    Local $hBuffer = _GDIPlus_GraphicsCreateFromHDC($hDC_Backbuffer)
    Local $hPen = _GDIPlus_PenCreate(0xFFFFFFFF)
    Local $hBrush = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)
    Local $g = '88', $r = '34', $b = '99'
    Local $Prozent = 0
    Local $pxGes = $Hoehe * $Breite, $col

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

    $Frame = _CreateNewBmp32($Breite, $Hoehe, $ptr, $hbmp)
    $Struct = DllStructCreate('int[' & $Breite * $Hoehe & ']', $ptr)

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

    For $i = 0 To $Hoehe Step 1
    For $j = 0 To $Breite Step 1
    $col = _Funktion($i, $j, $r, $g, $b)

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

    If $col Then
    DllStructSetData($Struct, 1, $col, $j * $Breite + $i + 1)
    Else
    DllStructSetData($Struct, 1, '0xFF' & $r & $g & $b, $j * $Breite + $i + 1)
    EndIf
    Next
    $Prozent = ($i * $Hoehe + $j) / $pxGes
    _GDIPlus_GraphicsDrawRect($hBuffer, 5, $Hoehe - 20, $Breite - 10, 15, $hPen)
    _GDIPlus_GraphicsFillRect($hBuffer, 7, $Hoehe - 18, ($Breite - 13) * $Prozent, 12, $hBrush)
    _Winapi_StretchBlt($hDC_GUI, 0, 0, $Breite * $Stretch, $Hoehe * $Stretch, $hDC_Backbuffer, 0, 0, $Breite, $Hoehe, $SRCCOPY)
    Next

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

    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_Shutdown()
    $Neu = True
    Sleep(100)

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

    EndFunc ;==>_BilderLaden

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

    Func _Save()
    Local $Pfad = FileSaveDialog('BildSpeichern', @ScriptDir & '\Muster', '(*,.png)', Default, Hex(Random(256, 16^3, 1), 3) & '.png')
    _GDIPlus_Startup()
    Local $bm = _GDIPlus_BitmapCreateFromHBITMAP($hbmp)
    _GDIPlus_ImageSaveToFile($bm, $Pfad)
    _GDIPlus_BitmapDispose($bm)
    _GDIPlus_Shutdown()
    EndFunc

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

    Func _Exit()
    ConsoleWrite('Blubb')
    _WinAPI_ReleaseDC($hGUI, $hDC_GUI)
    _Delete_Bitmap32($hDC_Backbuffer, $hbmp_Backbuffer)
    _Delete_Bitmap32($Frame, $hbmp)
    DllClose($h_NTDLL_DLL)
    Exit
    EndFunc ;==>_Exit

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

    Func _Delete_Bitmap32($hDC, $hBmp)
    _WinAPI_DeleteObject($hBmp)
    _WinAPI_ReleaseDC(0, $hDC)
    EndFunc ;==>_Delete_Bitmap32

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

    Func _CreateNewBmp32($iWidth, $iHeight, ByRef $ptr, ByRef $hBmp) ;erstellt leere 32-bit-Bitmap; Rückgabe DC und ptr und handle auf die Bitmapdaten
    ;by Andy
    Local $hcdc = _WinAPI_CreateCompatibleDC(0) ;Desktop-Kompatiblen DeviceContext erstellen lassen
    Local $tBMI = DllStructCreate($tagBITMAPINFO) ;Struktur der Bitmapinfo erstellen und Daten eintragen
    DllStructSetData($tBMI, "Size", DllStructGetSize($tBMI) - 4);Structgröße abzüglich der Daten für die Palette
    DllStructSetData($tBMI, "Width", $iWidth)
    DllStructSetData($tBMI, "Height", -$iHeight) ;minus =standard = bottomup
    DllStructSetData($tBMI, "Planes", 1)
    DllStructSetData($tBMI, "BitCount", 32) ;32 Bit = 4 Bytes => AABBGGRR
    Local $adib = DllCall('gdi32.dll', 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBMI), 'uint', $DIB_RGB_COLORS, 'ptr*', 0, 'ptr', 0, 'uint', 0)
    $hBmp = $adib[0] ;hbitmap handle auf die Bitmap, auch per GDI+ zu verwenden
    $ptr = $adib[4] ;pointer auf den Anfang der Bitmapdaten, vom Assembler verwendet
    ;_arraydisplay($adib)
    _WinAPI_SelectObject($hcdc, $hBmp) ;objekt hbitmap in DC
    Return $hcdc ;DC der Bitmap zurückgeben
    EndFunc ;==>_CreateNewBmp32

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

    Func _C($a, $b)
    Switch $b
    Case 0 ;Y
    Return @DesktopHeight / 2 - $a / 2
    Case 1 ;X
    Return @DesktopWidth / 2 - $a / 2
    EndSwitch
    EndFunc ;==>_C

    [/autoit]
    Spoiler anzeigen
    [autoit]

    #include <Misc.au3>
    #include <WinAPIEX.au3>
    #include <GDIPlus.au3>

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

    Opt("MustDeclareVars", 1)
    Opt("GUIOnEventMode", 1)

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

    Global Const $Size = 512
    Global Const $Breite = $Size
    Global Const $Hoehe = $Size
    Global Const $Titel = 'Mustergenerator...'
    Global Const $WS_EX_LAYERED = 0x00080000
    Global Const $WS_POPUP = 0x80000000
    Global Const $SRCCOPY = 0x00CC0020
    Global Const $BLACKNESS = 0x00000042
    Global Const $h_NTDLL_DLL = DllOpen('ntdll.dll')
    Global Const $h_MSIMG32_DLL = DllOpen('msimg32.dll')
    Global Const $gdi32 = DllOpen('gdi32.dll')
    Global Const $Stretch = 1

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

    Global $hGUI = GUICreate($Titel, $Breite * $Stretch, $Hoehe * $Stretch, _C($Breite * $Stretch, 1), _C($Hoehe * $Stretch, 0), $WS_POPUP, $WS_EX_LAYERED)
    GUISetBkColor(0x000000, $hGUI)
    WinSetTrans($hGUI, '', 255)
    GUISetOnEvent(-3, '_Exit', $hGUI)
    GUISetState(@SW_SHOW, $hGUI)

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

    _GDIPlus_Startup()

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

    Global $hDC_GUI = _WinAPI_GetDC($hGUI)
    Global $ptr_Backbuffer, $hbmp_Backbuffer
    Global $hDC_Backbuffer = _CreateNewBmp32($Breite, $Hoehe, $ptr_Backbuffer, $hbmp_Backbuffer)
    Global $DLL_Struct = DllStructCreate('int[' & $Breite * $Hoehe & ']', $ptr_Backbuffer)
    Global $hGraphics = _GDIPlus_GraphicsCreateFromHDC($hDC_GUI)

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

    Global $Frame, $Struct, $ptr, $hbmp
    Global $Counter = 0
    Global $Mode = 0 ;0 = Vorwärts, 1 = Rückwärts
    Global $Neu = True

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

    OnAutoItExitRegister('_Exit')

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

    ;~ _NeuesBild()
    Local $a = _PerlinNoise($Breite, $Hoehe)
    $Frame = $a[0]
    $ptr = $a[2]
    $hbmp = $a[1]

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

    While Sleep(20)
    _Winapi_StretchBlt($hDC_GUI, 0, 0, $Breite * $Stretch, $Hoehe * $Stretch, $Frame, 0, 0, $Breite, $Hoehe, $SRCCOPY)
    If _IsPressed('20') Then _Neu()
    If _IsPressed('53') Then _Save()
    WEnd

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

    Func _Neu()
    _Delete_Bitmap32($Frame, $hbmp)
    Local $a = _PerlinNoise($Breite, $Hoehe)
    $Frame = $a[0]
    $ptr = $a[2]
    $hbmp = $a[1]

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

    EndFunc

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

    ;##########################HIER EIGENE FORMELN EINBAUEN############################################
    ; r = Rotanteil
    ; g = Grünanteil
    ; b = Blauanteil
    ; Es muss das Hex-Format verwendet werden. Hex(blabla, 2)
    Func _Funktion($x, $y, ByRef $r1, ByRef $g1, ByRef $b1)

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

    Local $r, $g, $b, $w = $Breite, $h = $Hoehe, $p, $l, $col
    Local Static $Counter = 0
    $Counter += 1

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

    Local Static $start = 0.08
    If $Neu Then
    $Neu = False
    $start += 0.01
    ToolTip($start)
    EndIf

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

    $x = $x/$Breite * 256
    $y = $y/$Hoehe * 256

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

    ;~ $r=sqrt((($w/2)-$x)^2+(($h/2)-$y)^2)/150
    ;~ $p=atan2(($w/2)-$x,($h/2)-$y)
    ;~ $l=$r/(((1+cos(4*$p))^0.125)-(1/40*(1+cos(8*$p))^2))
    ;~ $col=int(1/4*(1-$l)^0.125*(1+$l^16)*(1+3*$r)*256)*256

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

    ;~ Return $col

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

    $r=$x*Sin($y*$start)
    $g=$x*Cos($y*$start)
    $b=$x*Tan($y*$start)

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

    $r1 = Hex($r, 2)
    $g1 = Hex($g, 2)
    $b1 = Hex($b, 2)

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

    Return 0
    EndFunc
    ;###################################################################################################

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

    func atan2($y,$x)
    return (2*atan($y/($x+sqrt($x*$x+$y*$y))))
    endfunc

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

    Func _PerlinNoise($b, $h)

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

    ;Es werden 6 Bilder erstellt und überlagert
    _Winapi_StretchBlt($hDC_Backbuffer, 0, 0, $Breite * $Stretch, $Hoehe * $Stretch, $Frame, 0, 0, $Breite, $Hoehe, $SRCCOPY)
    Local $bmp = _GDIPlus_BitmapCreateFromGraphics($b, $h, $hGraphics)
    Local $pxGes = 0, $col, $Prozent, $px = 0

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

    For $p = 0 To 5 Step 1 ;p = BildNummern
    For $x = 0 To $b/2^(5-$p) Step 1
    For $y = 0 To $h/2^(5-$p) Step 1
    $pxGes += 1
    Next
    Next
    Next

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

    Local $bmp2 = _GDIPlus_BitmapCloneArea($bmp, 0, 0, $b, $h)
    Local $bbuffer = _GDIPlus_ImageGetGraphicsContext($bmp2)
    Local $hBuffer = _GDIPlus_GraphicsCreateFromHDC($hDC_Backbuffer)
    Local $hPen = _GDIPlus_PenCreate(0xFFFFFFFF)
    Local $hBrush = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)

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

    For $p = 0 To 5 Step 1 ;p = BildNummern
    For $x = 0 To $b/2^(5-$p) Step 1
    For $y = 0 To $h/2^(5-$p) Step 1
    $px += 1
    Switch Random(0, 1, 1)
    Case 0
    $col = '0x'&Hex(255/2^$p, 2)&'000000'
    Case 1
    $col = '0x'&Hex(255/2^$p, 2)&'FFFFFF'
    EndSwitch
    _pix($bmp, $x, $y, $col)
    Next
    $Prozent = $px / $pxGes
    _GDIPlus_GraphicsDrawRect($hBuffer, 5, $Hoehe - 20, $Breite - 10, 15, $hPen)
    _GDIPlus_GraphicsFillRect($hBuffer, 7, $Hoehe - 18, ($Breite - 13) * $Prozent, 12, $hBrush)
    _Winapi_StretchBlt($hDC_GUI, 0, 0, $Breite * $Stretch, $Hoehe * $Stretch, $hDC_Backbuffer, 0, 0, $Breite, $Hoehe, $SRCCOPY)
    Next
    _GDIPlus_GraphicsDrawImageRectRect($bbuffer, $bmp, 0, 0, $b/2^(5-$p), $h/2^(5-$p), 0, 0, $b, $h)
    Next

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

    Global $_ptr, $_hbmp
    Global $_hdc = _CreateNewBmp32($b, $h, $_ptr, $_hbmp)
    Local $gra = _GDIPlus_GraphicsCreateFromHDC($_hdc)
    _GDIPlus_GraphicsDrawImage($gra, $bmp2, 0, 0)
    _GDIPlus_GraphicsDispose($gra)
    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_GraphicsDispose($bbuffer)
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_BitmapDispose($bmp)
    _GDIPlus_BitmapDispose($bmp2)
    Local $a[3] = [$_hdc, $_hbmp, $_ptr]
    Return $a
    EndFunc

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

    Func _pix($hBitmap, $ix, $iy, $color)
    DllCall($ghGDIPDll, "int", "GdipBitmapSetPixel", "hwnd", $hBitmap, "int", $iX, "int", $iY, "dword", $color)
    EndFunc ;==>pix

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

    Func _NeuesBild()

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

    ;~ _GDIPlus_Startup()
    _Winapi_StretchBlt($hDC_Backbuffer, 0, 0, $Breite * $Stretch, $Hoehe * $Stretch, $Frame, 0, 0, $Breite, $Hoehe, $SRCCOPY)
    Local $hBuffer = _GDIPlus_GraphicsCreateFromHDC($hDC_Backbuffer)
    Local $hPen = _GDIPlus_PenCreate(0xFFFFFFFF)
    Local $hBrush = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)
    Local $g = '88', $r = '34', $b = '99'
    Local $Prozent = 0
    Local $pxGes = $Hoehe * $Breite, $col

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

    $Frame = _CreateNewBmp32($Breite, $Hoehe, $ptr, $hbmp)
    $Struct = DllStructCreate('int[' & $Breite * $Hoehe & ']', $ptr)

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

    For $i = 0 To $Hoehe Step 1
    For $j = 0 To $Breite Step 1
    $col = _Funktion($i, $j, $r, $g, $b)

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

    If $col Then
    DllStructSetData($Struct, 1, $col, $j * $Breite + $i + 1)
    Else
    DllStructSetData($Struct, 1, '0xFF' & $r & $g & $b, $j * $Breite + $i + 1)
    EndIf
    Next
    $Prozent = ($i * $Hoehe + $j) / $pxGes
    _GDIPlus_GraphicsDrawRect($hBuffer, 5, $Hoehe - 20, $Breite - 10, 15, $hPen)
    _GDIPlus_GraphicsFillRect($hBuffer, 7, $Hoehe - 18, ($Breite - 13) * $Prozent, 12, $hBrush)
    _Winapi_StretchBlt($hDC_GUI, 0, 0, $Breite * $Stretch, $Hoehe * $Stretch, $hDC_Backbuffer, 0, 0, $Breite, $Hoehe, $SRCCOPY)
    Next

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

    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_BrushDispose($hBrush)
    ;~ _GDIPlus_Shutdown()
    $Neu = True
    Sleep(100)

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

    EndFunc ;==>_BilderLaden

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

    Func _Save()
    Local $Pfad = FileSaveDialog('BildSpeichern', @ScriptDir & '\Muster', '(*,.png)', Default, Hex(Random(256, 16^3, 1), 3) & '.png')
    _GDIPlus_Startup()
    Local $bm = _GDIPlus_BitmapCreateFromHBITMAP($hbmp)
    _GDIPlus_ImageSaveToFile($bm, $Pfad)
    _GDIPlus_BitmapDispose($bm)
    _GDIPlus_Shutdown()
    EndFunc

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

    Func _Exit()
    ConsoleWrite('Blubb')
    _WinAPI_ReleaseDC($hGUI, $hDC_GUI)
    _GDIPlus_Shutdown()
    _Delete_Bitmap32($hDC_Backbuffer, $hbmp_Backbuffer)
    _Delete_Bitmap32($Frame, $hbmp)
    DllClose($h_NTDLL_DLL)
    DllClose($h_MSIMG32_DLL)
    DllClose($gdi32)
    Exit
    EndFunc ;==>_Exit

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

    Func _Delete_Bitmap32($hDC, $hBmp)
    _WinAPI_DeleteObject($hBmp)
    _WinAPI_ReleaseDC(0, $hDC)
    EndFunc ;==>_Delete_Bitmap32

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

    Func _CreateNewBmp32($iWidth, $iHeight, ByRef $ptr, ByRef $hBmp) ;erstellt leere 32-bit-Bitmap; Rückgabe DC und ptr und handle auf die Bitmapdaten
    ;by Andy
    Local $hcdc = _WinAPI_CreateCompatibleDC(0) ;Desktop-Kompatiblen DeviceContext erstellen lassen
    Local $tBMI = DllStructCreate($tagBITMAPINFO) ;Struktur der Bitmapinfo erstellen und Daten eintragen
    DllStructSetData($tBMI, "Size", DllStructGetSize($tBMI) - 4);Structgröße abzüglich der Daten für die Palette
    DllStructSetData($tBMI, "Width", $iWidth)
    DllStructSetData($tBMI, "Height", -$iHeight) ;minus =standard = bottomup
    DllStructSetData($tBMI, "Planes", 1)
    DllStructSetData($tBMI, "BitCount", 32) ;32 Bit = 4 Bytes => AABBGGRR
    Local $adib = DllCall('gdi32.dll', 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBMI), 'uint', $DIB_RGB_COLORS, 'ptr*', 0, 'ptr', 0, 'uint', 0)
    $hBmp = $adib[0] ;hbitmap handle auf die Bitmap, auch per GDI+ zu verwenden
    $ptr = $adib[4] ;pointer auf den Anfang der Bitmapdaten, vom Assembler verwendet
    ;_arraydisplay($adib)
    _WinAPI_SelectObject($hcdc, $hBmp) ;objekt hbitmap in DC
    Return $hcdc ;DC der Bitmap zurückgeben
    EndFunc ;==>_CreateNewBmp32

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

    Func _C($a, $b)
    Switch $b
    Case 0 ;Y
    Return @DesktopHeight / 2 - $a / 2
    Case 1 ;X
    Return @DesktopWidth / 2 - $a / 2
    EndSwitch
    EndFunc ;==>_C

    [/autoit]

    1: eine Leicht veränderte Version
    2: Ein Versuch der PerlinNoise Implementierung. (mir gefällt das Resultat)

  • Da wird garantiert die Gleiche Methode eingesetzt zum Generieren der Grafik.
    Ich kenne das auch schon von Photoshop, aber ich habe mich nie damit befasst wie die Wolken eigentlich gemacht werden^^
    Ist leider ein bisschen langsam. Ich habs iwie nicht hinbekommen per StretchBlt unscharf zu blitten. Das wurde immer nach Nearest Pixel berechnet.
    Deshalb konnte ich auch keine dllstruct nutzen (geht schneller als SetPixel) und Imagedrawrectrect statt Blitten.

    Mal sehen was man noch so alles rausholen kann^^

  • Noch an update, vielen dank Andy, der hilft fleißig, jetzt sind die Farben richtig und es ist noch ein bisschen besser, ca. 9,5 FPS bei 500x500

    EDIT:
    Noch ein Update, der Geschwindigkeit wegen! 21,5 FPS

    Einmal editiert, zuletzt von TheShadowAE (7. Februar 2011 um 18:08)

  • Hi,

    Wahnsinn, was die trigonometrischen Funktionen für eine Performance fressen!
    Selbst durch komplett im Copro-Stack laufender Schleife(n) und ohne Verwendung zusätzlichen Speichers (also auch kein schreiben/lesen) ackert der Prozessor wie blöd....

    Spoiler anzeigen
    [autoit]

    #include "AssembleIt.au3"
    #include <GDIPlus.au3>
    #include <WindowsConstants.au3>

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

    ;in der Funktion _CreateNewBmp32() bitte
    ;entweder Structmember ändern in biSize, biWidth usw. , oder 3.3.8.1 verwenden, DANKE AUTOIT_DEV´S!!!
    ;##########################

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

    Local $bmp, $lock, $w = 500, $h = 500
    _GDIPlus_Startup()

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

    $hgui = GUICreate("", $w, $h)
    GUISetState()
    $DC_gui = _WinAPI_GetDC($hgui)

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

    Global $ptr, $hbmp
    $DC_bitmap = _CreateNewBmp32($w, $h, $ptr, $hbmp)

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

    Global $tCodeBuffer = DllStructCreate("byte[91]") ;reserve Memory for opcodes
    DllStructSetData($tCodeBuffer, 1, "0x9BDBE38B7424048B5424088B7C240C4ADB442408DB442404D9E8D944241089F1D9C2D9C4D8CAD9C0D9FED8CADB1FD9C0D9FFD8CADB5F01D9C0D9F2DDD8D8CADB5F02DDD8D8E283C7044975D6DDD8D9CBD8E1D9CB4A75C79BDBE3C3") ;write opcodes into memory

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

    $i = 0
    $t = TimerInit()
    For $bildwert = 6.25 To 6.3 Step 0.00033
    $i += 1
    ; $_assembleit_flag = 0
    ; Local $ret = _AssembleIt("float", "F", "int", $w, "int", $h, "ptr", $ptr, "float", $bildwert);stride,width,height,scan0,wert
    $ret = DllCall("user32.dll", "float", "CallWindowProcW", "ptr", DllStructGetPtr($tCodeBuffer), "int", $w, "int", $h, "ptr", $ptr, "float", $bildwert)
    _WinAPI_BitBlt($DC_gui, 0, 0, $w, $h, $DC_bitmap, 0, 0, $srccopy)
    Next
    $m = TimerDiff($t)
    MsgBox(0, "FPS=" & Int($i / $m * 1000), "Anzahl frames: " & $i)

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

    While GUIGetMsg() <> -3
    WEnd

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

    _DeleteBitmap32($DC_bitmap,$ptr,$hbmp)
    ;##########################

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

    Exit

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

    Func _CreateNewBmp32($iwidth, $iheight, ByRef $ptr, ByRef $hbmp) ;erstellt leere 32-bit-Bitmap; Rückgabe $HDC und $ptr und handle auf die Bitmapdaten
    $hcdc = _WinAPI_CreateCompatibleDC(0) ;Desktop-Kompatiblen DeviceContext erstellen lassen
    $tBMI = DllStructCreate($tagBITMAPINFO) ;Struktur der Bitmapinfo erstellen und Daten eintragen
    DllStructSetData($tBMI,1, DllStructGetSize($tBMI) - 4);Structgröße abzüglich der Daten für die Palette
    DllStructSetData($tBMI, 2, $iwidth)
    DllStructSetData($tBMI, 3, -$iheight) ;minus =standard = bottomup
    DllStructSetData($tBMI, 4, 1)
    DllStructSetData($tBMI, 5, 32) ;32 Bit = 4 Bytes => AABBGGRR
    $adib = DllCall('gdi32.dll', 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBMI), 'uint', 0, 'ptr*', 0, 'ptr', 0, 'uint', 0)
    $hbmp = $adib[0] ;hbitmap handle auf die Bitmap, auch per GDI+ zu verwenden
    $ptr = $adib[4] ;pointer auf den Anfang der Bitmapdaten, vom Assembler verwendet
    _WinAPI_SelectObject($hcdc, $hbmp) ;objekt hbitmap in DC
    Return $hcdc ;DC der Bitmap zurückgeben
    EndFunc ;==>_CreateNewBmp32

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

    Func _DeleteBitmap32($DC, $ptr, $hbmp)
    _WinAPI_DeleteDC($DC)
    _WinAPI_DeleteObject($hbmp)
    $ptr = 0
    EndFunc ;==>_DeleteBitmap32

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

    ;~ Func F()
    ;~ _("use32")
    ;~ ; _("org " & FasmGetBasePtr($Fasm))
    ;~ _("finit") ;Co Prozessor starten
    ;~ ;
    ;~ _("mov esi,[esp+4]") ;w
    ;~ _("mov edx,[esp+8]") ;h
    ;~ _("mov edi,[esp+12]") ;scan0

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

    ;~ _("dec edx")
    ;~ ;register im coprostack belegen,
    ;~ _("fild dword[esp+8]") ;h
    ;~ _("fild dword[esp+4]") ;w
    ;~ _("fld1") ;st0=1
    ;~ _("fld dword[esp+16]") ;st0=start st1=1.0 st2=w st3=h

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

    ;~ _("for_y:") ;Schleifenlabel
    ;~ _("mov ecx,esi") ;Schleifenzähler ecx für x
    ;~ _("fld st2") ;st0=x st1=start st2=1 st3=w st4=h
    ;~ _("for_x:") ;Schleifenlabel
    ;~ ;Berechung
    ;~ ;st0=x st1=start st2=1 st3=w st4=h

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

    ;~ _("fld st4") ;st0=y st1=x st2=start st3=1 st4=w st5=h
    ;~ _("fmul st0,st2") ;st0=y*start st1=x st2=start st3=1 st4=w st5=h
    ;~ _("fld st0") ;st0=y*start st1=y*start st2=x st3=start st4=1 st5=w st6=h
    ;~ _("fsin") ;st0=sin(y*start) st1=y*start st2=x st3=start st4=1 st5=w st6=h
    ;~ _("fmul st0,st2") ;st0=x*sin(y*start) st1=y*start st2=x st3=start st4=1 st5=w st6=h
    ;~ ;BB speichern im pixel
    ;~ _("fistp dword[edi]") ;st0=y*start st1=x st2=start st3=1 st4=w st5=h

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

    ;~ _("fld st0") ;st0=y*start st1=y*start st2=x st3=start st4=1 st5=w st6=h
    ;~ _("fcos") ;st0=cos(y*start) st1=y*start st2=x st3=start st4=1 st5=w st6=h
    ;~ _("fmul st0,st2") ;st0=x*cos(y*start) st1=y*start st2=x st3=start st4=1 st5=w st6=h
    ;~ ;GG speichern im pixel
    ;~ _("fistp dword[edi+1]") ;st0=y*start st1=x st2=start st3=1 st4=w st5=h

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

    ;~ _("fld st0") ;st0=y*start st1=y*start st2=x st3=start st4=1 st5=w st6=h
    ;~ _("fptan") ;st0=1 st1=tan(y*start) st2=y*start st3=x st4=start st5=1 st6=w st7=h
    ;~ _("fstp st0") ;st0 weg
    ;~ _("fmul st0,st2") ;st0=x*tan(y*start) st1=y*start st2=x st3=start st4=1 st5=w st6=h
    ;~ ;RR speichern im pixel
    ;~ _("fistp dword[edi+2]") ;st0=y*start st1=x st2=start st3=1 st4=w st5=h

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

    ;~ _("fstp st0") ;st0 weg
    ;~ ;st0=x st1=start st2=1 st3=w st4=h
    ;~ _("fsub st0,st2") ;x=x-1

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

    ;~ _("add edi,4") ;ein pixel weiter
    ;~ _("dec ecx") ;Zähler dekrementieren
    ;~ _("jnz for_x") ;Wenn Zähler <> 0 dann wiederhole Schleife

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

    ;~ _("fstp st0") ;st0=start st1=1 st2=w st3=h
    ;~ _("fxch st3")
    ;~ _("fsub st0,st1")
    ;~ _("fxch st3")
    ;~ _("dec edx") ;Zähler dekrementieren
    ;~ _("jnz for_y") ;Wenn Zähler <> 0 dann wiederhole Schleife

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

    ;~ _("finit") ; copro-stack cleanen
    ;~ _("ret") ;Ende
    ;~ EndFunc ;==>F

    [/autoit]


    aber trotzdem noch bissl schneller als AutoIt^^

    Kann mal einer der c++-Spezialisten die folgenden Zeilen verifizieren, mich würde interessieren, was ein c oder c++-Compiler aus dem Code macht!

    Spoiler anzeigen
    [autoit]

    For $y=0 To $h
    For $x=0 To $w
    $r=$x*Sin($y*$start)
    $g=$x*Cos($y*$start)
    $b=$x*Tan($y*$start)
    $color="0xFF"&Hex($r,2)&Hex($g,2)&Hex($b,2)
    _GDIPlus_BitmapSetPixel($bmp,$x,$y,$color)
    Next
    Next

    [/autoit]


    ....ansonsten bleibt einem wie im Tunnelflug (s. Assemblertut) nichts weiter übrig, als 3 Lookup-Tables a 1000 floats zu schreiben mit den Sin(), Cos(), und Tan()-Werten von 0 bis 2pi. Damit lässt sich bestimmt massig Zeit (auch in c++ rausholen)!

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    3 Mal editiert, zuletzt von Andy (5. Februar 2014 um 07:05)

  • kann es sein, dass "sub eax,1" schneller ist als "dec eax"
    (nur als bsp mit eax.)

    hab nämlich mal rumprobiert und iwie kam mir add und sub schneller vor als dec und inc.

    (vllt weiß auch jemand wo man ne Tabelle findet wie viele Takte welcher Befehl braucht. Ich hab schon stundenlang google gequält, aber nix befriedigendes gefunden)

  • Zitat

    kann es sein, dass "sub eax,1" schneller ist als "dec eax"
    (nur als bsp mit eax.)

    zum optimieren stoppe ich Schleifen aus, und zwar in der realen Anwendung. Da die modernen Prozessoren intern die Befehle auf verschiedene Pipelines umsortieren um so auch wesentlich besser auf Abhängigkeiten zu reagieren, kann es sein, dass ein "langsamer" Befehl (mit z.B. einem oder 2 Takten mehr) im Endeffekt das Programm schneller ablaufen lässt, weil er in einer anderen execution unit (und somit parallel) abgearbeitet wird! Und ich habe auch schon bemerkt, dass das weglassen von Befehlen Programme langsamer gemacht hat!

    Daher ist es auch Quatsch, ein for/to mit einer Million Schleifendurchläufen zu machen, und in der Schleife steht dann nur ein DEC eax oder SUB eax,1. Das optimiert der Prozessor nämlich völlig an der Realität vorbei!

    Also vor und nach einer Schleife ein RDTSC, dann hat man die Takte relativ gut ausgestoppt, je länger die Schleife, desto besser!

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (8. Februar 2011 um 20:13)

  • So hab jetzt mit Hilfe von Andy natürlich :P ein Script erstellt, womit ihr eure Rechnungsfunktionen ganz einfach einsetzn könnt und die Bitmap dann erhaltet ^^
    Viel Spaß damit:

    Spoiler anzeigen
    [autoit]

    #include "Fasm.au3"
    #include <WinApi.au3>
    #include <WindowsConstants.au3>
    Global $__structformuster=0,$Fasm

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

    ;Beispiel
    Local $w=500
    Local $h=500

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

    Global $start=0.01
    _Start()
    $ret=_Muster("_Formel",$w,$h);DC,PTR,HBMP
    _DCShow($ret[0],"Show",$w,$h)
    _DeleteBitmap32($ret[0],$ret[1],$ret[2])

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

    Func _Formel($x,$y)
    Local $r,$g,$b
    $r=$x*Sin($y*$start)
    $g=$x*Cos($y*$start)
    $b=$x*Tan($y*$start)
    If $x=0 Or $y=0 Then ConsoleWrite("X: "&$x&@CRLF&"Y: "&$y&@CRLF)
    Return "0xFF"&Hex($r,2)&Hex($g,2)&Hex($b,2)
    EndFunc

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

    Func _Start()
    $Fasm = FasmInit()
    FasmReset($Fasm)
    F()
    Local $bcode=FasmGetBinary($Fasm)
    Local $size=StringLen($bcode)/2-1
    $__structformuster=DllStructCreate("byte["&$size&"]")
    DllStructSetData($__structformuster,1,$bcode)
    FasmExit($Fasm)
    EndFunc

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

    Func _Muster($func,$w,$h,$user32="user32.dll")
    Local $ret[3] ;DC,PTR,HBMP
    If $__structformuster=0 Then Return -1
    Local $cb=DllCallbackRegister($func,"DWORD","int;int")
    Local $ptr
    $ret[0]=_CreateNewBmp32($w, $h, $ptr, $ret[2])
    DllCall($user32, "none", "CallWindowProcW", "ptr", DllStructGetPtr($__structformuster), "int", $w, "int", $h, "ptr", $ptr, "ptr", DllCallbackGetPtr($cb))
    DllCallbackFree($cb)
    $ret[1]=$ptr
    Return $ret
    EndFunc

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

    Func _DCShow($dc,$titel,$w,$h)
    Local $gui=GUICreate($titel,$w,$h,Default,Default,BitOR(0x00C00000,0x00080000)) ;bitor($WS_CAPTION,$WS_SYSMENU)
    Local $hdc=_WinAPI_GetDC($gui)
    GUISetState(@SW_SHOW,$gui)
    While GUIGetMsg()<>-3 ;$GUI_EVENT_CLOSE
    _winapi_bitblt($hdc,0,0,$w,$h,$dc,0,0,$srccopy)
    Sleep(10)
    WEnd
    GUIDelete($gui)
    Return 1
    EndFunc

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

    Func F()
    _("use32")
    _("org " & FasmGetBasePtr($Fasm))
    ;
    _("mov eax,[esp+4]") ;
    _("mov [w],eax") ;w
    _("mov eax,[esp+8]") ;
    _("mov [h],eax") ;h
    ;startadresse in ebx, dann muss ebx immer nur um 4 erhöht werden, um das nächste pixel zu schreiben
    _("mov ebx,[esp+12]") ;scan0
    _("mov eax,[w]") ;an das ende setzen, weil die schleifen auch von hinten anfangen
    _("imul eax,[h]") ;w*h
    _("imul eax,4") ;je pixel 4 bytes: w*h*4
    _("sub eax,4") ;4 zurück, weil von 0 an
    _("add ebx,eax") ;scan0 += size
    _("mov eax,[esp+16]") ;funcpointer
    _("mov [funcp],eax") ;

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

    _("mov edx,[h]") ;Schleifenzähler edx für y, For $edx=$h to 0 Step -1
    _("for_y:") ;Schleifenlabel

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

    _("mov ecx,[w]") ;Schleifenzähler ecx für x
    _("for_x:") ;Schleifenlabel

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

    ;Berechung außerhalb
    _("push ebx");Register sichern
    _("push ecx")
    _("push edx")

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

    _("push edx");Funktion außerhalb muss ($x,$y) sein, return color
    _("push ecx")
    _("call [funcp]")

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

    _("pop edx");Register wiederherstellen
    _("pop ecx")
    _("pop ebx")

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

    _("mov DWORD[ebx],eax") ;color in [ebx] (bild) schreiben, eax=rückgabe von func
    _("sub ebx,4") ;ein pixel weiter bzw. zurück

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

    _("dec ecx") ;Zähler dekrementieren
    _("jg for_x") ;Wenn Zähler >= 0 dann wiederhole Schleife
    _("dec edx") ;Zähler dekrementieren
    _("jg for_y") ;Wenn Zähler >= 0 dann wiederhole Schleife

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

    _("mov eax,0") ;Rückgabe: 0
    _("ret") ;Ende

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

    _("funcp dd 0") ;Variable auf Funktionspointer
    _("w dd 0") ;Speicher für Parameter reservieren
    _("h dd 0") ;
    EndFunc

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

    Func _($str)
    FasmAdd($Fasm, $str)
    EndFunc

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

    Func _CreateNewBmp32($iwidth, $iheight, ByRef $ptr, ByRef $hbmp) ;erstellt leere 32-bit-Bitmap; Rückgabe $HDC und $ptr und handle auf die Bitmapdaten
    $hcdc = _WinAPI_CreateCompatibleDC(0) ;Desktop-Kompatiblen DeviceContext erstellen lassen
    $tBMI = DllStructCreate($tagBITMAPINFO) ;Struktur der Bitmapinfo erstellen und Daten eintragen
    DllStructSetData($tBMI, "Size", DllStructGetSize($tBMI) - 4);Structgröße abzüglich der Daten für die Palette
    DllStructSetData($tBMI, "Width", $iwidth)
    DllStructSetData($tBMI, "Height", -$iheight) ;minus =standard = bottomup
    DllStructSetData($tBMI, "Planes", 1)
    DllStructSetData($tBMI, "BitCount", 32) ;32 Bit = 4 Bytes => AABBGGRR
    $adib = DllCall('gdi32.dll', 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBMI), 'uint', 0, 'ptr*', 0, 'ptr', 0, 'uint', 0)
    $hbmp = $adib[0] ;hbitmap handle auf die Bitmap, auch per GDI+ zu verwenden
    $ptr = $adib[4] ;pointer auf den Anfang der Bitmapdaten, vom Assembler verwendet
    _WinAPI_SelectObject($hcdc, $hbmp) ;objekt hbitmap in DC
    Return $hcdc ;DC der Bitmap zurückgeben
    EndFunc ;==>_CreateNewBmp32

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

    Func _DeleteBitmap32($DC, $ptr, $hbmp)
    _WinAPI_DeleteDC($DC)
    _WinAPI_DeleteObject($hbmp)
    $ptr = 0
    EndFunc ;==>_DeleteBitmap32

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • Ich habe mir mal den trigonometrischen Teil vorgeknöpft und

    Spoiler anzeigen
    [autoit]

    For $y=0 To $h
    For $x=0 To $w
    $r=$x*Sin($y*$start)
    $g=$x*Cos($y*$start)
    $b=$x*Tan($y*$start)
    $color="0xFF"&Hex($r,2)&Hex($g,2)&Hex($b,2)
    _GDIPlus_BitmapSetPixel($bmp,$x,$y,$color)
    Next
    Next

    [/autoit]

    ersetzt durch

    Spoiler anzeigen
    [autoit]

    $a=cos($start)
    $b=sin($start)
    $sin=0
    $cos=1

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

    For $y=0 To $h
    $ns=$b*$cos+$a*$sin
    $nc=$a*$cos-$b*$sin
    $cos=$nc
    $sin=$ns
    $tan=$sin/$cos
    For $x=0 To $w
    $rr=$x*$sin
    $gg=$x*$cos
    $bb=$x*$tan
    $color="0xFF"&Hex($rr,2)&Hex($gg,2)&Hex($bb,2)
    _GDIPlus_BitmapSetPixel($bmp,$x,$y,$color)
    Next
    Next

    [/autoit]


    Wie man deutlich sieht, werden die sehr prozessorlastigen Sinus- Kosinus- und Tangensfunktionen völlig aus den Schleifen herausgehalten!
    In den Schleifen werden nur noch Multiplikationen und Additionen berechnet. Wer nun denkt, man könnte so den AutoItcode extremst beschleunigen, der irrt!
    Was in C++ und auch ASM zu 10-12x schnellerem Code führt, läuft bei AutoIt ins Leere... 8|

    Für das folgende 32Bit-Script ist kein AssembleIt nötig, zum Vergleich mit dem "langsamen" ASM-code Zeile 23 und 24 auskommentieren und Script starten.
    Bei mir AMD 4850e @2,7Ghz ist das Verhältnis ca 1:10!
    Wer also z.B. in C++ viel mit Winkelfunktionen in Schleifen rechnen muss, der hat eine fette Optimierungsmöglichkeit!

    Spoiler anzeigen
    [autoit]

    ;#include "AssembleIt.au3"
    #include <GDIPlus.au3>
    #include <WindowsConstants.au3>

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

    ;in der Funktion _CreateNewBmp32() bitte
    ;entweder Structmember ändern in biSize, biWidth usw. , oder 3.3.8.1 verwenden, DANKE AUTOIT_DEV´S!!!
    ;##########################

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

    Local $bmp, $lock, $w = 500, $h = 500
    _GDIPlus_Startup()

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

    $hgui = GUICreate("", $w, $h)
    GUISetState()
    $DC_gui = _WinAPI_GetDC($hgui)
    Global $ptr, $hbmp
    $DC_bitmap = _CreateNewBmp32($w, $h, $ptr, $hbmp)

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

    ;schneller code
    Global $tCodeBuffer = DllStructCreate("byte[101]") ;reserve Memory for opcodes
    DllStructSetData($tCodeBuffer, 1, "0x9BDBE38B7424048B5424088B7C240C4ADB442404D9442410D9FBD9EED9E889F1D9C2D8CAD9C4D8CADEC1D9CAD8CCD9C9D8CBDEE1D9C1D8F1D9C5D8CBDB1FD9C5D8CADB5F01D9C5D8C9DB5F02D9E8DEEE83C7044975E2DDD8DB442404DDDD4A75BD9BDBE3C3") ;write opcodes into memory

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

    ;ursprüngliche schleife, 10x langsamer, die folgenden 2 zeilen einfach auskommentieren und script starten
    ;~ Global $tCodeBuffer = DllStructCreate("byte[91]") ;reserve Memory for opcodes
    ;~ DllStructSetData($tCodeBuffer, 1,"0x9BDBE38B7424048B5424088B7C240C4ADB442408DB442404D9E8D944241089F1D9C2D9C4D8CAD9C0D9FED8CADB1FD9C0D9FFD8CADB5F01D9C0D9F2DDD8D8CADB5F02DDD8D8E283C7044975D6DDD8D9CBD8E1D9CB4A75C79BDBE3C3") ;write opcodes into memory

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

    $i = 0
    $t = TimerInit()
    For $bildwert = 6.25 To 6.3 Step 0.000033
    $i += 1
    ;~ $_assembleit_flag = 0
    ;~ Local $ret = _AssembleIt("float", "F2", "int", $w, "int", $h, "ptr", $ptr, "float", $bildwert);stride,width,height,scan0,wert
    $ret = DllCall("user32.dll", "float", "CallWindowProcW", "ptr", DllStructGetPtr($tCodeBuffer), "int", $w, "int", $h, "ptr", $ptr, "float", $bildwert)
    _WinAPI_BitBlt($DC_gui, 0, 0, $w, $h, $DC_bitmap, 0, 0, $srccopy)
    Next
    $m = TimerDiff($t)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $m = ' & $m & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    MsgBox(0, "FPS=" & Int($i / $m * 1000), "Anzahl frames: " & $i)

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

    While GUIGetMsg() <> -3
    WEnd

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

    _GDIPlus_Shutdown()
    _DeleteBitmap32($DC_bitmap, $ptr, $hbmp)
    Exit

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

    Func _CreateNewBmp32($iwidth, $iheight, ByRef $ptr, ByRef $hbmp) ;erstellt leere 32-bit-Bitmap; Rückgabe $HDC und $ptr und handle auf die Bitmapdaten
    $hcdc = _WinAPI_CreateCompatibleDC(0) ;Desktop-Kompatiblen DeviceContext erstellen lassen
    $tBMI = DllStructCreate($tagBITMAPINFO) ;Struktur der Bitmapinfo erstellen und Daten eintragen
    ;entweder Structmember ändern in biSize, biWidth usw. , oder 3.3.8.1 verwenden, DANKE AUTOIT_DEV´S!!!
    DllStructSetData($tBMI, 1, DllStructGetSize($tBMI) - 4);Structgröße abzüglich der Daten für die Palette
    DllStructSetData($tBMI, 2, $iwidth)
    DllStructSetData($tBMI, 3, -$iheight) ;minus =standard = bottomup
    DllStructSetData($tBMI, 4, 1)
    DllStructSetData($tBMI, 5, 32) ;32 Bit = 4 Bytes => AABBGGRR
    $adib = DllCall('gdi32.dll', 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBMI), 'uint', 0, 'ptr*', 0, 'ptr', 0, 'uint', 0)
    $hbmp = $adib[0] ;hbitmap handle auf die Bitmap, auch per GDI+ zu verwenden
    $ptr = $adib[4] ;pointer auf den Anfang der Bitmapdaten, vom Assembler verwendet
    _WinAPI_SelectObject($hcdc, $hbmp) ;objekt hbitmap in DC
    Return $hcdc ;DC der Bitmap zurückgeben
    EndFunc ;==>_CreateNewBmp32

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

    Func _DeleteBitmap32($DC, $ptr, $hbmp)
    _WinAPI_DeleteDC($DC)
    _WinAPI_DeleteObject($hbmp)
    $ptr = 0
    EndFunc ;==>_DeleteBitmap32

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

    ;schnell
    ;~ Func F()
    ;~ _("use32")
    ;~ _("org " & FasmGetBasePtr($Fasm))
    ;~ _("finit") ;Co Prozessor starten

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

    ;~ _("mov esi,[esp+4]") ;w
    ;~ _("mov edx,[esp+8]") ;h
    ;~ _("mov edi,[esp+12]") ;scan0

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

    ;~ _("dec edx")
    ;~ ;register im coprostack belegen,
    ;~ _("fild dword[esp+4]") ;w, in der schleife dann x
    ;~ _("fld dword[esp+16]") ;st0=start st1=w
    ;~ _("fsincos") ;st0=a st1=b st1=w
    ;~ _("fldz") ;st0=sin st1=a st2=b st3=w
    ;~ _("fld1") ;st0=cos st1=sin st2=a st3=b st4=w

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

    ;~ _("for_y:") ;Schleifenlabel
    ;~ _("mov ecx,esi") ;Schleifenzähler ecx für x
    ;~ _("fld st2") ;st0=a st1=cos st2=sin st3=a st4=b st5=w
    ;~ _("fmul st0,st2") ;st0=a*sin st1=cos st2=sin st3=a st4=b st5=w
    ;~ _("fld st4") ;st0=b st1=a*sin st2=cos st3=sin st4=a st5=b st6=w
    ;~ _("fmul st0,st2") ;st0=b*cos st1=a*sin st2=cos st3=sin st4=a st5=b st6=w
    ;~ _("faddp st1,st0") ;st0=b*cos+a*sin st1=cos st2=sin st3=a st4=b st5=w
    ;~ _("fxch st2") ;st0=sin st1=cos st2=b*cos+a*sin st3=a st4=b st5=w
    ;~ _("fmul st0,st4") ;st0=b*sin st1=cos st2=b*cos+a*sin st3=a st4=b st5=w
    ;~ _("fxch") ;st0=cos $st1=b*sin st2=b*cos+a*sin st3=a st4=b st5=w
    ;~ _("fmul st0,st3") ;st0=a*cos $st1=b*sin st2=b*cos+a*sin st3=a st4=b st5=w
    ;~ _("fsubrp st1,st0") ;st0=cos st1=sin st2=a st3=b st4=w
    ;~ _("fld st1") ;st0=sin st1=cos st2=sin st3=a st4=b st5=w
    ;~ _("fdiv st0,st1") ;st0=tan st1=cos st2=sin st3=a st4=b st5=w

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

    ;~ _("for_x:") ;Schleifenlabel
    ;~ _("fld st5") ;st0=x st1=tan st2=cos st3=sin st4=a st5=b st6=w
    ;~ _("fmul st0,st3") ;st0=x*sin st1=tan st2=cos st3=sin st4=a st5=b st6=w
    ;~ ;BB speichern im pixel
    ;~ _("fistp dword[edi]") ;st0=tan st1=cos st2=sin st3=a st4=b st5=w
    ;~ _("fld st5") ;st0=x st1=tan st2=cos st3=sin st4=a st5=b st6=w
    ;~ _("fmul st0,st2") ;st0=x*cos st1=tan st2=cos st3=sin st4=a st5=b st6=w
    ;~ ;GG speichern im pixel
    ;~ _("fistp dword[edi+1]") ;st0=tan st1=cos st2=sin st3=a st4=b st5=w
    ;~ _("fld st5") ;st0=x st1=tan st2=cos st3=sin st4=a st5=b st6=w
    ;~ _("fmul st0,st1") ;st0=x*tan st1=tan st2=cos st3=sin st4=a st5=b st6=w
    ;~ ;RR speichern im pixel
    ;~ _("fistp dword[edi+2]") ;st0=tan st1=cos st2=sin st3=a st4=b st5=w
    ;~ _("fld1") ;st0=1 st1=tan st2=cos st3=sin st4=a st5=b st6=w
    ;~ _("fsubp st6,st0") ;st0=tan st1=cos st2=sin st3=a st4=b st5=w

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

    ;~ _("add edi,4") ;ein pixel weiter
    ;~ _("dec ecx") ;Zähler dekrementieren
    ;~ _("jnz for_x") ;Wenn Zähler <> 0 dann wiederhole Schleife
    ;~ _("fstp st0") ;st0=cos st1=sin st2=a st3=b st4=w

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

    ;~ _("fild dword[esp+4]") ;st0=w st1=cos st2=sin st3=a st4=b st5=w
    ;~ _("fstp st5") ;st0=cos st1=sin st2=a st3=b st4=w

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

    ;~ _("dec edx") ;Zähler dekrementieren
    ;~ _("jnz for_y") ;Wenn Zähler <> 0 dann wiederhole Schleife

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

    ;~ _("finit") ; copro-stack cleanen
    ;~ _("ret") ;Ende
    ;~ EndFunc ;==>F

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

    ;~ ;langsam
    ;~ Func F2()
    ;~ _("use32")
    ;~ ; _("org " & FasmGetBasePtr($Fasm))
    ;~ _("finit") ;Co Prozessor starten
    ;~ ;
    ;~ _("mov esi,[esp+4]") ;w
    ;~ _("mov edx,[esp+8]") ;h
    ;~ _("mov edi,[esp+12]") ;scan0

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

    ;~ _("dec edx")
    ;~ ;register im coprostack belegen,
    ;~ _("fild dword[esp+8]") ;h
    ;~ _("fild dword[esp+4]") ;w
    ;~ _("fld1") ;st0=1
    ;~ _("fld dword[esp+16]") ;st0=start st1=1.0 st2=w st3=h

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

    ;~ _("for_y:") ;Schleifenlabel
    ;~ _("mov ecx,esi") ;Schleifenzähler ecx für x
    ;~ _("fld st2") ;st0=x st1=start st2=1 st3=w st4=h
    ;~ _("for_x:") ;Schleifenlabel
    ;~ ;Berechung
    ;~ ;st0=x st1=start st2=1 st3=w st4=h

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

    ;~ _("fld st4") ;st0=y st1=x st2=start st3=1 st4=w st5=h
    ;~ _("fmul st0,st2") ;st0=y*start st1=x st2=start st3=1 st4=w st5=h
    ;~ _("fld st0") ;st0=y*start st1=y*start st2=x st3=start st4=1 st5=w st6=h
    ;~ _("fsin") ;st0=sin(y*start) st1=y*start st2=x st3=start st4=1 st5=w st6=h
    ;~ _("fmul st0,st2") ;st0=x*sin(y*start) st1=y*start st2=x st3=start st4=1 st5=w st6=h
    ;~ ;BB speichern im pixel
    ;~ _("fistp dword[edi]") ;st0=y*start st1=x st2=start st3=1 st4=w st5=h

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

    ;~ _("fld st0") ;st0=y*start st1=y*start st2=x st3=start st4=1 st5=w st6=h
    ;~ _("fcos") ;st0=cos(y*start) st1=y*start st2=x st3=start st4=1 st5=w st6=h
    ;~ _("fmul st0,st2") ;st0=x*cos(y*start) st1=y*start st2=x st3=start st4=1 st5=w st6=h
    ;~ ;GG speichern im pixel
    ;~ _("fistp dword[edi+1]") ;st0=y*start st1=x st2=start st3=1 st4=w st5=h

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

    ;~ _("fld st0") ;st0=y*start st1=y*start st2=x st3=start st4=1 st5=w st6=h
    ;~ _("fptan") ;st0=1 st1=tan(y*start) st2=y*start st3=x st4=start st5=1 st6=w st7=h
    ;~ _("fstp st0") ;st0 weg
    ;~ _("fmul st0,st2") ;st0=x*tan(y*start) st1=y*start st2=x st3=start st4=1 st5=w st6=h
    ;~ ;RR speichern im pixel
    ;~ _("fistp dword[edi+2]") ;st0=y*start st1=x st2=start st3=1 st4=w st5=h

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

    ;~ _("fstp st0") ;st0 weg
    ;~ ;st0=x st1=start st2=1 st3=w st4=h
    ;~ _("fsub st0,st2") ;x=x-1

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

    ;~ _("add edi,4") ;ein pixel weiter
    ;~ _("dec ecx") ;Zähler dekrementieren
    ;~ _("jnz for_x") ;Wenn Zähler <> 0 dann wiederhole Schleife

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

    ;~ _("fstp st0") ;st0=start st1=1 st2=w st3=h
    ;~ _("fxch st3")
    ;~ _("fsub st0,st1")
    ;~ _("fxch st3")
    ;~ _("dec edx") ;Zähler dekrementieren
    ;~ _("jnz for_y") ;Wenn Zähler <> 0 dann wiederhole Schleife

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

    ;~ _("finit") ; copro-stack cleanen
    ;~ _("ret") ;Ende
    ;~ EndFunc ;==>F2

    [/autoit]

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    2 Mal editiert, zuletzt von Andy (5. Februar 2014 um 07:06)