1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Andy

Beiträge von Andy

  • Sinus Sweep berechnen?

    • Andy
    • 9. Juni 2013 um 21:22
    Zitat

    Ich wünschte die Vorlesungsnotizen wären dementsprechend. Da steht dann nur: f(t) ist Zeitabhängig, "Lösungsweg trivial", Lösung

    Dann warte mal auf die Vorlesung Regelungstechnik, wenn du 4 DIN A4-Blätter quer aneinanderkleben musst, nur um die Gleichung draufzubekommen....Nach 1,5h ausmultiplizieren und umstellen raucht dir abends um 8 Uhr die Rübe, die Gleichung ist kaum kleiner geworden, und dann fällt vom Prof so ein knochentrockener Spruch: "Na meine Damen und Herren, wie lösen wir das Problem? Ganz einfach, bei Omega (oder war es t?? ) gleich unendlich führt die Funktion zu..........einer Spirale! Das sieht man doch auf den ersten Blick! Und nach einigen Sekunden schwingt sich das System ein, nächstes Thema!"

  • n-body Simulation

    • Andy
    • 9. Juni 2013 um 21:00

    Hi zusammen,

    die n-body Simulation hat mich schon immer interessiert, zufällig hatte die c´t-Redaktion in einer der letzten Ausgaben einen Bericht zum Thema.
    Allerdings haben die Jungs dort nicht in AutoIt auf einem Mono-Core getestet, sondern sind mit diversen Compileroptionen einem Xeon E5 2690, einem Opteron 6380 und einer Tesla K20X / Xeon Phi auf die Pelle gerückt 8o, die Dinger haben über den dicken Daumen 60 Prozessoren ;(
    Der Bericht ist jedenfalls lesenswert, gerade die C/C++-Fraktion bekommt wieder Prügel....(wem bspw. der Unterschied eines Array of Structures AoS zu einer Structure of Arrays SoA etwas sagt, der weiss auch warum...dafür gibts nämlich keine C/C++-interne Umorganisierung, welche mal eben den Faktor 2 in der Geschwindigkeit ausmacht, egal auf welchem Prozessor)

    Genug geschwafelt, zum Script:
    Da AutoIt alles andere als schnell ist, habe ich das Script schon für diverse Optimierungen vorgesehen 8o
    So werden keine Arrays verwendet, um die Koordinaten und die Geschwindigkeiten der Körper zu speichern, sondern Structs. Auf die kann man dann ohne das Schript umzubauen, bspw mit diversen Dll´s (C/C++ und Basic-Freaks, ich zähl auf euch!!!) oder mit asm-Code oder per OpenCL zugreifen.

    Der Code ist recht einfach, es wird die Anziehungskraft (Gravitation) zwischen allen beteiligten Körpern berechnet und daraus für jeden Körper die resultierende Bewegung ermittelt.
    Ich habe im Code überall die 3D-Darstellung mitgezogen, für die "Optik" aber nur 2D angezeigt, die z-Ebene ist also 0. Wer das ändern möchte, kommentiert einfach die entsprechende Zeile in der inneren Schleife aus, dann ist es "realistischer" :rofl:

    Da ich die GGEngine-UDF vom Kollegen TheShadowAE viel zu schade finde um sie versauern zu lassen, habe ich damit die "Grafik" erstellt.
    Natürlich wäre "richtiges" GDI+ auch gegangen, aber spätestens, wenn jemand per Shaderprogramm und OpenGL loslegen will, ist damit sowieso Schluss^^

    Los gehts mit 4 Körpern, bis zu 50 kann man noch mit AutoIt verarbeiten (Variable $particles), sollen es 10000 sein, ist Gehirnschmalz gefragt :thumbup:
    Je nach Geschwindigkeit und Ballung der Körper kann es sein, dass einer der Kandidaten aus dem Universum geschossen wird...c´est la vie... 8) bei mehr als 30 Körpern ist das aber auch unerheblich, ggf. einfach nochmal neu starten.
    Um nur die Körper, ohne den Kometenschweif, anzeigen zu lassen, muss der Parameter $cleanflag auf 1 gesetzt werden.

    Spoiler anzeigen
    [autoit]

    ;Formeln
    ;Kraft = Masse * Beschleunigung
    ; F = m * a ; Masse m=1 für alle Partikel gleich
    ;(1) F = a
    ;
    ;Beschleunigung = Geschwindigkeit / Zeit
    ; a = V / t ;Zeit t = 1 sec Intervall
    ; a = V
    ;
    ;Geschwindigkeit = Weg / Zeit
    ; V = s / t ;Zeit t = 1 sec Intervall
    ; V = s
    ;
    ; => wenn alle Massen = 1 und das Intervall t=1 dann
    ; ist der zurückgelegte Weg s so groß wie die
    ; resultierende aller Anziehungskräfte F

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

    #include <GGEngine.au3>
    ;#include <assembleit.au3>

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

    Global $w = 800 ;Fenstergröße
    Global $h = $w
    Global $ausgleich = 1E-3 ;falls mehrere partikel dieselben parameter haben
    Global $t = 1 ;Zeit
    Global $max = 0

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

    ;***********************************************************************
    Global $particles = 4 ;anzahl partikel
    Global $cleanflag = 0 ;0=weg zeigen, 1= nur pixel
    ;***********************************************************************

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

    _GGinit()
    $gui = _GGGUIcreate("n-body", $w, $h)
    $ptr1 = _GGGUIgetIMGptr($gui)

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

    $bmp_struct = DllStructCreate("dword[" & $w * $h & "]", $ptr1) ;bilddaten
    $leer_struct = DllStructCreate("char[" & $w * $w * 4 & "]", $ptr1) ;"doublebuffer"
    $leerstring = ""
    For $i = 1 To $w * $w * 4 ;
    $leerstring &= Chr(0)
    Next

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

    $col_struct = DllStructCreate("int[" & $particles & "]") ;Farben

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

    ;struct of arrays ist wesentlich schneller als array of structs (später mit asm-SIMD oder c++)
    $x_struct = DllStructCreate("float [" & $particles & "]") ;Koordinaten
    $y_struct = DllStructCreate("float [" & $particles & "]") ;
    $z_struct = DllStructCreate("float [" & $particles & "]") ;
    $vx_struct = DllStructCreate("float [" & $particles & "]") ;Geschwindigkeiten
    $vy_struct = DllStructCreate("float [" & $particles & "]") ;
    $vz_struct = DllStructCreate("float [" & $particles & "]") ;

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

    For $i = 1 To $particles
    DllStructSetData($x_struct, 1, Random($w / 4, $w * 3 / 4), $i) ;koordinaten mit zufälligen floats füllen
    DllStructSetData($y_struct, 1, Random($w / 4, $w * 3 / 4), $i) ;
    DllStructSetData($z_struct, 1, Random($w / 4, $w * 3 / 4), $i) ;
    ;~ DllStructSetData($vx_struct, 1, Random(-.051, .051), $i) ;geschwindigkeitsvektoren mit zufälligen floats füllen
    ;~ DllStructSetData($vy_struct, 1, Random(-.051, .051), $i) ;
    ;~ DllStructSetData($vz_struct, 1, Random(-.051, .051), $i) ;

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

    DllStructSetData($col_struct, 1, 0xFF000000 + Random(0, 0xFFFFFF, 1), $i) ;zufällige Farben
    Next

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

    ;vorbelegung als Demo für 2 Partikel
    DllStructSetData($vx_struct, 1, 0, 1) ;geschwindigkeitsvektoren mit zufälligen floats füllen
    DllStructSetData($vy_struct, 1, -.05, 1) ;

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

    DllStructSetData($vx_struct, 1, 0, 2) ;geschwindigkeitsvektoren mit zufälligen floats füllen
    DllStructSetData($vy_struct, 1, .05, 2) ;

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

    While Not _GGGUIclosed($gui)
    _nbody($particles) ;koordinaten berechnen
    _pic() ;pixel anzeigen
    WEnd

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

    _GGGUIdelete($gui)
    _GGfree()

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

    Func _nBody($particles)

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

    For $i = 1 To $particles ;jeder partikel
    $x = DllStructGetData($x_struct, 1, $i) ;x-koordinate
    $y = DllStructGetData($y_struct, 1, $i) ;y-koordinate
    $z = DllStructGetData($z_struct, 1, $i) ;z-koordinate
    $Fx = 0
    $Fy = 0
    $Fz = 0
    $vxi = 0
    $vyi = 0
    $vzi = 0
    For $j = 1 To $particles ;hat wechselwirkung mit jedem anderen Partikel
    $xj = DllStructGetData($x_struct, 1, $j) ;x-koordinate
    $yj = DllStructGetData($y_struct, 1, $j) ;y-koordinate
    $zj = DllStructGetData($z_struct, 1, $j) ;z-koordinate
    $dx = $xj - $x ;abstand zw. den einzelnen Partikeln
    $dy = $yj - $y
    $dz = $zj - $z
    ;$sqr = $dx * $dx + $dy * $dy + $dz * $dz + $ausgleich ;ausgleich, um 0 zu vermeiden 3D
    $sqr = $dx * $dx + $dy * $dy + $ausgleich ;ausgleich, um 0 zu vermeiden 2D
    $1sqr = 1 / ($sqr * Sqrt($sqr))
    If $1sqr > .01 Then $1sqr = .01 ;Anziehungskräfte begrenzen

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

    $Fx += $dx * $1sqr ;Gravitationskräfte addieren
    $Fy += $dy * $1sqr
    $Fz += $dz * $1sqr
    Next

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

    $vxi += $Fx * $t ;Geschwindigkeiten addieren
    $vyi += $Fy * $t
    $vzi += $Fz * $t

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

    $vx = DllStructGetData($vx_struct, 1, $i) ;V=s => s=V
    $vy = DllStructGetData($vy_struct, 1, $i) ;
    $vz = DllStructGetData($vz_struct, 1, $i) ;

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

    $v1 = $vx + $vxi ;neue Koordinate= alte Koordinate + Weg
    $v2 = $vy + $vyi
    $v3 = $vz + $vzi

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

    ;~ If $v1 > $max Then
    ;~ ConsoleWrite($v1 & @CRLF)
    ;~ $max = $v1
    ;~ EndIf

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

    ;~ if abs($v1)>.4 then $v1=$vx
    ;~ if abs($v2)>.4 then $v2=$vy
    ;~ if abs($v3)>.4 then $v3=$vz

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

    DllStructSetData($vx_struct, 1, $v1, $i) ;koordinaten eintragen
    DllStructSetData($vy_struct, 1, $v2, $i) ;
    DllStructSetData($vz_struct, 1, $v3, $i) ;

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

    Next

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

    EndFunc ;==>_nBody

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

    Func _pic() ;schreibt die koordinaten in die Bitmap
    If $cleanflag Then DllStructSetData($leer_struct, 1, $leerstring) ;hintergrund leeren

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

    For $i = 1 To $particles
    $x = DllStructGetData($x_struct, 1, $i) ;x-koordinate
    $y = DllStructGetData($y_struct, 1, $i) ;y-koordinate
    $z = DllStructGetData($z_struct, 1, $i) ;z-koordinate

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

    $vx = DllStructGetData($vx_struct, 1, $i) ;Geschwindigkeit = zurückgelegter Weg
    $vy = DllStructGetData($vy_struct, 1, $i) ;vy
    $vz = DllStructGetData($vz_struct, 1, $i) ;vz

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

    DllStructSetData($x_struct, 1, $x + $vx, $i);neue Koordinaten
    DllStructSetData($y_struct, 1, $y + $vy, $i)
    DllStructSetData($z_struct, 1, $z + $vz, $i);

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

    $col = DllStructGetData($col_struct, 1, $i) ;Farbe holen
    DllStructSetData($bmp_struct, 1, $col, Int($y) * $w + Int($x)) ;pixel setzen
    Next

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

    _GGGUIupdate($gui)
    EndFunc ;==>_pic

    [/autoit]

    TheShadowAE´s UDF
    Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.

    Dateien

    GGEngine.au3 136,01 kB – 447 Downloads
  • Rekursiver Baum

    • Andy
    • 5. Juni 2013 um 17:53

    sehr schön, man kann auch wunderbar "zufällige" Bäume erstellen

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    _GDIPlus_Startup()
    Global $pi = 3.14159265358979
    Global $hGui = GUICreate("Recursive Tree", 500, 500)
    Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGui)
    Global $hBrush = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)
    GUIsetState(@SW_SHOW)

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

    _GDIPlus_GraphicsDrawLine($hGraphic, 250, 500, 250, 250)
    RecursiveTree2(250, 250, 0, 35, 10, 0, 50, 3)

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

    While Sleep(10)
    _GDIPlus_GraphicsDrawLine($hGraphic, 250, 500, 250, 250)
    Switch GuiGetMsg()
    Case -3
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_Shutdown()
    Exit
    EndSwitch
    WEnd

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

    ;Parameter:
    ;$AltX - Start X
    ;$AltY - Start Y
    ;$nWinkel - 0
    ;$vWinkel - Um welche Zahl der Winkel erhöht / erniedrigt wird
    ;$Tiefe - Wie viele Ebenen der Baum hat
    ;$AnzahlAktuell - 0
    ;$Length - Länge des Anfangsastes
    ;$EllipseWidth - Größe der Knoten
    Func RecursiveTree($AltX, $AltY, $nWinkel, $vWinkel, $Tiefe, $AnzahlAktuell, $Length, $EllipseWidth)
    Local $newX, $newY, $newLength
    If ($Tiefe <> $AnzahlAktuell) Then
    ;Sinus = Y
    ;Cosinus = X
    $newLength = $Length - 5
    $newX = sin(($nWinkel + $vWinkel) * ($pi / 180)) * $newLength * -1
    $newY = cos(($nWinkel + $vWinkel) * ($pi / 180)) * $newLength * -1
    _GDIPlus_GraphicsDrawLine($hGraphic, $AltX, $AltY, $AltX + $newX, $AltY + $newY)
    _GDIPlus_GraphicsDrawEllipse($hGraphic, $AltX + $newX - $EllipseWidth, $AltY + $newY - $EllipseWidth, $EllipseWidth*2, $EllipseWidth*2)
    RecursiveTree($AltX + $newX, $AltY + $newY, $nWinkel + $vWinkel, $vWinkel, $Tiefe, $AnzahlAktuell + 1, $newLength, $EllipseWidth)
    $newX = sin(($nWinkel - $vWinkel) * ($pi / 180)) * $newLength * -1
    $newY = cos(($nWinkel - $vWinkel) * ($pi / 180)) * $newLength * -1
    _GDIPlus_GraphicsDrawLine($hGraphic, $AltX, $AltY, $AltX + $newX, $AltY + $newY)
    _GDIPlus_GraphicsDrawEllipse($hGraphic, $AltX + $newX - $EllipseWidth, $AltY + $newY - $EllipseWidth, $EllipseWidth*2, $EllipseWidth*2)
    RecursiveTree($AltX + $newX, $AltY + $newY, $nWinkel - $vWinkel, $vWinkel, $Tiefe, $AnzahlAktuell + 1, $newLength, $EllipseWidth)
    EndIf
    EndFunc ;==>RecursiveTree

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

    Func RecursiveTree2($AltX, $AltY, $nWinkel, $vWinkel, $Tiefe, $AnzahlAktuell, $Length, $EllipseWidth)
    Local $newX, $newY, $newLength
    If ($Tiefe <> $AnzahlAktuell) Then
    ;Sinus = Y
    ;Cosinus = X
    $newLength = $Length - random(0,25,1)
    $nWinkel = random(10,50,1)
    $vWinkel = random(10,50,1)
    $newX = sin(($nWinkel + $vWinkel) * ($pi / 180)) * $newLength * -1
    $newLength = $Length - random(0,25,1)
    $nWinkel = random(10,50,1)
    $vWinkel = random(10,50,1)

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

    $newY = cos(($nWinkel + $vWinkel) * ($pi / 180)) * $newLength * -1
    _GDIPlus_GraphicsDrawLine($hGraphic, $AltX, $AltY, $AltX + $newX, $AltY + $newY)
    _GDIPlus_GraphicsDrawEllipse($hGraphic, $AltX + $newX - $EllipseWidth, $AltY + $newY - $EllipseWidth, $EllipseWidth*2, $EllipseWidth*2)
    RecursiveTree($AltX + $newX, $AltY + $newY, $nWinkel + $vWinkel, $vWinkel, $Tiefe, $AnzahlAktuell + 1, $newLength, $EllipseWidth)
    $newLength = $Length - random(0,25,1)
    $nWinkel = random(10,50,1)
    $vWinkel = random(10,50,1)

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

    $newX = sin(($nWinkel - $vWinkel) * ($pi / 180)) * $newLength * -1
    $newLength = $Length - random(0,25,1)
    $nWinkel = random(10,50,1)
    $vWinkel = random(10,50,1)

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

    $newY = cos(($nWinkel - $vWinkel) * ($pi / 180)) * $newLength * -1
    _GDIPlus_GraphicsDrawLine($hGraphic, $AltX, $AltY, $AltX + $newX, $AltY + $newY)
    _GDIPlus_GraphicsDrawEllipse($hGraphic, $AltX + $newX - $EllipseWidth, $AltY + $newY - $EllipseWidth, $EllipseWidth*2, $EllipseWidth*2)
    RecursiveTree($AltX + $newX, $AltY + $newY, $nWinkel - $vWinkel, $vWinkel, $Tiefe, $AnzahlAktuell + 1, $newLength, $EllipseWidth)
    $newLength = $Length - random(0,25,1)
    $nWinkel = random(10,50,1)
    $vWinkel = random(10,50,1)
    $newX = sin(($nWinkel + $vWinkel) * ($pi / 180)) * $newLength * -1
    $newLength = $Length - random(0,25,1)
    $nWinkel = random(10,50,1)
    $vWinkel = random(10,50,1)

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

    $newY = cos(($nWinkel + $vWinkel) * ($pi / 180)) * $newLength * -1
    _GDIPlus_GraphicsDrawLine($hGraphic, $AltX, $AltY, $AltX + $newX, $AltY + $newY)
    _GDIPlus_GraphicsDrawEllipse($hGraphic, $AltX + $newX - $EllipseWidth, $AltY + $newY - $EllipseWidth, $EllipseWidth*2, $EllipseWidth*2)
    RecursiveTree($AltX + $newX, $AltY + $newY, $nWinkel + $vWinkel, $vWinkel, $Tiefe, $AnzahlAktuell + 1, $newLength, $EllipseWidth)
    $newLength = $Length - random(0,25,1)
    $nWinkel = random(10,50,1)
    $vWinkel = random(10,50,1)

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

    $newX = sin(($nWinkel - $vWinkel) * ($pi / 180)) * $newLength * -1
    $newLength = $Length - random(0,25,1)
    $nWinkel = random(10,50,1)
    $vWinkel = random(10,50,1)

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

    $newY = cos(($nWinkel - $vWinkel) * ($pi / 180)) * $newLength * -1
    _GDIPlus_GraphicsDrawLine($hGraphic, $AltX, $AltY, $AltX + $newX, $AltY + $newY)
    _GDIPlus_GraphicsDrawEllipse($hGraphic, $AltX + $newX - $EllipseWidth, $AltY + $newY - $EllipseWidth, $EllipseWidth*2, $EllipseWidth*2)
    RecursiveTree($AltX + $newX, $AltY + $newY, $nWinkel - $vWinkel, $vWinkel, $Tiefe, $AnzahlAktuell + 1, $newLength, $EllipseWidth)
    $newLength = $Length - random(0,25,1)
    $nWinkel = random(10,50,1)
    $vWinkel = random(10,50,1)
    $newX = sin(($nWinkel + $vWinkel) * ($pi / 180)) * $newLength * -1
    $newLength = $Length - random(0,25,1)
    $nWinkel = random(10,50,1)
    $vWinkel = random(10,50,1)

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

    $newY = cos(($nWinkel + $vWinkel) * ($pi / 180)) * $newLength * -1
    _GDIPlus_GraphicsDrawLine($hGraphic, $AltX, $AltY, $AltX + $newX, $AltY + $newY)
    _GDIPlus_GraphicsDrawEllipse($hGraphic, $AltX + $newX - $EllipseWidth, $AltY + $newY - $EllipseWidth, $EllipseWidth*2, $EllipseWidth*2)
    RecursiveTree($AltX + $newX, $AltY + $newY, $nWinkel + $vWinkel, $vWinkel, $Tiefe, $AnzahlAktuell + 1, $newLength, $EllipseWidth)
    $newLength = $Length - random(0,25,1)
    $nWinkel = random(10,50,1)
    $vWinkel = random(10,50,1)

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

    $newX = sin(($nWinkel - $vWinkel) * ($pi / 180)) * $newLength * -1
    $newLength = $Length - random(0,25,1)
    $nWinkel = random(10,50,1)
    $vWinkel = random(10,50,1)

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

    $newY = cos(($nWinkel - $vWinkel) * ($pi / 180)) * $newLength * -1
    _GDIPlus_GraphicsDrawLine($hGraphic, $AltX, $AltY, $AltX + $newX, $AltY + $newY)
    _GDIPlus_GraphicsDrawEllipse($hGraphic, $AltX + $newX - $EllipseWidth, $AltY + $newY - $EllipseWidth, $EllipseWidth*2, $EllipseWidth*2)
    RecursiveTree($AltX + $newX, $AltY + $newY, $nWinkel - $vWinkel, $vWinkel, $Tiefe, $AnzahlAktuell + 1, $newLength, $EllipseWidth)

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

    EndIf
    EndFunc ;==>RecursiveTree

    [/autoit]
  • Aus einem Text bestimmte Wörter auslesen

    • Andy
    • 4. Juni 2013 um 20:34

    Hi,

    Zitat

    Also das erste Wort (Hallo) in Variable $Wort1, das zweite Wort (Hans) in Variable $Wort2 und das dritte Wort (Meier) in Variable $Wort3

    [autoit]

    stringsplit()

    [/autoit]

    ist dein Freund, die Rückgabe erfolgt in einem Array!

    Spoiler anzeigen
    [autoit]

    #include <array.au3>

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

    $zeile="Hallo|Hans|Meier|1"

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

    $wort=stringsplit($zeile,"|",3)

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

    _arraydisplay($wort)

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

    for $woerter in $wort
    msgbox(0,0,$woerter,1)
    next

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

    for $i=0 to ubound($wort)-1
    msgbox(0,0,"Wort "&$wort[$i]&" an Position "&$i,1)
    next

    [/autoit]
  • 2D-Array > wie addiert man?

    • Andy
    • 4. Juni 2013 um 20:15

    Hi,
    Ich habe ehrlich gesagt keine Ahnung, was ein 2D Array damit zu tun hat, 2 Zahlen zu addieren....

    Zitat

    hier ist irgendwas nicht wies sein soll....

    yepp, der Kandidat erhält 100 Punkte!
    Schau dir mal an, welche Werte du zusammenzählst, das sind die ControlID´s der Input-Felder...

  • Audi Fan aus Köln

    • Andy
    • 4. Juni 2013 um 19:49

    Hi,

    einen Thread in einem Forum zu erstellen, in dem man nicht mal weiss um was es geht ist....hmpft... 8| , oder waren da einige "Kölsch" zuviel ?8o
    Völlig egal, in welchem Zusammenhang ich Autoit in google eingebe, nie kommt was mit nem Audi raus^^
    Somit also wenigstens was zum lachen, weiter so!

  • Schattenwurf bei Rechtecken [GDI+]

    • Andy
    • 2. Juni 2013 um 20:35
    Zitat

    Nachteile:
    - ohne echtzeit Verzerrung der Alphamap + schwarzer Grafik kein "langer" Schattenwurf möglich (wäre aber auch so nicht einfacher gewesen)

    der lange Schattenwurf, so wie in deinem Script, ist ein "schöner" effekt, aber idR nicht Praxisrelevant.

    Zitat

    - Berechnung des Vergrößerungsfaktors

    hmmm, ich überlege gerade, ob man überhaupt vergrössern muss!
    Mal angenommen, man möchte ein Quadrat "beschatten", Licht kommt von oben links. Kritisch ist dann der Bereich der rechten oberen und linken unteren Ecke. Wenn man dort ein wenig schummelt, also dort auf den Kernschatten verzichtet, dann reicht es, die Orginalgröße des Quadrates beizubehalten und den "Schatten nur nach rechts unten zu verschieben.

  • Schattenwurf bei Rechtecken [GDI+]

    • Andy
    • 2. Juni 2013 um 11:04

    Hi,
    andere Idee:
    "Grafik" abhängig vom Standpunkt der Lichtquelle rechteckig um Faktor x vergrößern. Abhängig von der Lichtquelle heisst, wenn das Licht von links oben kommt, muss nur der rechte untere Teil der Grafik vergrössert werden.
    Die Vergrösserung in Grautöne umwandeln (ggf. von innen nach aussen mit niedriger Intensität, bspw mit schon bestehendem Graustufenverlauf) ) und mit den ursprünglichen Pixeln des "Hintergrundes" verknüpfen.
    Dieses Verfahren ergäbe auch einen Kernschatten, und semi- oder auch transparente Grafiken würden korrekte Schatten werfen.

    Zitat

    Im Endeffekt sollen damit Pseudo3D Effekte (Voxel) erzielt werden. Dann ist ein Pixel nicht mehr 1x1, sondern 1x1x1.
    Dann kann man z.B. eine Grafik mit 16x16x16 Px erstellen und einen fast realistischen Schattenwurf hinbekommen ohne "echtes" 3D Rendering (also Schichtweise 2D).

    Made my day^^
    Wenn du die 3. Dimension hinzufügst, hast du bereits 3D und dann sind sämtliche anderen Berechnungen als die von "Ray´s" nur Augenwischerei für eine weitere 3D-Darstellung.
    Der Vorteil von 2D ist ja, 1/3 der Berechnungen per se einzusparen und somit schon 50% schneller zu sein!
    Du machst in deinen Beispielscripten nichts weiteres, als die 3D-Berechnungsmethoden auf 2D-Grafiken anzuwenden (Raytracing). Das ist imho gut und ausreichend schnell umgesetzt, die Frage ist, ob ein "realistischer" 2D-Schatten nicht einfacher erstellt werden kann.

    Das Problem ist ja, für jede 2D-Grafik, die einen "realistischen" Schatten werfen soll, eine "realistische" Höhe (Z-Achse) angeben zu müssen, und so aus 2D nun 3D mit allen nötigen Berechnungen zu machen.

  • Algorithmus zum Spiel "PrimeGame"

    • Andy
    • 1. Juni 2013 um 12:00

    Hi

    Zitat

    sein
    Gegner erhält die Zahlenwerte aller noch vorhandenen Teiler der ausgewählten
    Zahl; danach werden die ausgewählte Zahl und alle ihre Teiler entfernt und der
    andere Spieler ist am Zug.

    wenn ich das richtig verstehe, und Spieler1 eine 12 zieht, dann werden Spieler2 die Zahlen (Teiler) 1,2,3,4,6 also in Summe 16 gutgeschrieben....

  • Alles Gute minx, GtaSpider und allen anderen

    • Andy
    • 27. Mai 2013 um 19:10

    Glücklichen Herzwunsch und alles Gute!!!!
    Haut rein und lasst es richtig krachen :thumbup:

  • Bildanalyse Software

    • Andy
    • 26. Mai 2013 um 00:16
    Zitat

    Ich möchte ermitteln, ob ein gewisser Bildbereich eine bestimmte Pixel-CheckSum besitzt.

    Wozu denn so umständlich und langsam?
    Ermittle doch einfach, ob die beiden Bildbereiche gleich sind, dafür gibts in Botterkreisen reihenweise bekannte und sehr schnelle Scripte.

    Es wäre für alle beteiligten wesentlich einfacher, du würdest einige Beispielbilder mit deinen gewünschten Maßen bzw. Koordinaten einstellen, dann wäre ggf. das Script schön längst geschrieben....

  • MemoryDLL - Problem

    • Andy
    • 26. Mai 2013 um 00:10
    Zitat

    Das war mit einer Frage eigentlich gemeint...
    Warum das ein solches Problem ist, die DLL irgendwo auf der Platte auszulagern...

    genau so hatte ich das auch verstanden!
    IdR gibt es dafür keinen Grund, du müsstest mal den TE fragen!
    Allerdings hat dieser schon Probleme, einen einfachen API-Aufruf zu tätigen... :huh:

  • Bildanalyse Software

    • Andy
    • 25. Mai 2013 um 19:42

    Hi,
    ja, ähnliches gibt es hier im Forum, muss aber sicherlich für deine speziellen Bedürfnisse angepasst werden.
    Zeig doch mal bitte anhand von einem "Workflow" mit einigen Bildern was du genau machen möchtest.
    Ich hatte mal eine Software geschrieben, welche Spiralfedern anhand von Fotos auf 1/10mm ausmisst, als automatische Qualitätsanalyse.

  • MemoryDLL - Problem

    • Andy
    • 25. Mai 2013 um 19:32

    PainTain,
    soweit ist er schon^^
    Jetzt möchte er nur diese "includierte" Datei direkt aus dem Speicher ausführen, und nicht vorher auf die Platte auslagern

  • MemoryDLL - Problem

    • Andy
    • 25. Mai 2013 um 19:01
    Zitat

    Und die Funktion?

    steht in meinem Post und ist nicht von Ward...

    Wenn du Fragen zu Wards Funktionen hast, frag ihn selbst oder schau dir an, was seine Funktionen machen! Wo steht dort, dass ein anderes Verfahren als bei DllOpen() verwendet wird?
    Du dast nichtmal in die Funktion hereingeschaut!!!
    Ward verwendet einfach nur eine undokumentierte MS-Funktion "LocalCompact()" um damit die "LoadLibraryA()" aus der Kernel32.dll aufzurufen!?


    Nochmal, du hast keine Ahnung vom Thema und willst dich auch nicht damit beschäftigen. Du willst dich auch nicht mit dem PE-Format und schon garnicht mit den Relocations befassen.
    Das ist völlig in Ordnung so!
    Nicht in Ordnung ist, dass du alles andere ausser "auf einen Link zur passenden Funktion klicken" ignorierst.

    Und die Binary-UDF hat in keinster Weise etwas mit dem Thema zu tun, dort gehts darum, ZEICHENKETTEN zu bearbeiten!

    Zitat

    Gibt es nicht dort eine Möglichkeit, einen binären Code zu einer DLL umzuwandeln und dann zu nutzen?

    Nein, s.o.


    Btw, hier mal dein funktionierendes Beispiel...

    Spoiler anzeigen
    [autoit]

    #Include <MemoryDll.au3>

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

    main()

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

    Func main()
    Local $DllFile_0 = FileOpen('c:\WINDOWS\system32\User32.dll',16)
    Local $DllBin_0 = FileRead($DllFile_0)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $DllBin_0 = ' & stringleft($DllBin_0,100) & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    FileClose($DllFile_0)

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

    $DLL_handle_0 = MemoryDllOpen ($DllBin_0)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $DLL_handle_0 = ' & $DLL_handle_0 & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    $a=MemoryDllCall($Dll_Handle_0,'int','MessageBoxA','hwnd',0,'str','Some text','str','Some title','int',2)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $a = ' & $a[0] & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

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

    ;MemoryDllClose ($Dll_Handle_0)
    Exit
    EndFunc

    [/autoit]
  • MemoryDLL - Problem

    • Andy
    • 25. Mai 2013 um 12:19

    Hi,
    generell ist es möglich, eine DLL einfach in den Speicher zu kopieren und dort die Funktionen per Offset (und Startadresse des Speicherbereichs) aufzurufen.
    Das funktioniert natürlich nur so lange, wie die Funktionen in der DLL von dieser Methode "wissen", bzw. auf diese Methode hin programmiert wurden!
    Bspw. können Sprungbefehle einmal als "feste" Adresse, oder als "springe 53 Bytes vorwärts" kodiert werden, oder feste Adressen werden zum Speichern von Variablen verwendet.
    Was passiert nun, wenn die "feste Adresse" als Sprungziel in der DLL verwendet wird, oder als Speicherstelle 0xD345FFA2?
    Da die DLL beim einfachen kopieren in den Speicher an einer x-beliebigen Adresse stehen kann, führt der Sprung zu einer festen Adresse natürlich zu einem Absturz, weil der Code an dieser "festen" Sprungadresse irgend ein x-beliebiger Code sein kann!
    Wie kann man dieses Problem umgehen?
    Man (der Compiler) erzeugt beim Erstellen einer DLL eine Liste (in der DLL) , in der diese "festen" Adressen im Code enthalten sind.
    Wird nun, wie bspw. durch DllOpen() diese DLL an eine bestimmte Speicheradresse geladen, werden die "festen" Adressen im Code mit den Listenadressen abgeglichen, und das aktuelle Offset mit ihnen verrechnet und die "richtige" Adresse in den Code geschrieben.
    tranceexx hat diese Methode bei ihrer "Subrogation" verwendet, also gewissermassen "DLL laden zu Fuß". Damit ist es auch kein Problem, eine im Script enthaltene Dll in den Speicher zu laden und dort auszuführen.

    Wenn man Funktionen in einer DLL verwenden möchte, die "geheim" bleiben sollen, dann könnte man natürlich im Vorfeld per Disassembler oder GetProcAddress() die Startadresse innerhalb der Funktion herausfinden und dann einfach per CallAddress() anspringen!
    Ein DllCall( "dll", "return type", "function" [, type1, param1...) im Code offenbart direkt die verwendete Funktion und Dll, aber aus einem DllCallAddress("int",$Func_address, $type1, $para1) liest niemand heraus, ob nun eine Kernelfunktion, oder eine Funktion einer eigenen Dll angesprungen wird!

  • Bitcoin Miner mit AutoIt programmieren. Möglich?

    • Andy
    • 22. Mai 2013 um 21:36

    minx

    Zitat

    Eigentlich müsste es eher "AutoIt Phoenix GUI" heißen. Naja, wers braucht...

    Kein Mensch braucht das, auch mit dem Hintergrund, dass Phoenix mittlerweile in Version 2.0 vorliegt und nicht mehr per Parameter in einer Batchdatei, sondern per *.INI angesprochen wird

    Zitat

    ...SHA256...WinAPI... Habs ausprobiert, macht bei mir kaum Unterschied. Maximal ca. 20 ms.....aber die Zeit ist fürs Minen immer noch viel zu groß.

    Ja, der Code könnte von 1876 sein, da hat einer mit dem Schalter -8086/8088 compiliert....
    Sicherlich könnte man noch Faktor 2-3 rausholen, aber dann wäre man immer noch Faktor 10-20 langsamer als eine Billig-Grafikkarte!
    Und die CL-Kernel sind ja schon vorhanden!

  • Bitcoin Miner mit AutoIt programmieren. Möglich?

    • Andy
    • 22. Mai 2013 um 07:19
    Zitat

    sowieso mit der WinAPI rechnet, wird das wohl kaum schneller sein.

    *hust*
    *husthust*
    *räusper* *husthust*

    [und das von einem, der es sooooo viel besser weiss....]

  • Bitcoin Miner mit AutoIt programmieren. Möglich?

    • Andy
    • 21. Mai 2013 um 21:31

    Hi,

    Zitat

    Bei einem kleinen Testskript (ohne OpenCL; nur AutoIt + Crypt) komme ich auf ca. 3200 Hashes pro Sekunde.

    cool, immer her damit! 8o
    Woher holst du dir deine Blöcke ab bzw wie stimmst du dich mit den anderen Nodes ab?

    Zitat

    Kombiniert mit der aktuellen Wahrscheinlichkeit würde es also nur ca. 475000 Jahre dauern, bis ich damit einen Block gelöst hätte.

    Dafür haben wir ja den "Turbo" in Form von div. OpenCL-Kernels, die wir nur noch "füttern" müssen :thumbup:
    Ggf. würde sich ein sogar ein "AutoIt-Pool" lohnen, die geminten Bitcoins könnte man an AutoIt.de spenden.
    Mitmachen könnte jeder, der sich den Client auf den Rechner lädt und "nebenbei" bissl minen möchte. Und nicht zuletzt ein schönes Community-Projekt, da sich auch jeder an der Programmierung beteiligen könnte!

  • Proxy Schleife mit HttpSetProxy

    • Andy
    • 20. Mai 2013 um 13:02
    Spoiler anzeigen
    [autoit]

    #include <String.au3>
    #include <Array.au3>
    #include <Inet.au3>

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

    ;#############################################################################
    ; P R O X Y - C H E C K

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

    $proxyliste = "77.94.48.4:80;147.31.182.137:3128;8.8.8.8:80;http://www.autoit.de"

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

    $proxy = StringSplit($proxyliste, ";", 3) ;alle proxys...
    $alle = ""
    For $i = 0 To UBound($proxy) - 1 ;...nacheinander durchlaufen

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

    $pingproxy = StringSplit($proxy[$i], ":", 3) ;port entfernen
    $ping = Ping($pingproxy[0]) ;pingen, ob erreichbar

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

    If $ping Then ;wenn rechner erreichbar
    HttpSetProxy(2, $proxy[$i]) ;proxy setzen
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $proxy[$i] = ' & $proxy[$i] & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    ToolTip("Bitte warten, es wird versucht, über " & $proxy[$i] & " zu lesen!") ;Info
    $read = InetRead("http://www.wieistmeineip.de/", 16);source lesen
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $read = ' & StringLeft($read, 200) & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    Else ;wenn Rechner nicht erreichbar
    $read = "" ;dann gibts auch nix zu lesen^^
    EndIf

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

    If $read = "" Then ;wenn es nix zu lesen gibt
    $IP = " keine IP" & @CRLF ;gibts auch keine IP!!!
    Else ;ansonsten
    Local $aArray = _StringBetween(BinaryToString($read, 4), '<h1 class="ip">', '</h1>');IP ermitteln
    If IsArray($aArray) Then ;und wenn diese IP existiert,
    $IP = " die IP " & $aArray[0] & @CRLF ;anzeigen
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $aArray[0] = ' & $aArray[0] & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    Else ;ansonsten
    $IP = " keine IP" & @CRLF ;gibts nix anzuzeigen
    EndIf
    EndIf
    $alle &= "www.wieistmeineip.de meldet über den Proxy " & $proxy[$i] & $IP;Meldung
    Next
    Tooltip("")
    MsgBox(0, "Proxy abfrage beendet mit Ergebnis:", $alle)

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

    ;#############################################################################

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

    //EDIT mit Kommentaren

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™