Dreieck mit GDI+ Farbverlauf füllen

  • Hallo,
    Ich suche eine GDI+ Funktion mit der man ein Dreick(unten links, oben rechts, unten rechts) wie zB das vom VLC-Player füllen kann.
    Ich hab schon einiges versucht aber die bzw. meine Rechnungen sind immer falsch oder der "Farbverlauf" ist nur eine Farbe.

    Einmal editiert, zuletzt von Oscar (14. August 2010 um 19:55)

  • Ich hatte, um verschiedene Farbpaletten zu erstellen, etwas ähnliches geschrieben. Die Stützfarben werden angegeben, die Zwischenfarben in beliebiger Schrittweite ausgerechnet

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <WindowsConstants.au3>
    #include <Color.au3>
    Opt("GUIOnEventMode", 1)
    ;Palette für den Farbverlauf RRGGBB
    ;
    ;
    $rot=0xFF0000
    $gelb=0xFFFF00
    $schwarz=0x000000
    $weiss=0xFFFFFF
    $blau=0x0000FF

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

    $random=random(0,255^3,1);zufallsfarbe erzeugen

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

    ;die Grundfarben werden in ein array eingetragen, die funktion berechnet dann alle zwischenfarben
    Dim $Farbverlauf_1[2]=[0xFF0000,0x00FF00];Rot+Grün
    Dim $Farbverlauf_2[2]=[$random,0xFFFFFF];Blau +Weiß
    Dim $Farbverlauf_3[6]=[$schwarz,$rot,$gelb,$weiss,$blau,$schwarz];
    ;-----------------------------------------------
    $hGUI = GUICreate("Farbverlauf", 1024, 500, 557, 78)
    GUISetOnEvent(-3, "death")
    GUISetState(@SW_SHOW)

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

    ;-----------------------------------------------
    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    $bin="0x"

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

    Draw() ;farbverläufe zeichnen

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

    While 1
    Sleep(20)
    tooltip("Farbcode: "&hex(pixelgetcolor(mousegetpos(0),mousegetpos(1),$hgui)))
    WEnd

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

    func draw() ;zeichnet 3 Farbverläufe in die GUI
    for $i=0 to 800
    $col = _createcolorfrompalette($farbverlauf_1, $i, 800) ;ermittelt die Farbe zwischen den arrayinhalten
    $pen = _GDIPlus_PenCreate($col+0xFF000000) ;übergibt diese Farbe einem brush
    _GDIPlus_Graphicsdrawline($hGraphic, $i, 50, $i,150 , $pen) ;füllt ein rechteck mit dieser Farbe aus
    _GDIPlus_PenDispose($pen) ;löscht den pen
    next
    ;3. Farbverlauf 100 Pixel breit von rechts nach links halbtransparent
    for $i=0 to 500
    $col = _createcolorfrompalette($farbverlauf_3, $i, 500) ;ermittelt die Farbe zwischen den arrayinhalten
    $pen = _GDIPlus_PenCreate($col+0xFF000000) ;übergibt diese Farbe einem brush
    _GDIPlus_Graphicsdrawline($hGraphic, $i, 200, $i,300 , $pen) ;füllt ein rechteck mit dieser Farbe aus
    _GDIPlus_PenDispose($pen) ;löscht den pen
    next
    for $i=0 to 200
    $col = _createcolorfrompalette($farbverlauf_2, $i, 200) ;ermittelt die Farbe zwischen den arrayinhalten
    ;$bin&="00"&stringright(hex($col,6),2)&stringmid(hex($col,6),3,2)&stringleft(hex($col,6),2)
    $pen = _GDIPlus_PenCreate($col+0xFF000000) ;übergibt diese Farbe einem brush
    _GDIPlus_Graphicsdrawline($hGraphic, $i, 350, $i,450 , $pen) ;füllt ein rechteck mit dieser Farbe aus
    _GDIPlus_PenDispose($pen) ;löscht den pen
    next

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

    endfunc

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

    Func death()
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>death

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

    Func _createcolorfrompalette(ByRef $aPalette, $count, $maximum) ;gibt zwischenfarbe anhand der beiden Nachbarn im Palette-array zurück
    Local $ubound = UBound($aPalette) - 1 ;maximale Anzahl Palettenfarben
    Local $percent = $count * $ubound / $maximum ;Position innerhalb des Palettenarrays
    $index = Int($percent) ;index des Palettenarrays "unterhalb" von percent
    If $percent = $index Then Return $aPalette[$index] ;bei genauem indextreffer farbe zurückgeben

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

    $startrot = _ColorGetRed($aPalette[$index]) ;startfarbe
    $startgruen = _ColorGetGreen($aPalette[$index])
    $startblau = _ColorGetBlue($aPalette[$index])
    $endrot = _ColorGetRed($aPalette[$index + 1]) ;endfarbe
    $endgruen = _ColorGetGreen($aPalette[$index + 1])
    $endblau = _ColorGetBlue($aPalette[$index + 1])

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

    $xx = (($percent - $index)) ;faktor zwischen 0 und 1

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

    $r = Int($startrot - ($startrot - $endrot) * $xx) * 256 * 256 ;zwischenrot
    $g = Int($startgruen - ($startgruen - $endgruen) * $xx) * 256 ;zwischengruen
    $b = Int($startblau - ($startblau - $endblau) * $xx) ;zwischenblau
    Return $r + $g + $b
    EndFunc ;==>_createcolorfrompalette

    [/autoit]
  • In der GDIp.au3 findest du die Funktion _GDIPlus_LineBrushCreate.
    Damit kannst du einen Brush mit Farbverlauf erstellen;
    und mit _GDIPlus_GraphicsFillPolygon zeichnest du dann das Dreieck.

    Um das Dreieck in mehrere Farbverläufe zu unterteilen musst du einfach das Dreieck in mehrere Abschnitte teilen...

    mfgE

  • Dankeschön an euch beide.
    Ich hab mich für eukalyptus' Vorschlag entschieden weil er für mich leichter zu verstehen ist(10+ Wochen keine Schule tun dem Kopf nicht gut).
    Funktioniert auch perfekt.

    MfG
    Higggiii