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. eukalyptus

Beiträge von eukalyptus

  • Geschwindigkeitsvergleich C, Basic, Pascal Unerwartetes Ergebnis?!

    • eukalyptus
    • 5. Juli 2011 um 10:52

    Hi

    Ich brauche für ein Projekt ein paar schnelle Berechnungen, deshalb hab ich einen Geschwindigkeitsvergleich gemacht, damit ich dann die schnellste Variante verwenden kann.
    Aus diesem Grund hab ich in Dev-C, FreeBasic und FreePascal DLL´s geschrieben, die die benötigten Rechenoperationen verwenden und die Zeit gemessen

    Allerdings ist das Ergebnis ganz anders, als erwartet!
    Ich dachte, daß es die Reihenfolge C, Pascal, Basic wäre, aber es ist genau andersrum:

    Code
    Basic: 631ms
    Pascal: 1221ms
    C: 2538ms

    Hab ich was übersehen, oder muß der Code in C/Pascal anders geschrieben werden; gibt es weitere Optimierungen bei den Compilern...?
    Oder ist der FreeBasic Compiler einfach sehr gut?

    C-Code:

    Spoiler anzeigen
    C
    #include <windows.h>
    #include <math.h>
    
    
    extern "C" __declspec( dllexport ) DWORD __stdcall Calc (DWORD iSteps);
    
    
    DWORD Calc (DWORD iSteps)
    {
        int iLoop, iStep;
        float const Pi = 3.14159265358979;
        float fX, fY, fA;
        for (iStep=0; iStep<=iSteps; iStep++)
        {
         for (iLoop=0; iLoop<=359; iLoop++)
         {
          fA = iLoop * (Pi / 180);
          fX = cos(fA) * 100;
          fY = sin(fA) * 100;
          fA = atan2(fY, fX);
          fA = sqrt(pow(fX, 2) + pow(fY, 2));
         }
        }
        return iSteps;
    }
    
    
    BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
    {
        return TRUE;
    }
    Alles anzeigen

    Pascal-Code:

    Spoiler anzeigen
    Code
    library Speed;
    
    
    uses
      Math;
    
    
      function Calc(iSteps: DWord): dword; stdcall;
      var
        fX, fY, fA: single;
        iLoop, iStep: DWord;
      begin
        for iStep := 1 to iSteps do
          for iLoop := 0 to 359 do
          begin
            fA := iLoop * (PI / 180);
            fX := Cos(fA) * 100;
            fY := Sin(fA) * 100;
            fA := ArcTan2(fY, fX);
            fA := Sqrt(power(fX, 2) + power(fY, 2));
          end;
        Result := iSteps;
      end;
    
    
    
    
    exports Calc;
    
    
    begin
    end.
    Alles anzeigen

    Basic-Code:

    Spoiler anzeigen
    Code
    #Include "windows.bi"
    
    
    Public Const Pi = 3.14159265358979
    
    
    Function Calc Alias "Calc"(ByVal iSteps As Dword) As Dword Export
        Dim fX As Single
        Dim fY As Single
        Dim fA As Single
        Dim iLoop As Dword
        Dim iStep As Dword
    
        For iStep = 1 To iSteps
            For iLoop = 0 To 359
                fA = iLoop * (PI / 180)
                fX = Cos(fA) * 100     
                fY = Sin(fA) * 100
                fA = ATan2(fY, fX)     
                fA = Sqr(fX^2 + fY^2)    
            Next                   
        Next
    
    
        Return iSteps
    End Function
    Alles anzeigen

    Würd mich interessieren, was die Profis dazu sagen...

    Edit: Kann jemand testen, welche Ergebnisse mit anderen Compilern erreicht werden (VisualC++, Delphi...)

    Danke

    Dateien

    SpeedTest.zip 177,15 kB – 554 Downloads
  • Umrechnung von Millisekunden

    • eukalyptus
    • 1. Juli 2011 um 13:08

    Hi

    Du musst bei _BigNum_Div angeben, wieviele Dezimalstellen du haben willst, ansonsten wird gerundet

    [autoit]

    #include "BigNum.au3"

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

    $MS = 1234
    ConsoleWrite($MS & @CRLF)

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

    $Result = _BigNum_Div($MS, 1000, 20)
    ConsoleWrite($Result & @CRLF)

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

    $Result = _BigNum_Div($Result, 60, 20)
    ConsoleWrite($Result & @CRLF)

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

    $Result = _BigNum_Mul($Result, 60)
    ConsoleWrite($Result & @CRLF)

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

    $Result = _BigNum_Mul($Result, 1000)
    ConsoleWrite($Result & @CRLF)

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

    $Result = _BigNum_Round($Result, 0)
    ConsoleWrite("! " & $Result & " = " & $MS & @CRLF)

    [/autoit]
  • The Simple Piano Simulator

    • eukalyptus
    • 30. Juni 2011 um 23:32

    Hab das mal kurz probiert und hier ist eine kleine Starthilfe via Bass.dll die nur 1 Sample für die gesammte Oktave verwendet:

    EDIT: habs nochmal überarbeitet, nun 1 Sample für mehr als 2 Oktaven; das ist natürlich schon zu extrem, soll aber nur zeigen, wie es in etwa geht...

    Spoiler anzeigen
    [autoit]

    #AutoIt3Wrapper_UseX64=n
    #include <Bass.au3>

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

    Global $aKeys = _CreateKeyMatrix("y|s|x|d|c|v|g|b|h|n|j|m|q|2|w|3|e|r|5|t|6|z|7|u|i|9|o|0|p", "|")

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

    HotKeySet("{ESC}", "_Exit")

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

    Global $hGui = GUICreate("Piano example", 200, 100)
    GUISetState()

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

    _BASS_Startup()
    _BASS_Init(0, -1, 44100, 0, "")

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

    Global $aSample[$aKeys[0] + 1]
    $aSample[0] = $aKeys[0]

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

    Global $fFreqOriginal = _Note2Freq(69)
    For $i = 1 To $aKeys[0]
    $aSample[$i] = _Bass_SampleLoad(False, @ScriptDir & "\Piano_c2.mp3", 0, 0, 12, 0)
    $aInfo = _BASS_SampleGetInfo($aSample[$i])
    $aInfo[0] = _Note2Freq(69 + $i - 13) * $aInfo[0] / $fFreqOriginal
    _BASS_SampleSetInfo($aSample[$i], $aInfo)
    Next

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

    Global $tKeys = DllStructCreate('byte[256];')
    Global $pKeys = DllStructGetPtr($tKeys)
    DllCall('user32.dll', 'int', 'GetKeyboardState', 'ptr', DllStructGetPtr($tKeys))
    Global $aToogle[$aKeys[0] + 1]
    For $i = 1 To $aKeys[0]
    $aToogle[$i] = BitAND(DllStructGetData($tKeys, 1, $aKeys[$i]), 0x0F)
    Next

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

    While 1
    DllCall('user32.dll', 'int', 'GetKeyboardState', 'ptr', DllStructGetPtr($tKeys))
    For $i = 1 To $aKeys[0]
    If BitAND(DllStructGetData($tKeys, 1, $aKeys[$i]), 0xF0) Then _Play($i, BitAND(DllStructGetData($tKeys, 1, $aKeys[$i]), 0x0F))
    Next
    Sleep(10)
    WEnd

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

    Func _Play($iNote, $bToogle)
    If $aToogle[$iNote] = $bToogle Then Return
    $aToogle[$iNote] = $bToogle
    Local $hChannel = _BASS_SampleGetChannel($aSample[$iNote], False)
    _BASS_ChannelPlay($hChannel, True)
    EndFunc ;==>_Play

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

    Func _Note2Freq($iNote, $iConcertPitch = 440)
    Return $iConcertPitch * 2 ^ (($iNote - 69) / 12)
    EndFunc ;==>_Note2Freq

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

    Func _CreateKeyMatrix($sKeys, $sDelim = "|")
    Local $aSplit = StringSplit($sKeys, $sDelim)
    Local $aKeys[$aSplit[0] + 1]
    $aKeys[0] = $aSplit[0]
    For $i = 1 To $aSplit[0]
    $aKeys[$i] = Asc(StringUpper($aSplit[$i])) + 1
    Next
    Return $aKeys
    EndFunc ;==>_CreateKeyMatrix

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

    Func _Exit()
    For $i = 1 To $aSample[0]
    _BASS_SampleFree($aSample[$i])
    Next
    _BASS_Free()
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    Nur rudimentär umgesetzt...
    gespielt werden kann mit den Tasten:

    Code
    2 3   5 6 7   9 0Q W E R T Z U I O P S D   G H JY X C V B N M

    Beenden mit ESC

    btw.: ich hab ein paar Bugs bei den _Bass_Sample-Funktionen entdeckt, also bitte die Bass.au3 aus dem angehängten Zip Archiv verwenden, bis ich das im Bass Thread gefixt hab...

    E

  • The Simple Piano Simulator

    • eukalyptus
    • 30. Juni 2011 um 20:49

    Hier könnt ihr euch abgucken, wie ich die Tastatur via GDI+ gemacht hab.
    Es handelt sich um die Funktion _BitmapCreateKeyboard
    komplexer Synthesizer (Bass.dll)

    Des weiteren ist es nicht unbedingt nötig für jede Taste ein mp3 mitzuliefern.
    Via Bass.dll bestünde die Möglichkeit ein Sample ein paar Noten rauf und runter zu pitchen; so hätte man mit 2 Samples pro Oktave schon annehmbare Ergebnisse...
    (Auch Sustain wäre möglich, aber das ist wohl noch etwas zu früh ;))

    E

  • An die Mathe Profis: Schnitt zweier Flächen?

    • eukalyptus
    • 29. Juni 2011 um 10:39
    Zitat von nuts

    Mal eine Freifeldmessung angenommen ist der Schallpegel doch auch abhängig von der Position der Schallquelle.
    Bei der angenommen Nierenform (gleich ausgerichtet) bzw. beim Kugelmikro wäre ein möglicher Punkt für die Schallquelle genau der Mittelpunkt zwischen Mikro1 und Mikro2.
    Alle weiteren Punkte liegen auf einer Geraden, die genau im rechten Winkel zur Geraden durch Mikro1 und Mirko2 verläuft.

    Würde sich auch in Vektoren ausdrücken lassen. Per autoit kann ich dir das aber mangels Können nicht skripten.

    Ich hab das vielleicht etwas umständlich erklärt...
    Ich will eben genau den Punkt der Schallquelle ermitteln, von dem aus die Mikros denselben Schallpegel bekommen

    Mit Vektoren stell ich mir das in etwa so vor: Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.
    Das Verhältnis der roten zu den blauen Linien soll gleich sein, so ergibt sich dann die grüne Linie
    Und hier fehlt mir nun komplett der Ansatz, wie ich das umsetzen soll...

    E

    Dateien

    1.GIF 2,96 kB – 0 Downloads
  • An die Mathe Profis: Schnitt zweier Flächen?

    • eukalyptus
    • 28. Juni 2011 um 22:40

    Hi

    Ich schwitze schon seit graumer Zeit an diesem Problem und es ist mir sogar zum Erklären kompliziert genug ;(

    Ich will folgendes erreichen:
    Ein Mikrofon hat, abhängig von seiner Richtcharakteristik, in jedem Winkel verschiedene Reichweiten.
    z.B: Nierenform: von vorne kommen 100% ins Mikro, von hinten 0%
    Ein Kugelmikro bekommt von rundherum immer 100% Schall

    Nun will ich berechnen, wo bei 2 oder mehr aufgestellten Mikros die Trennlinie verläuft, also wo beide Mikros denselben Schallpegel empfangen

    Zum besseren Verständnis bitte mal dieses Script ausführen:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    Global Const $PI = ATan(1) * 4
    Global Const $Deg2Rad = $PI / 180
    Global Const $Rad2Deg = 180 / $PI

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

    Global $iWidth = 800;@DesktopWidth
    Global $iHeight = 580;@DesktopHeight

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

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

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

    Global $iWidth = 800;@DesktopWidth
    Global $iHeight = 580;@DesktopHeight

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

    _GDIPlus_Startup()
    Global $hGui = GUICreate("Test", $iWidth, $iHeight)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui)
    Global $hBmpBuffer = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphics)
    Global $hGfxBuffer = _GDIPlus_ImageGetGraphicsContext($hBmpBuffer)
    _GDIPlus_GraphicsSetSmoothingMode($hGfxBuffer, 2)
    _GDIPlus_GraphicsClear($hGfxBuffer, 0xFF000000)

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

    Global $hPen = _GDIPlus_PenCreate(0xFF0088FF, 1)
    Global $hBrush = _GDIPlus_BrushCreateSolid(0xFF00FF00)

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

    GUIRegisterMsg($WM_PAINT, "WM_PAINT")
    GUISetState(@SW_SHOW, $hGui)

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

    While 1
    _Draw()
    Sleep(10)
    WEnd

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

    Func _CalcPoints($fX, $fY, $fW, $fH, $fPolar, $fAngle)
    Local $fX1, $fY1, $fX2, $fY2, $fS1, $fS2, $fA, $fTemp
    Local $aPoints[73][2] = [[72]]
    For $i = 0 To 71
    $fA = $i * 5 * $Deg2Rad ; 0-355 Grad
    $fS1 = 1 + 0 * Cos($fA) ; Kugelform
    $fS2 = 0.5 + 0.5 * Cos($fA) ; Nierenform
    $fTemp = Abs(($fS1 * (1 - $fPolar)) + ($fS2 * $fPolar)) / 2 ; Mischung aus Kugel und Niere

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

    $fX1 = $fTemp * Cos($fA) * $fW ; Länge
    $fY1 = $fTemp * Sin($fA) * $fH ; Breite

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

    $fX2 = $fX1 * Cos($fAngle * $Deg2Rad) - $fY1 * Sin($fAngle * $Deg2Rad) ; X um Winkel drehen
    $fY2 = $fX1 * Sin($fAngle * $Deg2Rad) + $fY1 * Cos($fAngle * $Deg2Rad) ; Y um Winkel drehen

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

    $aPoints[$i + 1][0] = $fX2 + $fX ; Ergebnis + X Mittelpunkt
    $aPoints[$i + 1][1] = $fY2 + $fY ; Ergebnis + Y Mittelpunkt
    Next
    Return $aPoints
    EndFunc ;==>_CalcPoints

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

    Func _Draw()
    _GDIPlus_GraphicsClear($hGfxBuffer, 0xFF000000)

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

    Local $aPnt1 = _CalcPoints(200, 200, 300, 150, 1, 45); Mittelpunkt 200,200; Länge 300; Breite 150; NierenForm; Winkel 45 Grad
    Local $aPnt2 = _CalcPoints(300, 200, 300, 150, 1, 90); Mittelpunkt 300,200; Länge 300; Breite 150; NierenForm; Winkel 90 Grad

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

    _GDIPlus_GraphicsDrawClosedCurve($hGfxBuffer, $aPnt1, $hPen)
    _GDIPlus_GraphicsDrawClosedCurve($hGfxBuffer, $aPnt2, $hPen)

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

    _GDIPlus_GraphicsFillRect($hGfxBuffer, 200 - 2, 200 - 2, 4, 4, $hBrush)
    _GDIPlus_GraphicsFillRect($hGfxBuffer, 300 - 2, 200 - 2, 4, 4, $hBrush)

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

    _GDIPlus_GraphicsDrawImage($hGraphics, $hBmpBuffer, 0, 0)
    EndFunc ;==>_Draw

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

    Func WM_PAINT($hWnd, $uMsgm, $wParam, $lParam)
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBmpBuffer, 0, 0)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_PAINT

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

    Func _Exit()
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_GraphicsDispose($hGfxBuffer)
    _GDIPlus_BitmapDispose($hBmpBuffer)
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    Hier wird 360° um den Mitteplunkt die Formel in _CalcPoints angewandt, um die Richtcharakteristik zu berechnen

    -------------------------

    Erreichen will ich nun wie es folgendes Script zeigt:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

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

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

    Global Const $PI = ATan(1) * 4
    Global Const $Deg2Rad = $PI / 180
    Global Const $Rad2Deg = 180 / $PI

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

    Global $iWidth = 800;@DesktopWidth
    Global $iHeight = 580;@DesktopHeight

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

    Global $aMic[33][20] = [[3]]
    $aMic[1][0] = 100
    $aMic[1][1] = 100
    $aMic[1][2] = 45
    $aMic[1][3] = 1
    $aMic[1][4] = 1.4
    $aMic[1][5] = 1

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

    $aMic[2][0] = 600
    $aMic[2][1] = 50
    $aMic[2][2] = 135
    $aMic[2][3] = 1
    $aMic[2][4] = 1.4
    $aMic[2][5] = 1

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

    $aMic[3][0] = 400
    $aMic[3][1] = 500
    $aMic[3][2] = 270
    $aMic[3][3] = 1
    $aMic[3][4] = 1.4
    $aMic[3][5] = 1

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

    _GDIPlus_Startup()
    Global $hGui = GUICreate("Test", $iWidth, $iHeight)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui)
    Global $hBmpBuffer = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphics)
    Global $hGfxBuffer = _GDIPlus_ImageGetGraphicsContext($hBmpBuffer)
    _GDIPlus_GraphicsSetSmoothingMode($hGfxBuffer, 2)
    _GDIPlus_GraphicsClear($hGfxBuffer, 0xFF000000)

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

    Global $hPen = _GDIPlus_PenCreate(0xFF00FF00, 1)

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

    GUIRegisterMsg($WM_PAINT, "WM_PAINT")
    GUISetState(@SW_SHOW, $hGui)

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

    _Draw()

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

    While 1
    Sleep(10)
    WEnd

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

    Func _Draw()

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

    Local $fX, $fY, $fScale
    Local $bAdd

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

    Local $aPath[$aMic[0][0] + 1][3]

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

    Local $aResult
    For $i = 1 To $aMic[0][0]
    $aResult = DllCall($ghGDIPDll, "uint", "GdipCreatePath", "int", 0, "int*", 0)
    $aPath[$i][0] = $aResult[2]
    $aPath[$i][1] = DllStructCreate("float[142];")
    $aPath[$i][2] = DllStructGetPtr($aPath[$i][1])
    Next

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

    For $s = 350 To 500 Step 2
    _GDIPlus_GraphicsClear($hGfxBuffer, 0xFF000000)
    For $i = 1 To $aMic[0][0]
    For $j = 0 To 70
    $fScale = _CalcPolarScale($aMic[$i][2], $j * 5, $aMic[$i][3], $aMic[$i][4], $aMic[$i][5])
    $fX = Cos($j * 5 * $Deg2Rad) * $s * $fScale + $aMic[$i][0]
    $fY = Sin($j * 5 * $Deg2Rad) * $s * $fScale + $aMic[$i][1]
    $bAdd = True
    For $k = 1 To $aMic[0][0]
    $aResult = DllCall($ghGDIPDll, "uint", "GdipIsVisiblePathPoint", "hwnd", $aPath[$k][0], "float", $fX, "float", $fY, "hwnd", 0, "int*", 0)
    If $aResult[5] Then
    $bAdd = False
    ExitLoop
    EndIf
    Next
    If $bAdd Then
    DllStructSetData($aPath[$i][1], 1, $fX, $j * 2 + 1)
    DllStructSetData($aPath[$i][1], 1, $fY, $j * 2 + 2)
    EndIf
    Next
    DllCall($ghGDIPDll, "uint", "GdipResetPath", "hwnd", $aPath[$i][0])
    DllCall($ghGDIPDll, "uint", "GdipAddPathClosedCurve2", "hwnd", $aPath[$i][0], "ptr", $aPath[$i][2], "int", 71, "float", 0.4)
    DllCall($ghGDIPDll, "uint", "GdipDrawPath", "hwnd", $hGfxBuffer, "hwnd", $hPen, "hwnd", $aPath[$i][0])
    Next
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBmpBuffer, 0, 0)
    Next

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

    For $i = 1 To $aMic[0][0]
    DllCall($ghGDIPDll, "uint", "GdipDeletePath", "hwnd", $aPath[$i][0])
    Next

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

    _GDIPlus_GraphicsDrawImage($hGraphics, $hBmpBuffer, 0, 0)
    EndFunc ;==>_Draw

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

    Func _CalcPolarScale($fA1, $fA2, $fP, $fSX, $fSY)
    $fA2 = ($fA2 - $fA1) * $Deg2Rad

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

    Local $fX = Cos($fA2) / $fSX
    Local $fY = Sin($fA2) / $fSY

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

    Local $fA = ATan($fY / $fX)
    If $fX < 0 Then $fA = $PI + $fA
    If $fX >= 0 And $fY < 0 Then $fA = $PI * 2 + $fA

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

    Local $fS1 = 1 + 0 * Cos($fA)
    Local $fS2 = 0.5 + 0.5 * Cos($fA)

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

    Local $fT = Abs($fS1 * (1 - $fP) + $fS2 * $fP) / 2

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

    Local $fX1 = $fT * Cos($fA) * $fSX
    Local $fY1 = $fT * Sin($fA) * $fSY

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

    Local $fRet = Sqrt($fX1 ^ 2 + $fY1 ^ 2)
    If $fRet < 0.01 Then $fRet = 0.01
    Return $fRet
    EndFunc ;==>_CalcPolarScale

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

    Func WM_PAINT($hWnd, $uMsgm, $wParam, $lParam)
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBmpBuffer, 0, 0)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_PAINT

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

    Func _Exit()
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_GraphicsDispose($hGfxBuffer)
    _GDIPlus_BitmapDispose($hBmpBuffer)
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_Exit

    [/autoit]


    Grob gesagt hab ich eine Formel, die um jeden Winkel um die eigene Achse verschienden Ergebnisse liefert und ich will herausfinden, wo die Grenze zwischen mehreren Mittelpunkten liegt...

    Kann man das überhaupt berechnen, oder ist mein zweites Script (immer Bereich vergrößern und überprüfen, ob ein Punkt schon im "fremden" Bereich liegt) schon die beste Lösung?!

    Ich hoffe, ich hab mein Anliegen gut genug erklärt, denn ich bin am Ende meines Lateins :D

    Danke

  • Embedded GUIs

    • eukalyptus
    • 27. Juni 2011 um 20:14

    Probiere es mal so:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    $MainGui = GUICreate("Hallo", 500, 500, 0, 0)
    $2GUI = GUICreate("2", 200, 200, 100, 100, $GUI_SS_DEFAULT_GUI, $WS_EX_MDICHILD, $MainGui)
    GUISetState(@SW_SHOW, $2GUI)
    GUISetState(@SW_SHOW, $MainGui)

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

    While 1
    $nMsg = GUIGetMsg(1)
    Switch $nMsg[1]
    Case $MainGui
    If $nMsg[0] = $GUI_EVENT_CLOSE Then Exit
    Case $2GUI
    If $nMsg[0] = $GUI_EVENT_CLOSE Then Exit
    EndSwitch
    WEnd

    [/autoit]

    Des weiteren empfehle ich dir den OnEventModus zu benutzen (GUISetOnEvent)

  • Hintergrund eines Bild transparent machen?

    • eukalyptus
    • 27. Juni 2011 um 20:00

    Um das mit GDI+ zu machen benötigst du GDIp.au3 von hier: http://www.autoitscript.com/forum/topic/10…post__p__748870

    Bei _GDIPlus_ImageAttributesSetColorKeys stellt man den Farbbereich ein, welcher transparent sein soll (ich hab mal den Bereich von 0xFFAAAAAA bis 0xFFFFFFFF gewählt)

    Spoiler anzeigen
    [autoit]

    #include "GDIp.au3"
    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

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

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

    _GDIPlus_Startup()

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

    Global $hImage_1 = _GDIPlus_ImageLoadFromFile("signatur Beispiel 2.jpg")
    Global $hImage_2 = _GDIPlus_ImageLoadFromFile("Peter.jpg")

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

    Global $iWidth = _GDIPlus_ImageGetWidth($hImage_1) * 96 / _GDIPlus_ImageGetHorizontalResolution($hImage_1)
    Global $iHeight = _GDIPlus_ImageGetHeight($hImage_1) * 96 / _GDIPlus_ImageGetVerticalResolution($hImage_1)

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

    Global $hGui = GUICreate("Test", $iWidth, $iHeight)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui)
    Global $hBmpBuffer = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphics)
    Global $hGfxBuffer = _GDIPlus_ImageGetGraphicsContext($hBmpBuffer)
    _GDIPlus_GraphicsSetSmoothingMode($hGfxBuffer, 2)
    _GDIPlus_GraphicsClear($hGfxBuffer, 0xFF000000)
    GUIRegisterMsg($WM_PAINT, "WM_PAINT")
    GUISetState()

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

    _GDIPlus_GraphicsDrawImage($hGfxBuffer, $hImage_1, 0, 0)

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

    Global $hAttributes = _GDIPlus_ImageAttributesCreate()
    _GDIPlus_ImageAttributesSetColorKeys($hAttributes, 0, True, 0xFFAAAAAA, 0xFFFFFFFF)
    _GDIPlus_GraphicsDrawImageRectRectIA($hGfxBuffer, $hImage_2, 0, 0, 100, 50, 200, 20, 100, 50, $hAttributes)

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

    _GDIPlus_GraphicsDrawImage($hGraphics, $hBmpBuffer, 0, 0)

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

    While 1
    Sleep(10)
    WEnd

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

    Func WM_PAINT($hWnd, $uMsgm, $wParam, $lParam)
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBmpBuffer, 0, 0)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_PAINT

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

    Func _Exit()
    _GDIPlus_ImageDispose($hImage_1)
    _GDIPlus_ImageDispose($hImage_2)
    _GDIPlus_GraphicsDispose($hGfxBuffer)
    _GDIPlus_BitmapDispose($hBmpBuffer)
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_Exit

    [/autoit]
  • Hat jemand ein Yamaha DM1000?

    • eukalyptus
    • 20. Juni 2011 um 17:53

    Hi

    Falls jemand von euch ein Yamaha DM1000 Mischpult (oder auch ein 03D) hat, dann bitte per PM bei mir melden

    Danke
    E

  • Bass.au3 - Tempo/Pitch bestimmen und .mp3 exportieren

    • eukalyptus
    • 14. Juni 2011 um 00:36

    Hier ein kurzes Beispielscript für dich:

    Spoiler anzeigen
    [autoit]

    #AutoIt3Wrapper_UseX64=n
    #include <BASS.au3>
    #include <BASSENC.au3>
    #include <BASSFX.au3>

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

    Global $tBuffer = DllStructCreate("byte[100000]")
    Global $pBuffer = DllStructGetPtr($tBuffer)
    Global $iBuffer = DllStructGetSize($tBuffer)

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

    _BASS_Startup()
    _BASS_ENCODE_Startup()
    _BASS_FX_Startup()
    _BASS_Init(0, -1, 44100, 0, "")

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

    Global $sFile = FileOpenDialog("Open...", @ScriptDir, "playable formats (*.MP3;*.MP2;*.MP1;*.OGG;*.WAV;*.AIFF;*.AIF)")
    Global $hStream = _BASS_StreamCreateFile(False, $sFile, 0, 0, $BASS_STREAM_DECODE)
    Global $hTempo = _BASS_FX_TempoCreate($hStream, $BASS_STREAM_DECODE)

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

    _BASS_ChannelSetAttribute($hTempo, $BASS_ATTRIB_TEMPO_PITCH, 3)
    _BASS_ChannelSetAttribute($hTempo, $BASS_ATTRIB_TEMPO, 30)
    Global $fRatio = _BASS_FX_TempoGetRateRatio($hTempo)

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

    Global $hEncoder = _BASS_Encode_Start($hTempo, '"' & @ScriptDir & '\lame" -r -x -b192 -h - "' & @ScriptDir & '\output.mp3"', 0)
    Global $iLength = _BASS_ChannelGetLength($hTempo, $BASS_POS_BYTE)

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

    Global $fRead = 0
    ConsoleWrite("+ ============" & @CRLF)
    While _BASS_ChannelIsActive($hTempo)
    $fRead += _BASS_ChannelGetData($hTempo, $pBuffer, $iBuffer) * $fRatio
    ConsoleWrite("! " & Round($fRead * 100 / $iLength) & "% done" & @CRLF)
    WEnd
    ConsoleWrite("+ ============" & @CRLF & "! 100% finito" & @CRLF & "+ ============" & @CRLF)

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

    _BASS_Encode_Stop($hEncoder)
    _BASS_StreamFree($hStream)
    _BASS_Free()

    [/autoit]

    E

  • GDI+ Schwarzes Loch & Maus Text Verfolger

    • eukalyptus
    • 13. Juni 2011 um 22:57

    Danke!
    3D-Pong hab ich schon angefangen - liegt aber momentan auf Eis...

  • GDI+ Schwarzes Loch & Maus Text Verfolger

    • eukalyptus
    • 13. Juni 2011 um 22:47

    Hab zwei neue Scripte hinzugefügt, und wollte nicht extra einen neuen Thread aufmachen ^^

    E

  • Bass.au3 - Tempo/Pitch bestimmen und .mp3 exportieren

    • eukalyptus
    • 13. Juni 2011 um 22:27

    Es hängt davon ab, was du genau erreichen willst.

    Im Prinzip musst du nur _Bass_Encode_Start auf den Tempostream anwenden um den Stream zu speichern.
    Das geht in Echtzeit (während des Abspielens) oder auch viel schneller, wenn der Tempstream auch ein Decodingstream ist.
    Beispiele in der Hilfe: _Bass_Encode_Start.au3 oder Resample.au3

    Um die Lautstärke auf dem original Level zu behalten, kannst du den TempoStream (als Decodingstream) auf einen Mixerstream setzen via _BASS_Mixer_StreamCreate und _BASS_Mixer_StreamAddChannel.
    Beim Mixerstream kannst du die Lautstärke ändern ohne die Lautstärke des Tempostreams zu beeinflussen (welcher ja gespeichert wird)

    Alles klar?

    E

  • Bass.dll UDF Version_10 Download

    • eukalyptus
    • 7. Juni 2011 um 07:03

    Oh!
    Ich hab vergessen zu updaten! :whistling:
    _BASS_ChannelSetSync gibt es schon seit einiger Zeit

    E

  • GDI+ Perfect Illusion

    • eukalyptus
    • 3. Juni 2011 um 18:40

    Wieder mal ein absolut tolles Script von dir! :thumbup:
    Aber ich hab ja auch nichts anderes erwartet :D

  • Virtuelles Betriebssystem in AutoIt?

    • eukalyptus
    • 3. Juni 2011 um 18:34
    [autoit]

    RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon", "Shell", "REG_SZ", "Explorer.exe")

    [/autoit]

    Explorer.exe kann man durch eine (in AutoIt geschriebene) andere Exe ersetzen.
    Dann bootet Windows und startet statt der "normalen" Oberfläche den eigenen Shell-ersatz

    Hab selbst mal sowas geschrieben und es gibt auch Beispiele im englischen Forum, wenn ich mich richtig erinnere...

    E

  • "Verzerrung" bei Bild

    • eukalyptus
    • 27. Mai 2011 um 17:20

    http://www.tecgraf.puc-rio.br/~scuri/gdiplus…le_problem.html

  • "Verzerrung" bei Bild

    • eukalyptus
    • 27. Mai 2011 um 17:03

    Es funktioniert auch mit:

    [autoit]

    _GDIPlus_GraphicsSetPixelOffsetMode($hGfxBuffer,2)

    [/autoit]


    (bzw.: 4)

    Das Geheimnis des oben geposteten Scripts liegt in der Zeile 26 => SrcRect X/Y = -0.5
    Hat wohl auch mit dem PixelOffsetMode zu tun und scheint doch kein Bug zu sein...

    E

  • Gta-Spider hat Geburtstag

    • eukalyptus
    • 27. Mai 2011 um 16:38

    Herzrechtlichen Glückwunsch! ^^

  • "Verzerrung" bei Bild

    • eukalyptus
    • 27. Mai 2011 um 16:35

    Hmm - ich hab zwar keine Ahnung, weshalb das nun so ist (Bug?), aber als Workaround könntest du es so machen:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    Opt("GUIOnEventMode", 1)

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

    _GDIPlus_Startup()

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

    Global $fScale = 30

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

    Global $hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\sworddg.png")

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

    Global $iW = _GDIPlus_ImageGetWidth($hImage)
    Global $iH = _GDIPlus_ImageGetHeight($hImage)
    Global $iWidth = $iW * 96 / _GDIPlus_ImageGetHorizontalResolution($hImage) * $fScale
    Global $iHeight = $iH * 96 / _GDIPlus_ImageGetVerticalResolution($hImage) * $fScale

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

    Global $hGui = GUICreate("Test", $iWidth, $iHeight)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_EXIT")
    Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui)
    Global $hBmpBuffer = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphics)
    Global $hGfxBuffer = _GDIPlus_ImageGetGraphicsContext($hBmpBuffer)
    _GDIPlus_GraphicsSetSmoothingMode($hGfxBuffer, 2)
    _GDIPlus_GraphicsSetInterpolationMode($hGfxBuffer, 5)
    _GDIPlus_GraphicsClear($hGfxBuffer, 0xFFFFFFFF)
    _GDIPlus_GraphicsDrawImageRectRect_F($hGfxBuffer, $hImage, -0.5, -0.5, $iW, $iH, 0, 0, $iWidth, $iHeight)

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

    GUIRegisterMsg($WM_PAINT, "WM_PAINT")
    GUISetState()

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

    While 1
    Sleep(10)
    WEnd

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

    Func WM_PAINT($hWnd, $uMsgm, $wParam, $lParam)
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBmpBuffer, 0, 0)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_PAINT

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

    Func _Exit()
    _GDIPlus_GraphicsDispose($hGfxBuffer)
    _GDIPlus_BitmapDispose($hBmpBuffer)
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_Exit

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

    Func _GDIPlus_GraphicsDrawImageRectRect_F($hGraphics, $hImage, $fSrcX, $fSrcY, $fSrcWidth, $fSrcHeight, $fDstX, $fDstY, $fDstWidth, $fDstHeight, $iUnit = 2)
    Local $aResult = DllCall($ghGDIPDll, "int", "GdipDrawImageRectRect", "handle", $hGraphics, "handle", $hImage, "float", $fDstX, _
    "float", $fDstY, "float", $fDstWidth, "float", $fDstHeight, "float", $fSrcX, "float", $fSrcY, "float", $fSrcWidth, _
    "float", $fSrcHeight, "int", $iUnit, "int", 0, "int", 0, "int", 0)
    If @error Then Return SetError(@error, @extended, False)
    Return $aResult[0] = 0
    EndFunc ;==>_GDIPlus_GraphicsDrawImageRectRect_F

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

    Func _GDIPlus_GraphicsDrawImageRect_F($hGraphics, $hImage, $fX, $fY, $fW, $fH)
    Local $aResult = DllCall($ghGDIPDll, "int", "GdipDrawImageRect", "handle", $hGraphics, "handle", $hImage, "float", $fX, "float", $fY, _
    "float", $fW, "float", $fH)
    If @error Then Return SetError(@error, @extended, False)
    Return $aResult[0] = 0
    EndFunc ;==>_GDIPlus_GraphicsDrawImageRect_F

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

    Func _GDIPlus_GraphicsSetInterpolationMode($hGraphics, $iInterpolationMode)
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipSetInterpolationMode", "hwnd", $hGraphics, "int", $iInterpolationMode)
    If @error Then Return SetError(@error, @extended, False)
    Return $aResult[0] = 0
    EndFunc ;==>_GDIPlus_GraphicsSetInterpolationMode

    [/autoit]

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™