2 kleine Fragen [Mathematik]

  • Hallo, wie man aus der Überschrift entnehmen kann habe ich 2 Fragen.

    Erstmal vorab wofür ich das brauch, ich arbeite derzeit neben bei an einem kleinen Spiel und bräuchte folgende mathemartische Funtkionen:

    1. Wie kann ich am cleversten einen gleichmäßigen weichen Farbwechsel zwischen mehreren ausgewählten Farben erstellen?

    Zitat von "Beispiel:"

    Farbe 1 [weicher Übergang zu] Farbe 2 [weicher Übergang zu] Farbe 3 [weicher Übergang zu] .... Farbe 1

    Ich bräuchte die Farben als "normalen" Farbcode ( z.B 0xFFFFFF )
    Ich würde mich über ein Beispiel freuen!


    2. Ich würde gerne in GDI+ ein bewegendes Objekt langsam abschwächen um dann wieder in langsamer Beschleunigung zurück zu "fliegen", und das gleiche wieder wenn es "oben" ist.
    Ich denk mal ich bräuchte die Kurvenfunktionen, da ich mich dadrin noch nie groß mit beschäftigt habe und das auch in der Schule noch nie gelehrt bekommen habe, würd ich gerne wissen
    wie man das in Autoit umsätzt.
    Hier mal Grafik, wenn ihr nicht versteht, was ich meine:

    Spoiler anzeigen


    Auch hier würde ich mich über ein Beispiel freuen, Frage 1 hat aber eine größere Priorität.

    Ich hoffe, ich habt das ein oder andere verstanden, was ich meine.
    Ich würde mich sehr über Antworten freuen,
    Vielen Dank.

    Sind TV-Quizfragen zu einfach? A) Ja B) Harry Potter

    Spoiler anzeigen

    Ich gebe zu dieser Post hat wahrscheinlich nicht viel geholfen,
    aber ich versuche wenigstens zu helfen :rolleyes:

    Einmal editiert, zuletzt von PuReIroNie (20. November 2013 um 23:16)

  • Hier hast du ein Beispiel zu dem Farbwechsel.
    Ist nur eine Quick and Dirty Variante.
    Sollte aber zeigen wie es beispielsweise möglich wäre...

    Spoiler anzeigen
    [autoit]

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    #include <GUIConstants.au3>
    Opt('GUIOnEventMode', 1)

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    Global $hGUI, $idGraphic

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

    $iSrt = 0xFF00FF
    $iEnd = 0x00FF00

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    $hGUI = GUICreate('Farbwechsel Beispiel', 800, 600)
    $idGraphic = GUICtrlCreateGraphic(0, 0, 800, 600)

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

    GUISetOnEvent($GUI_EVENT_CLOSE, 'GUI_EVENT_CLOSE')
    GUISetState()

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    While Sleep(10)
    GUICtrlSetBkColor($idGraphic, $iSrt)
    $iSrt = _ChangeColor($iSrt, $iEnd)
    If $iSrt = -1 Then ExitLoop
    WEnd

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

    Sleep(1000)
    Exit

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    Func GUI_EVENT_CLOSE()
    Exit
    EndFunc

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

    Func _ChangeColor($iOld, $iNew)
    If $iOld = $iNew Then Return -1

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

    Local $iRo = BitAnd($iOld, 0xFF0000) / 256 / 256
    Local $iGo = BitAND($iOld, 0x00FF00) / 256
    Local $iBo = BitAND($iOld, 0x0000FF)

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

    Local $iRn = BitAND($iNew, 0xFF0000) / 256 / 256
    Local $iGn = BitAND($iNew, 0x00FF00) / 256
    Local $iBn = BitAND($iNew, 0x0000FF)

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

    If $iRo < $iRn Then $iRo += 1
    If $iGo < $iGn Then $iGo += 1
    If $iBo < $iBn Then $iBo += 1

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

    If $iRo > $iRn Then $iRo -= 1
    If $iGo > $iGn Then $iGo -= 1
    If $iBo > $iBn Then $iBo -= 1

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

    Return $iRo * 256 * 256 + $iGo * 256 + $iBo
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von Yjuq (20. November 2013 um 20:47)

  • Vielen Dank!, Frage 1 hat sich erledigt.

    Sind TV-Quizfragen zu einfach? A) Ja B) Harry Potter

    Spoiler anzeigen

    Ich gebe zu dieser Post hat wahrscheinlich nicht viel geholfen,
    aber ich versuche wenigstens zu helfen :rolleyes:

  • Hi,
    die Funktion die du suchst heisst Sinus oder Cosinus.

    [autoit]

    sin()

    [/autoit]


    Anbei mal ein kleines Script, welches die von dir gewünschte "Dämpfung" simuliert

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    _GDIPlus_Startup()

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

    Opt("GUIOnEventMode", 1)

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

    Local $pi = 3.14159265358979
    Local $degToRad = $pi / 180 ;360° sind im Bogenmaß 2*PI

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

    $hgui = GUICreate("Sinus-Schwingung")
    GUISetOnEvent($GUI_EVENT_CLOSE, "_exit")
    GUISetState()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hgui)

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

    $farbe = 0xFF000000 + Random(0x0000FF, 0x00FFFFFF, 1)
    $hPen = _GDIPlus_PenCreate($farbe) ;

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

    while 1
    for $alpha = 0 to 360 step 1 ;Vollkreiswinkel
    if Int($alpha) = 90 or Int($alpha) = 270 then ;oben und unten neue Farbe erstellen
    $farbe = 0xFF000000 + Random(0x0000FF, 0x00FFFFFF, 1)
    $hPen = _GDIPlus_PenCreate($farbe);
    endif
    $y = Sin($alpha * $degToRad) ;im Bereich von -1 bis 1
    Sleep((($y * $y * 20) + 11)) ;$y*$y um vorzeichen immer positiv zu haben!
    _GDIPlus_GraphicsDrawLine($hGraphic, 10, 160 + $y * 150 + 10, 350, 160 + $y * 150 + 10, $hPen)
    Next
    wend

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

    func _exit()
    Exit
    EndFunc ;==>_exit

    [/autoit]
  • Da war der Andy mal wieder schneller :rolleyes: .
    Aber ich möchte trotzdem mal meine Antwort präsentieren (die sich jedoch auf Frage 2 beschränkt), schließlich sind Polynome viel cooler :P.

    Spoiler anzeigen
    [autoit]

    #include <WindowsConstants.au3>
    #include <GUIConstants.au3>
    #include <GDIPlus.au3>
    #include <WinAPI.au3>

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

    ; - Author: name22 (http://www.autoit.de)

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

    Opt("GUIOnEventMode", 1)

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

    Global Const $nPiHalf = ACos(-1) / 2
    Global $hWnd_GUI, $hDC_Window, $hDC_Bitmap, $hBitmap
    Global $nSleepTime, $nFPS_Average, $nFPS_Cur, $nFPS_Display, $tPrecSleep, $pPrecSleep, $vNTdll
    Global $hGraphics, $hBrush_Black, $hBrush_Red, $hStringFormat, $hFamily_FPS, $hFont_FPS, $aMeasure, $tLayout_FPS
    Global $nT_Sleep, $nT_UpdateFPS, $nT_Movement, $nMovementTime, $nMovementPhase, $nFrameTime
    Global $nX_Source, $nY_Source, $nX_Pos, $nY_Pos, $nX_Target, $nY_Target

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

    ;###-v-SETTINGS-v-###

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

    Global $iWidth = 600
    Global $iHeight = 400
    Global $iARGB_BG = 0xFFFFFFFF
    Global $nFPS = 60

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

    Global $nMovementDuration = 2000

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

    $nX_Target = Random(20, $iWidth - 20, 1)
    $nY_Target = Random(20, $iHeight - 20, 1)

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

    ;###-^-SETTINGS-^-###

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

    $nSleepTime = 1000 / $nFPS

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

    $nFPS_Display = 0
    $nFPS_Average = $nFPS

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

    $vNTdll = DllOpen("ntdll.dll")

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

    $tPrecSleep = DllStructCreate("int64 time;")
    $pPrecSleep = DllStructGetPtr($tPrecSleep)

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

    $hWnd_GUI = GUICreate("Motion along linear path", $iWidth, $iHeight)
    GUISetState()

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

    $hDC_Window = _WinAPI_GetDC($hWnd_GUI)
    $hDC_Bitmap = _WinAPI_CreateCompatibleDC($hDC_Window)
    $hBitmap = _WinAPI_CreateCompatibleBitmap($hDC_Window, $iWidth, $iHeight)
    _WinAPI_SelectObject($hDC_Bitmap, $hBitmap)

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

    _GDIPlus_Startup()

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

    $hGraphics = _GDIPlus_GraphicsCreateFromHDC($hDC_Bitmap)
    _GDIPlus_GraphicsSetSmoothingMode($hGraphics, 2)

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

    $hBrush_Black = _GDIPlus_BrushCreateSolid(0xFF000000)
    $hBrush_Red = _GDIPlus_BrushCreateSolid(0xFFFF0000)

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

    $hStringFormat = _GDIPlus_StringFormatCreate()
    $hFamily_FPS = _GDIPlus_FontFamilyCreate("Arial")
    $hFont_FPS = _GDIPlus_FontCreate($hFamily_FPS, 6)

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

    $aMeasure = _GDIPlus_GraphicsMeasureString($hGraphics, "FPS: 0000", $hFont_FPS, _GDIPlus_RectFCreate(), $hStringFormat)
    $tLayout_FPS = $aMeasure[0]
    $aMeasure = ""
    DllStructSetData($tLayout_FPS, "X", $iWidth - DllStructGetData($tLayout_FPS, "Width") - 3)
    DllStructSetData($tLayout_FPS, "Y", $iHeight - DllStructGetData($tLayout_FPS, "Height"))
    DllStructSetData($tLayout_FPS, "Width", DllStructGetData($tLayout_FPS, "Width") + 3)

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

    GUISetOnEvent($GUI_EVENT_CLOSE, "_Close")
    OnAutoItExitRegister("_Shutdown")

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

    $nT_UpdateFPS = TimerInit()
    $nT_Sleep = TimerInit()
    _SetNewTarget()
    While True
    DllStructSetData($tPrecSleep, "time", -10000 * ($nSleepTime - TimerDiff($nT_Sleep)))
    DllCall($vNTdll, "dword", "ZwDelayExecution", "int", 0, "ptr", $pPrecSleep)
    $nFrameTime = TimerDiff($nT_Sleep)
    $nT_Sleep = TimerInit()

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

    $nFPS_Cur = 1000 / $nFrameTime
    If TimerDiff($nT_UpdateFPS) >= 1000 Then
    $nFPS_Display = $nFPS_Cur
    $nT_UpdateFPS = TimerInit()
    EndIf

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

    If TimerDiff($nT_Movement) >= $nMovementDuration Then _SetNewTarget()

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

    $nMovementTime = TimerDiff($nT_Movement)
    $nMovementPhase = _MovementTimingFunction($nMovementTime, $nMovementDuration)

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

    $nX_Pos = $nX_Source + $nMovementPhase * ($nX_Target - $nX_Source)
    $nY_Pos = $nY_Source + $nMovementPhase * ($nY_Target - $nY_Source)

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

    _GDIPlus_GraphicsClear($hGraphics, $iARGB_BG)
    _GDIPlus_GraphicsFillEllipse($hGraphics, $nX_Pos - 20, $nY_Pos - 20, 40, 40, $hBrush_Red)
    _GDIPlus_GraphicsFillRect($hGraphics, $nX_Target - 2, $nY_Target - 2, 4, 4, $hBrush_Black)
    _GDIPlus_GraphicsDrawStringEx($hGraphics, "FPS: " & Round($nFPS_Display, 1), $hFont_FPS, $tLayout_FPS, $hStringFormat, $hBrush_Black)
    _WinAPI_BitBlt($hDC_Window, 0, 0, $iWidth, $iHeight, $hDC_Bitmap, 0, 0, $SRCCOPY)
    WEnd

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

    Func _Close()
    Exit
    EndFunc ;==>_Close

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

    Func _SetNewTarget()
    $nX_Source = $nX_Target
    $nY_Source = $nY_Target
    $nX_Target = Random(20, $iWidth - 20, 1)
    $nY_Target = Random(20, $iHeight - 20, 1)
    $nT_Movement = TimerInit()
    EndFunc

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

    Func _MovementTimingFunction($nTime, $nDuration)
    Local $T = $nTime / $nDuration
    Return $T ^ 2 * (3 - 2 * $T)
    EndFunc

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

    Func _Shutdown()
    _WinAPI_ReleaseDC($hWnd_GUI, $hDC_Window)
    _WinAPI_DeleteDC($hDC_Bitmap)
    _WinAPI_DeleteObject($hBitmap)

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

    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_BrushDispose($hBrush_Black)
    _GDIPlus_BrushDispose($hBrush_Red)
    _GDIPlus_StringFormatDispose($hStringFormat)
    _GDIPlus_FontFamilyDispose($hFamily_FPS)
    _GDIPlus_FontDispose($hFont_FPS)
    _GDIPlus_Shutdown()

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

    DllClose($vNTdll)
    EndFunc ;==>_Shutdown

    [/autoit]


    Abgesehen davon lässt sich meine Version vermutlich eher in ein Spiel o.Ä. einbauen, das auf einer festen Bildwiederholrate basiert. Andy zeigt mehr die Mathematik hinter dem ganzen.

    Edit: Bevor ich es vergesse: diese Funktion lässt sich natürlich auf jede beliebige Wertänderung mit konstantem Start- und Endwert anwenden, also auch Farbänderungen. Das kannst du ja vermutlich Andys Beispiel entnehmen.

  • Vielen Dank auch euch beiden für die Mühe! :)
    Beide Beispiele werden mir helfen , somit währ auch Frage 2 erledigt.

    Wenn das Spiel fertig ist, werde ich es auch hier mal Vorstellen.

    Sind TV-Quizfragen zu einfach? A) Ja B) Harry Potter

    Spoiler anzeigen

    Ich gebe zu dieser Post hat wahrscheinlich nicht viel geholfen,
    aber ich versuche wenigstens zu helfen :rolleyes: