Dreieck / Kreis berechnen

  • Hallo,

    Nach 9 Jahren Gymi, haben 1 Jahr Haupt- und 1 Jahr Handelsschule wohl das komplette Mathewissen aus meinem Kopf leergeräumt.
    Also folgendes Problem:

    Ich habe einen Kreis mit einem Radius von $r pixeln. Der Mittelpunkt des Kreises ist der Mittelpunkt des GUI's.
    Der Kreis ist gleichzeitig der Innenkreis eines gleichwinkliges ( Gleichseitigen?! ) Dreiecks.

    • Wie berechne ich die einzelnen Punkte auf denen der Kreis gezeichnet wird
    • Wie berechne ich die 3 Eckpunkte des dreiecks, ausgehend vom Radius?

    (Bitte langsam erklären - Dummie am Werk!)

    Danke im Vorraus für eure Hilfe

    PS: Wenn mir noch jemand nen Crashkurs in Berechnungen mit Sinus/Cosinus geben könnt, würd ich sterben vor Glück ^^

  • Es ist eher das hier http://www.mathepedia.de/Winkelhalbierende_Inkreis.aspx.
    Wenn's nicht noch so früh wäre ..... gäähhn.

    edit: Mir kam da grad so ein Gedanke. Wenn das Dreieck gleichseitig ist, dann dürften die Winkelhalbierenden exakt durch den jeweils gegenüberliegenden Lotfußpunkt laufen und genau 3 mal Radius lang sein. Wenn ich den Gedanken weiterspinne drängt sich mir die Vermutung auf, das im Dreieck AMG die Seite AM=2xRadius und die Seite MG=Radius ist. Dann liesse sich die Seite AG berechnen. 2xAG ist dann die Seitenlänge des Dreicks ABC.

    Schade das ich grad kein passendes Progi da hab um das mal zu konstruieren.

  • Ein Kreis geht von 0°-360° d.h., da AutoIt in Radiant rechnet, von 0 bis 2Pi.
    Viele haben Probleme damit mit Radiant etwas anzufangen.
    Radiant ist strenggenommen kein wirklicher Winkel sondern stellt das Bogenstück am Einheitskreis dar.
    Der Umfang eines Kreises mit dem Radius 1 (Einheitskreis) ist 2Pi (bei 360°).
    die Hälfte des Einheitskreises hat die Bogenlänge Pi ( bei 180°) usw.
    So kann man sich den Radiant wahrscheinlich besser vorstellen.
    Bei Sinus & Cosinus kann ich eigentlich nur auf die vielen Darstellungen bezüglich des Einheitskreis hinweisen - anschaulicher geht es erstmal nicht. (>>klickmich<<)

    Wie berechne ich die einzelnen Punkte auf denen der Kreis gezeichnet wird

    Die Laufvariable ist der Winkel - keine Koordinate oder ähnliches.
    Wir wollen also Koordinatenunterschiede zu den Mittelpunktkoordinaten anhand des Winkels und des Radius berechnen.
    In Kurzform:
    x = Xm + cos(Winkel)*Radius
    y = Ym + sin(Winkel)*Radius

    Je nachdem wo man seinen Winkelursprung hin haben möchte kann man sinus und cosinus vertauschen.
    Du gehst in einer For-Schleife von 0 bis 2 Pi einmal durch (Step-Weite beachten).
    Deine Laufvariable ist dann der Winkel.
    Wie man das jetzt konkret in AutoIt umsetzt - keine Ahnung - hab noch nie mit AutoIt gemalt ;)

    Wie berechne ich die 3 Eckpunkte des dreiecks, ausgehend vom Radius?

    Da fehlt eine Nebenbedingung.
    Die Punkte können in unendlicher Kombination liegen.
    Wenigstens 1 Punkt muss bekannt sein.
    Die anderen Punkte liegen dann mit der Schrittweite 2/3*Pi vom 1. Punkt von der Kreismitte entfernt wenn es sich um ein gleichseitiges Dreieck handelt.

    Einmal editiert, zuletzt von AspirinJunkie (12. März 2010 um 10:26)

  • Da fehlt eine Nebenbedingung.
    Die Punkte können in unendlicher Kombination liegen.
    Wenigstens 1 Punkt muss bekannt sein.
    Die anderen Punkte liegen dann mit der Schrittweite 2/3*Pi vom 1. Punkt von der Kreismitte entfernt wenn es sich um ein gleichseitiges Dreieck handelt.

    Mal davon ausgehend das meine Vermutung mit der Länge der Winkelhalbierenden stimmt, dann wäre der Winkel AMG immer 60°. Liesse sich damit nicht auch der Endpunkt in Bezug auf den Mittelpunkt errechnen ohne einen der Punkte A,B oder C zu kennen?

  • [...] dann wäre der Winkel AMG immer 60°. Liesse sich damit nicht auch der Endpunkt in Bezug auf den Mittelpunkt errechnen ohne einen der Punkte A,B oder C zu kennen?

    Beim gleichseitigen wäre AMG (ich denke du nimmst diese Bezeichnungen aus deiner verlinkten Skizze?) wirklich 60° (= 1/3 Pi).
    Das hat allerdings nichts damit zu tun ob man mindestens 1 Punkt kennen muss oder nicht - denn das muss man.
    Stell dir einfach vor du hast dein Dreieck schon fertig um den Kreis.
    Du kannst es beliebig um den Kreis drehen ohne das der Kreis sich verändert.
    Du brauchst also eine Orientierung des Dreiecks.
    Die Seitenlängen und Winkel des Dreiecks bleiben natürlich gleich - es geht nur um die Orientierung des Dreiecks in unserem Koordinatensystem.
    Du könntest beliebig viele Dreiecke berechnen welche den Bedingungen entsprechen (Gleichseitig, gleichwinklig, mit diesem Kreis als Innenkreis...).

  • Hachja ... Geometrie und ich.

    Ja, ich geh von dieser Skizze aus. Der Denkfehler liegt scheinbar darin, das ich davon ausgehe das Seite AB des Dreicks als x-Achse herhalten soll bzw. parallel zu ihr laufen soll. Wenn dem so sein sollte liessen sich die Koordinaten der Lotfusspunkte ja einfach von der des Mittelpunktes ableiten (G wäre bei y von M - Radius) und von G dann die Koordinate der Eckpunkte A und B auf der x-Achse. Daraus dann wiederrum der Punkt C. Alles vor dem Hintergrund das die Winkelhalbierende wirklich 3xRadius ist. Hat ja noch niemand bestätigt.

  • Ja, ich geh von dieser Skizze aus. Der Denkfehler liegt scheinbar darin, das ich davon ausgehe das Seite AB des Dreicks als x-Achse herhalten soll bzw. parallel zu ihr laufen soll.

    Dann ist es eindeutig - dies wäre eine entsprechende Nebenbedingung welche die Orientierung im Koordinatensystem fest macht.

    Alles vor dem Hintergrund das die Winkelhalbierende wirklich 3xRadius ist. Hat ja noch niemand bestätigt.


    Im gleichseitigen Dreieck gilt für den Innenkreisradius ri = Wurzel(3)/6 * AC.
    Für den Umkreisradius: ru = Wurzel(3)/3 * AC.
    Also ri = ru/2.
    Die Winkelhalbierende (in deiner Skizze z.B. A-E) ist dann ri+ru = 3*ri = 1/2*Wurzel(3)* AC

    Wenn er allerdings die Richtung eines Punktes zum Mittelpunkt hat braucht er das alles aber nicht.
    Der nächste Punkt liegt dann einfach 120° weiter mit der Entfernung 2*ri.

    2 Mal editiert, zuletzt von AspirinJunkie (12. März 2010 um 15:08)

  • Also erstmal danke für die ganzen Antworten. Ich muss mich da mal in Ruhe durchlesen.
    AspirinJunkie: Der Link zu dem Sinus / Cosinus Flash hat auf jeden Fall schonmal geholfen - ich werd da gleich mal rumprobieren.

    Zum Thema: Die Ausrichtung des Dreiecks ist eigentlich egal - das Dreieck wird später eh gedreht. Das ganze soll eigentlich so ablaufen:
    autoit.de/wcf/attachment/8170/
    Anhand des Kreisradius wird dasgleichseitige / symmetrische / gleichschenklige / was auch immer Dreieck berechnet. Sagen wir mal der Kreis wäre dabei der Umkreis des Dreiecks. Dann ist der Punkt A in der Skizze schonmal bekannt (100|95)
    Jetzt fehlen noch die anderen 2 Punkte.
    Ich habe aber dank eurer Hilfe schon eine Idee. Ich versuch mal das umzusetzen :)

  • Der Kreisumfang beträgt 2*Pi*r.
    Ein gleichseitiges Dreieck teilt den Umkreisumfang in 3 gleiche Teile.
    Also den Kreis vom Ausgangspunkt hinunter wandern und nach 1/3 *2*Pi*r bist du bei Púnkt2.

  • Soo ich hab jetzt mal ein bisschen gebastelt, aber besser als so bekomme ichs nciht hin.
    Das sieht aber noch nicht ganz richtig aus. Berechnet wird in den Zeilen 43 ff.

    Ich hab wahrscheinlich alles was ich gelesen hab wild zusammengewürfelt :D
    Kann mir einer sagen, was ich falsch mache?

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    Opt("GUIOnEventMode", 1)
    OnAutoItExitRegister("__GDIPlus_Shutdown")
    _GDIPlus_Startup()

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

    Global $iRadius = 100
    Global $iWidth = 640, $iHeight = 480
    $GUI_Back_Color = 0xFF000000

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

    Global $aPolygon

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

    $hGUI = GUICreate("", $iWidth, $iHeight)
    GUISetOnEvent(-3, "OnEvent_Eventhandler")
    GUIRegisterMsg($WM_PAINT, "WM_PAINT")

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    $hBrush = _GDIPlus_BrushCreateSolid(0xFF000000 + $GUI_Back_Color)
    $hPen = _GDIPlus_PenCreate(0xFF000000, 3)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphic)
    $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)

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

    _Draw()
    GUISetState()
    While 1 * Sleep(10)
    WEnd

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

    Func OnEvent_Eventhandler()
    Switch @GUI_CtrlId
    Case -3
    Exit
    EndSwitch
    EndFunc ;==>OnEvent_Eventhandler

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

    Func _Draw()
    Local $iPi = 3.14159265358979, $iDegToRad = $iPi / 180
    Local $iEllipseCol = 0xFFEA33EE, $iTriangleCol = 0xFF6FE1EE
    Dim $aMitte[2] = [$iWidth / 2, $iHeight / 2]
    Dim $aPolygon[4][2] = [[3],[$aMitte[0], $aMitte[1] - $iRadius]] ; punkt A, über Mittelpunkt.

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

    $aPolygon[2][0] = $aMitte[0] + Cos($iPi * 1 / 3) * $iRadius
    $aPolygon[2][1] = $aMitte[1] + Sin($iPi * 1 / 3) * $iRadius
    $aPolygon[3][0] = $aMitte[0] + Cos($iPi * 2 / 3) * $iRadius
    $aPolygon[3][1] = $aMitte[1] + Sin($iPi * 2 / 3) * $iRadius
    ;~ _ArrayDisplay($aPolygon)
    ;~ x = Xm + cos(Winkel)*Radius
    _GDIPlus_GraphicsClear($hBackbuffer,$GUI_Back_Color)
    _GDIPlus_PenSetColor($hPen, $iEllipseCol)
    _GDIPlus_GraphicsDrawEllipse($hBackbuffer, $aMitte[0] - $iRadius, $aMitte[1] - $iRadius, $iRadius * 2, $iRadius * 2, $hPen)
    _GDIPlus_PenSetColor($hPen, $iTriangleCol)
    _GDIPlus_GraphicsDrawPolygon($hBackbuffer, $aPolygon,$hPen)
    EndFunc ;==>_Draw

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

    Func WM_PAINT()
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iWidth, $iHeight)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_PAINT

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

    Func __GDIPlus_Shutdown()
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_Shutdown()
    EndFunc ;==>__GDIPlus_Shutdown

    [/autoit]
  • Ich kann Dir auch nicht sagen, was falsch ist. Aber ich hatte mal sowas gebastelt, vielleicht hilft Dir das (das kann man noch optimieren):

    Spoiler anzeigen
    [autoit]


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

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

    _GDIPlus_Startup()
    Global $iX = @DesktopWidth, $iY = @DesktopHeight, $r0 = 170, $i = 100
    Global $Pi = 4 * ATan(1)
    Global $hWnd = GUICreate("GDI+", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP)
    Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    Global $hPen5 = _GDIPlus_PenCreate(0xFF0000FF, 2, 2)
    Global $hPenBlack = _GDIPlus_PenCreate(0xFF000000, 2, 2)

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

    HotKeySet("{ESC}", "Ende")
    GUIRegisterMsg($WM_LBUTTONDOWN, "Ende")
    _Main()

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

    Func _Main()
    GUISetBkColor(0x000000)
    GUISetCursor(16)
    GUISetState()
    While True
    For $i = 360 To 0 Step -0.5
    ;Das Dreieck
    $c = $i * - 1
    $1x1 = $r0 * Cos(($c) * ($Pi / 180)) + $iX / 2
    $1y1 = $r0 * Sin(($c) * ($Pi / 180)) + $iY / 2
    $1x2 = $r0 * Cos(($c + 120) * ($Pi / 180)) + $iX / 2
    $1y2 = $r0 * Sin(($c + 120) * ($Pi / 180)) + $iY / 2
    $2x1 = $r0 * Cos(($c) * ($Pi / 180)) + $iX / 2
    $2y1 = $r0 * Sin(($c) * ($Pi / 180)) + $iY / 2
    $2x2 = $r0 * Cos(($c - 120) * ($Pi / 180)) + $iX / 2
    $2y2 = $r0 * Sin(($c - 120) * ($Pi / 180)) + $iY / 2
    $3x1 = $r0 * Cos(($c + 240) * ($Pi / 180)) + $iX / 2
    $3y1 = $r0 * Sin(($c + 240) * ($Pi / 180)) + $iY / 2
    $3x2 = $r0 * Cos(($c + 120) * ($Pi / 180)) + $iX / 2
    $3y2 = $r0 * Sin(($c + 120) * ($Pi / 180)) + $iY / 2

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

    ;'Radierer'
    $c1 = $c - 0.5
    $1x1b = $r0 * Cos(($c1) * ($Pi / 180)) + $iX / 2
    $1y1b = $r0 * Sin(($c1) * ($Pi / 180)) + $iY / 2
    $1x2b = $r0 * Cos(($c1 + 120) * ($Pi / 180)) + $iX / 2
    $1y2b = $r0 * Sin(($c1 + 120) * ($Pi / 180)) + $iY / 2
    $2x1b = $r0 * Cos(($c1) * ($Pi / 180)) + $iX / 2
    $2y1b = $r0 * Sin(($c1) * ($Pi / 180)) + $iY / 2
    $2x2b = $r0 * Cos(($c1 - 120) * ($Pi / 180)) + $iX / 2
    $2y2b = $r0 * Sin(($c1 - 120) * ($Pi / 180)) + $iY / 2
    $3x1b = $r0 * Cos(($c1 + 240) * ($Pi / 180)) + $iX / 2
    $3y1b = $r0 * Sin(($c1 + 240) * ($Pi / 180)) + $iY / 2
    $3x2b = $r0 * Cos(($c1 + 120) * ($Pi / 180)) + $iX / 2
    $3y2b = $r0 * Sin(($c1 + 120) * ($Pi / 180)) + $iY / 2
    ;Aktives Rechteck
    $Line1 = _GDIPlus_GraphicsDrawLine($hGraphic, $1x1, $1y1, $1x2, $1y2, $hPen5)
    $Line2 = _GDIPlus_GraphicsDrawLine($hGraphic, $2x1, $2y1, $2x2, $2y2, $hPen5)
    $Line3 = _GDIPlus_GraphicsDrawLine($hGraphic, $3x1, $3y1, $3x2, $3y2, $hPen5)

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

    Sleep(3)
    ;2te Linie überzeichnen
    _GDIPlus_GraphicsDrawLine($hGraphic, $1x1b, $1y1b, $1x2b, $1y2b, $hPenBlack)
    _GDIPlus_GraphicsDrawLine($hGraphic, $2x1b, $2y1b, $2x2b, $2y2b, $hPenBlack)
    _GDIPlus_GraphicsDrawLine($hGraphic, $3x1b, $3y1b, $3x2b, $3y2b, $hPenBlack)

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

    Sleep(7)
    Next
    Sleep(3000)
    WEnd
    EndFunc ;==>_Main

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

    Func Ende()
    _GDIPlus_PenDispose($hPen5)
    _GDIPlus_PenDispose($hPenBlack)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>Ende

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • Eins vorweg: Ich hab keine Ahnung von GDI+
    Aber ich denke folgendes sollte das sein was du willst:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    Opt("GUIOnEventMode", 1)
    OnAutoItExitRegister("__GDIPlus_Shutdown")
    _GDIPlus_Startup()

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

    Global $iRadius = 100
    Global $iWidth = 640, $iHeight = 480
    $GUI_Back_Color = 0xFF000000

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

    Global $aPolygon

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

    $hGUI = GUICreate("", $iWidth, $iHeight)
    GUISetOnEvent(-3, "OnEvent_Eventhandler")
    GUIRegisterMsg($WM_PAINT, "WM_PAINT")

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    $hBrush = _GDIPlus_BrushCreateSolid(0xFF000000 + $GUI_Back_Color)
    $hPen = _GDIPlus_PenCreate(0xFF000000, 3)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphic)
    $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)

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

    _Draw()
    GUISetState()
    While 1 * Sleep(10)
    WEnd

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

    Func OnEvent_Eventhandler()
    Switch @GUI_CtrlId
    Case -3
    Exit
    EndSwitch
    EndFunc ;==>OnEvent_Eventhandler

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

    Func _Draw()
    Local $iPi = 4*ATan(1), $iDegToRad = $iPi / 180
    Local $iEllipseCol = 0xFFEA33EE, $iTriangleCol = 0xFF6FE1EE
    Local $aMitte[2] = [$iWidth / 2, $iHeight / 2]

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

    Local $aA = PolarAnhaeng($aMitte, 0, $iRadius)
    Local $aB = PolarAnhaeng($aMitte, (2*$iPi)/3, $iRadius)
    Local $aC = PolarAnhaeng($aMitte, (4*$iPi)/3, $iRadius)

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

    Local $aPolygon[4][2] = [[3,0], [$aA[0],$aA[1]], [$aB[0],$aB[1]],[$aC[0],$aC[1]]]

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

    _GDIPlus_GraphicsClear($hBackbuffer, $GUI_Back_Color)
    _GDIPlus_PenSetColor($hPen, $iEllipseCol)
    _GDIPlus_GraphicsDrawEllipse($hBackbuffer, $aMitte[0] - $iRadius, $aMitte[1] - $iRadius, $iRadius * 2, $iRadius * 2, $hPen)
    _GDIPlus_PenSetColor($hPen, $iTriangleCol)
    _GDIPlus_GraphicsDrawPolygon($hBackbuffer, $aPolygon, $hPen)
    EndFunc ;==>_Draw

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

    Func WM_PAINT()
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iWidth, $iHeight)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_PAINT

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

    Func __GDIPlus_Shutdown()
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_Shutdown()
    EndFunc ;==>__GDIPlus_Shutdown

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

    ; Berechnet einen polaren Anhänger
    Func PolarAnhaeng(ByRef $iXq, $iWinkel, $iRadius)
    Local $Ret[2] = [ Round($iXq[0] + sin($iWinkel)*$iRadius), _
    Round($iXq[1] - cos($iWinkel)*$iRadius)]
    Return $Ret
    EndFunc

    [/autoit]

    Ich denke mal eine kleine Falle in die man schnell treten kann ist die Orientierung.
    Bei Bildschirmkoordinaten handelt es sich um ein linksseitiges Koordinatensystem weswegen man die Y-Achse "anders herum" betrachten muss.

    Einmal editiert, zuletzt von AspirinJunkie (12. März 2010 um 16:04)

  • Ich glaube ihr denkt zu kompliziert! Ein Dreieck hat 3 Ecken und auf einen Kreis transferiert bedeutet dies, dass alle 120° eine Ecke vom Dreick ist!

    Die x Koordinate kann man über Cos(Grad * Pi /180) * Radius bzw. y Koordinate Sin(Grad * Pi /180) * Radius berechnen.

    Für das Dreickeck bedeutet dies 3 Punkte jeweils mit 120° Differenz!

    Beispiel:

    Spoiler anzeigen
    [autoit]


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

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

    Local Const $width = 800
    Local Const $height = 800
    Local $hGraphics, $hBackbuffer, $hBitmap, $hPen, $i, $pi_div_180 = 4 * ATan(1) / 180
    Local $w_h = $width * 0.5, $h_h = $height * 0.5
    Local $radius_x = $w_h, $radius_y = $h_h
    Local $p1_x, $p1_y, $p2_x, $p2_y, $p3_x, $p3_y
    Local $title = "GDI+ Beispiel von UEZ"

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

    Opt("GUIOnEventMode", 1)
    $hwnd = GUICreate($title, $width, $height, -1, -1, BitOR($WS_SYSMENU,$WS_DLGFRAME,$WS_POPUP))
    GUISetOnEvent($GUI_EVENT_CLOSE, "close")
    GUISetState()
    If @OSBuild < 7600 Then WinSetTrans($hwnd,"", 0xFF)

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

    _GDIPlus_Startup()
    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hwnd)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($width, $height, $hGraphics)
    $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _GDIPlus_GraphicsSetSmoothingMode($hBackbuffer, 2)
    $hPen = _GDIPlus_PenCreate(0xFFFFFFFF, 2)

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

    Do
    _GDIPlus_GraphicsClear($hBackbuffer)
    $p1_x = $w_h + Cos($i * $pi_div_180) * $radius_x ;x Koordinate vom 1. Punkt
    $p1_y = $h_h + Sin($i * $pi_div_180) * $radius_y ;y Koordinate vom 1. Punkt
    $p2_x = $w_h + Cos(($i + 120) * $pi_div_180) * $radius_x ;x Koordinate vom 2. Punkt
    $p2_y = $h_h + Sin(($i + 120) * $pi_div_180) * $radius_y ;y Koordinate vom 2. Punkt
    $p3_x = $w_h + Cos(($i + 240) * $pi_div_180) * $radius_x ;x Koordinate vom 3. Punkt
    $p3_y = $h_h + Sin(($i + 240)* $pi_div_180) * $radius_y ;y Koordinate vom 3. Punkt
    _GDIPlus_GraphicsDrawLine($hBackbuffer, $p1_x, $p1_y, $p2_x, $p2_y, $hPen) ;verbinde p1-p2
    _GDIPlus_GraphicsDrawLine($hBackbuffer, $p2_x, $p2_y, $p3_x, $p3_y, $hPen) ;verbinde p2-p3
    _GDIPlus_GraphicsDrawLine($hBackbuffer, $p3_x, $p3_y, $p1_x, $p1_y, $hPen) ;verbinde p3-p1
    _GDIPlus_GraphicsDrawEllipse($hBackbuffer, $w_h - $radius_x / 2, $h_h - $radius_y / 2, $radius_x, $radius_y, $hPen) ;innerer Kreis
    _GDIPlus_GraphicsDrawEllipse($hBackbuffer, 0, 0, 2 * $radius_x, 2 * $radius_y, $hPen) ;äußerer Kreis
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, $width, $height)
    $i += 2
    If $i = 360 Then $i = 0
    Sleep(30)
    Until False

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

    Func close()
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_GraphicsDispose($hBackbuffer)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_Shutdown()
    Exit
    EndFunc

    [/autoit]

    Ich hofffe, dass ich es erklären konnte!

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    Einmal editiert, zuletzt von UEZ (12. März 2010 um 16:28)

  • Das merkte ich hier schon 2x an und habe es in meinem letzten Post umgesetzt.
    Warum denk ich da zu kompliziert?

    Das war kein Angriff, sondern nach meiner Meinung nur eine Feststellung und außerdem nicht speziel gegen dich gerichtet, nach dem ich die Skizze von latemail gesehen habe! Ich habe mir auch deinen Code nicht näher angeschaut (nur überflogen). Mag sein, dass es im Prinzip das Gleiche macht!

    UEZ :huh:

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Wieso Angriff?
    War auch nur eine Frage bezüglich der Aussage da ich diese nicht verstanden habe.
    Denn es ist das selbe Prinzip.
    Der einzige Unterschied ist (mal von der wunderschönen Animation abgesehen) dass ich nicht zwischen Grad und Radiant hin und her rechne sondern gleich bei Radiant bleibe.
    Hab nur die Aussage nicht verstanden.
    Nix passiert ;)

  • ich habs verstanden :O
    Danke vielmals an alle !

    Der Post von UEZ hat endlich dafür gesorgt, dass es Klick macht! Danke dafür.

    Ich hab mal das was ich da gelernt habe versucht umzusetzen. Rausgekommen ist dabei dann folgendes:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    Opt("GUIOnEventMode", 1)
    OnAutoItExitRegister("__GDIPlus_Shutdown")
    _GDIPlus_Startup()

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

    Global $iRadius = 100
    Global $iWidth = 640, $iHeight = 480
    $GUI_Back_Color = 0xFF000000

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

    Dim $aPoly_k[4][2] = [[3]], $aPoly_g[4][2] = [[3]]
    Dim $aM[2] = [$iWidth / 2, $iHeight / 2]
    $hGUI = GUICreate("", $iWidth, $iHeight)
    GUISetOnEvent(-3, "OnEvent_Eventhandler")
    GUIRegisterMsg($WM_PAINT, "WM_PAINT")

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    $hBrush = _GDIPlus_BrushCreateSolid(0xFF000000 + $GUI_Back_Color)
    $hPen = _GDIPlus_PenCreate(0xFF000000, 3)
    $hPenW = _GDIPlus_PenCreate(0xFFFFFFFF, 3)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphic)
    $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _GDIPlus_GraphicsSetSmoothingMode($hBackbuffer,2)

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

    GUISetState()
    While 1 * Sleep(10)
    _Draw()
    WEnd

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

    Func OnEvent_Eventhandler()
    Switch @GUI_CtrlId
    Case -3
    Exit
    EndSwitch
    EndFunc ;==>OnEvent_Eventhandler

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

    Func _Draw()
    Local $iStep = 1
    Local $deg2rad = ATan(1) * 4 / 180
    Local $iEllipseCol = 0xFFEA33EE, $iTriangleCol = 0xFF6FE1EE
    $iRad2 = $iRadius * 2

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

    For $i = 0 To 720 Step $iStep
    $aPoly_k[1][0] = $aM[0] + Cos($i * $deg2rad) * $iRadius
    $aPoly_k[1][1] = $aM[1] + Sin($i * $deg2rad) * $iRadius
    $aPoly_k[2][0] = $aM[0] + Cos(($i + 120) * $deg2rad) * $iRadius
    $aPoly_k[2][1] = $aM[1] + Sin(($i + 120) * $deg2rad) * $iRadius
    $aPoly_k[3][0] = $aM[0] + Cos(($i + 240) * $deg2rad) * $iRadius
    $aPoly_k[3][1] = $aM[1] + Sin(($i + 240) * $deg2rad) * $iRadius

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

    $aPoly_g[1][0] = $aM[0] + Cos((360 - $i / 2) * $deg2rad) * $iRad2
    $aPoly_g[1][1] = $aM[1] + Sin((360 - $i / 2) * $deg2rad) * $iRad2
    $aPoly_g[2][0] = $aM[0] + Cos(((360 - $i / 2) + 120) * $deg2rad) * $iRad2
    $aPoly_g[2][1] = $aM[1] + Sin(((360 - $i / 2) + 120) * $deg2rad) * $iRad2
    $aPoly_g[3][0] = $aM[0] + Cos(((360 - $i / 2) + 240) * $deg2rad) * $iRad2
    $aPoly_g[3][1] = $aM[1] + Sin(((360 - $i / 2) + 240) * $deg2rad) * $iRad2

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

    ;~ _ArrayDisplay($aPoly_k)
    ;~ x = Xm + cos(Winkel)*Radius
    _GDIPlus_GraphicsClear($hBackbuffer, $GUI_Back_Color)

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

    _GDIPlus_BrushSetSolidColor($hBrush, $iTriangleCol)
    _GDIPlus_GraphicsFillPolygon($hBackbuffer, $aPoly_g, $hBrush)
    _GDIPlus_GraphicsDrawPolygon($hBackbuffer, $aPoly_g, $hPenW)

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

    _GDIPlus_BrushSetSolidColor($hBrush, 0xFFEBCC8B)
    _GDIPlus_GraphicsFillEllipse($hBackbuffer, $aM[0] - $iRadius, $aM[1] - $iRadius, $iRadius * 2, $iRadius * 2, $hBrush)
    _GDIPlus_GraphicsDrawEllipse($hBackbuffer, $aM[0] - $iRadius, $aM[1] - $iRadius, $iRadius * 2, $iRadius * 2, $hPen)

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

    _GDIPlus_BrushSetSolidColor($hBrush, 0x55F59C9C)
    _GDIPlus_GraphicsFillPolygon($hBackbuffer, $aPoly_k, $hBrush)
    _GDIPlus_GraphicsDrawPolygon($hBackbuffer, $aPoly_k, $hPen)

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

    _GDIPlus_BrushSetSolidColor($hBrush, 0x77EA33EE)
    _GDIPlus_GraphicsFillEllipse($hBackbuffer, $aM[0] - $iRad2, $aM[1] - $iRad2, $iRad2 * 2, $iRad2 * 2, $hBrush)
    _GDIPlus_GraphicsDrawEllipse($hBackbuffer, $aM[0] - $iRad2, $aM[1] - $iRad2, $iRad2 * 2, $iRad2 * 2, $hPenW)

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

    WM_PAINT()
    Next
    EndFunc ;==>_Draw

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

    Func WM_PAINT()
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iWidth, $iHeight)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_PAINT

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

    Func __GDIPlus_Shutdown()
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_Shutdown()
    EndFunc ;==>__GDIPlus_Shutdown

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

    Sehr cool 8)

    //EDIT nochmal angepasst