_GDIPlus_GraphicsDrawBezier punkte errechnen

  • Moin Leute,

    Ich hab nen Problem und zwar wollte ich mit _GDIPlus_GraphicsDrawBezier einen schicken ladebalken Programieren, doch ich kann den Ladebalken leiden nicht Prozentual füllen, denn dafür muss ich die Punkte errechnen, das die Kurve genau auf der Anderen liegt, ich hab die Punkte für 5% jetzt durch außprobieren herrausgefunden, aber gibt es da auch eine Rechnung für?

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>

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

    $hWnd = GUICreate ("Ladebalken",600,100,Default,Default,0x80000000)
    GUISetBkColor (0x000000)
    GUISetState (@SW_SHOW,$hWnd)

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

    _GDIPlus_Startup ()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND ($hWnd)
    _GDIPlus_GraphicsSetSmoothingMode($hGraphic, 2)
    $pGrey = _GDIPlus_PenCreate(0xFF6e6e6e,10)
    $pOrange = _GDIPlus_PenCreate (0xFFF96900,10)
    _GDIPlus_GraphicsDrawBezier($hGraphic, 0, 50, 50, 25, 100, 25, 150, 50,$pGrey)
    _GDIPlus_GraphicsDrawBezier($hGraphic, 150, 50, 200, 75, 250, 75, 300, 50,$pGrey)
    _GDIPlus_GraphicsDrawBezier($hGraphic, 300, 50, 350, 25, 400, 25, 450, 50,$pGrey)
    _GDIPlus_GraphicsDrawBezier($hGraphic, 450, 50, 500, 75, 550, 75, 600, 50,$pGrey)

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

    $X1 = 0
    $Y1 = 50

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

    $X2 = 50 * 0.2
    $Y2 = 45

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

    $X3 = 100 * 0.2
    $Y3 = 41

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

    $X4 = 150 * 0.2
    $Y4 = 38

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

    _GDIPlus_GraphicsDrawBezier($hGraphic, $X1, $Y1, $X2, $Y2, $X3, $Y3, $X4, $Y4,$pOrange)

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

    While 1
    Switch GUIGetMsg ()
    Case -3
    Exit
    EndSwitch
    WEnd

    [/autoit]

    Danke im Voraus

    mfg. Jam00

    Einmal editiert, zuletzt von Jam00 (26. Dezember 2010 um 19:50)

  • Eine von vielen Möglichkeiten:

    Spoiler anzeigen
    [autoit]


    ;fast hack by UEZ 2010
    #include <GuiConstantsEx.au3>
    #include <GDIPlus.au3>

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

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

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

    Global $hGUI, $hGraphic, $hBitmap, $hBackbuffer, $hBackground, $hContext, $hBrush1, $hBrush2, $progress
    Global $start, $schritte

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

    Global $weight = 600
    Global $height = 100
    $hGUI = GUICreate("GDI+", $weight, $height, Default, Default, 0x80000000)
    GUISetBkColor($hGUI, 0)

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

    _GDIPlus_Startup ()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND ($hGUI)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($weight, $height, $hGraphic)
    $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)

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

    $hBackground = _GDIPlus_BitmapCreateFromGraphics($weight, $height, $hGraphic)
    $hContext = _GDIPlus_ImageGetGraphicsContext($hBackground)

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

    _GDIPlus_GraphicsSetSmoothingMode($hContext, 2)
    _GDIPlus_GraphicsSetSmoothingMode($hBackbuffer, 2)

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

    $hBrush1 = _GDIPlus_BrushCreateSolid(0xFF6E6E6E)
    $hBrush2 = _GDIPlus_BrushCreateSolid(0xFFF96900)

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

    _GDIPlus_GraphicsClear($hBackbuffer)
    _GDIPlus_GraphicsClear($hContext)

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

    ;erstelle Hintergrund
    Progress($hContext, $hBrush1, -5, $weight +5)

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

    GUISetState()

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

    GUISetOnEvent(-3, "_Exit")

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

    $start = -5

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

    While Sleep(30)
    If $schritte < $weight + 5 Then
    _GDIPlus_GraphicsDrawImageRect($hBackbuffer, $hBackground, 0, 0, $weight, $height)
    Progress($hBackbuffer, $hBrush2, $start, $start + $schritte)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $weight, $height)
    $schritte += 4
    EndIf
    WEnd

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

    Func Progress($hContext, $hBrush, $s, $e, $steps = 1, $bW = 10, $bH = 10, $h = $height)
    Local $i
    For $i = $s To $e Step $steps
    _GDIPlus_GraphicsFillEllipse($hContext, $i, $h / 2 - $h * Cos($i / 40) / 5 - $bH / 2, $bW, $bH, $hBrush)
    Next
    EndFunc

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

    Func _Exit()
    _GDIPlus_BrushDispose($hBrush1)
    _GDIPlus_BrushDispose($hBrush2)
    _GDIPlus_GraphicsDispose($hBackbuffer)
    _GDIPlus_BitmapDispose ($hBitmap)
    _GDIPlus_GraphicsDispose($hContext)
    _GDIPlus_BitmapDispose ($hBackground)
    _GDIPlus_GraphicsDispose ($hGraphic)
    _GDIPlus_Shutdown ()
    GUIDelete($hGUI)
    Exit
    EndFunc

    [/autoit]


    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    Einmal editiert, zuletzt von UEZ (26. Dezember 2010 um 18:14)

  • Super UEZ, genau was ich wollte :thumbup:

    Eine Frage noch wie kommst du auf diese Rechnungen? Kannst du mir mal erklären wie du darauf kommst? Würde das auch selber gerne erstellen können. Oder ist das mit Mathematik der 9 Realschulklasse noch nicht möglich?
    Naja könntest mir ja trozdem nochmal erklären, dann guck ich im Inet für die Rechnungen die ich noch nicht kenne/kann um sie zu lernen.

    Vielen Dank

    Eine Frage noch, kann man die Kantenglättung noch erhöhen? Man kann sie ja so nur auf 8x8 stellen, kann man sie auch irgendwie auf 16x16 stellen?

    mfg. Jam00

  • Super UEZ, genau was ich wollte :thumbup:

    Eine Frage noch wie kommst du auf diese Rechnungen? Kannst du mir mal erklären wie du darauf kommst? Würde das auch selber gerne erstellen können. Oder ist das mit Mathematik der 9 Realschulklasse noch nicht möglich?
    Naja könntest mir ja trozdem nochmal erklären, dann guck ich im Inet für die Rechnungen die ich noch nicht kenne/kann um sie zu lernen.

    Vielen Dank


    Das hat was mit Schwingungen zu tun und Schwingungen werden i.d.R. mit Sinus/Kosinus dargestellt.
    Wenn ihr Sinus und Kosinus bereits in Mathe behandelt, dann schaue mal einfach hier rein: http://de.wikipedia.org/wiki/Sinus. Ansonsten wird es schwer zu erklären.

    Zitat von Jam00


    Eine Frage noch, kann man die Kantenglättung noch erhöhen? Man kann sie ja so nur auf 8x8 stellen, kann man sie auch irgendwie auf 16x16 stellen?


    Soweit ich weiß, gibt es nur 0, 1 und 2 als Wert für _GDIPlus_GraphicsSetSmoothingMode()

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    Einmal editiert, zuletzt von UEZ (26. Dezember 2010 um 18:15)

  • Hmm Sinus/Kosinus hatten wir leider noch nicht, ich werde mal gucken ob ich es mit per Internet beibringen kann.
    Ja 2 ist ja dann 8x8, schade das nicht mehr geht aber oki so ist das auch gut

    Viele dank

    mfg. Jam00