Kreis berechnen

  • Hat jemand eine Idee wie man hinbekommt, das der Rote kreis immer so weit dreht wie die maus steht?
    Also man müsste ja eigentlich nur die Grad-Zahl ausrechenen aber ich bekomm das nicht hin:(
    Ich fersuch es nochmla verständlich zu machen:
    Also der Rote kreis hat unten seinen Startpunkt.
    Wenn man jetzt die Maus bewegt soll sich der rote kreis weiter bewegen bzw. zurückbewegen so das er bei der Maus ist. Also das er aber immer noch im Blauen Kreis ist!
    Das ist scheiße zu erklären

    Spoiler anzeigen
    [autoit]

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

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

    #Region ### START Koda GUI section ### Form=
    $hWnd = GUICreate("Form1", 105, 105, 193, 125,$WS_POPUP)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    $Pen1 = _GDIPlus_PenCreate(0xFF0000FF, 5)
    $Pen2 = _GDIPlus_PenCreate(0xFFFF0000, 5)
    _GDIPlus_GraphicsDrawArc($hGraphic, 2, 2, 100, 100, 0, 360,$Pen1)
    _GDIPlus_GraphicsDrawArc($hGraphic, 2, 2, 100, 100, 90, 90,$Pen2)
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case -3
    Exit

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

    EndSwitch
    WEnd

    [/autoit]

    mfg. Jam00

    Einmal editiert, zuletzt von Jam00 (14. April 2009 um 19:34)

  • Ja, und halbt so weit sich bewegen wie man es tut, ist also der Mauszeiger 180° vom Startpunkt (unten) entfernt soll das auch so gemalt werden, nur den ° auszurechnen bekomme ich nicht hin

    mfg. Jam00

  • Das machst du am Besten mit nem rechtwinkligem Dreieck und dem Sinussatz... erst den Mittelpunkt des Kreises berrechnen, dann die Strecke vom mittelpunkt bis zur X-Koordinate/bzw. Y Koordinate der Maus berechnen und dann mit dem Sinussatz (Gegenkathete/Ankathete, also [XKreis- XMaus]/[YKreis/YMaus]) berrechnen und voilla schon has du deinen Winkel... dann musstu nur noch unterschieden in welchem Quadranten sich die Maus bewegt und deine Kreise dementsprechend bewegen... Hah ich wusste doch das ich mein Mathewissen aus der 8 iiirgendwann wieder brauchen würde :D

  • Ja, das ist ganz schon, was du mir da schreibst aber ich kann das nicht ;( und du sagt selber es ist stoff der 8, ich bin erst in der 7 :wacko: Kannst du vieleicht ein kleines Beispiel machen?

    mfg. Jam00

  • Hi,
    tröste dich, es hat auch bei mir ein bisschen gedauert, bis ich meine Sätze wieder zusammen hatte ;).

    Spoiler anzeigen
    [autoit]


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

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

    Global $a, $b, $bufferarray[2], $x = 193, $y = 125

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

    $hWnd = GUICreate("Form1", 105, 105, $x, $y, $WS_POPUP)
    GUISetState(@SW_SHOW)

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

    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    $Pen1 = _GDIPlus_PenCreate(0xFF0000FF, 5)
    $Pen2 = _GDIPlus_PenCreate(0xFFFF0000, 5)
    _GDIPlus_GraphicsDrawArc($hGraphic, 2, 2, 100, 100, 0, 360, $Pen1)
    _GDIPlus_GraphicsDrawArc($hGraphic, 2, 2, 100, 100, 90, 90, $Pen2)

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

    While 1
    $pos = MouseGetPos()
    If ($pos[0] <> $bufferarray[0]) And ($pos[1] <> $bufferarray[1]) Then
    $a = ($y + 50) - $pos[1]
    $b = ($x + 50) - $pos[0]
    $winkel = 180 - (90 + _Atan($b / $a))
    If $a > 0 Then $winkel = $winkel + 180
    _redraw($winkel - 45)
    $bufferarray[0] = $pos[0]
    $bufferarray[1] = $pos[1]
    EndIf

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

    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case - 3
    Exit
    EndSwitch
    WEnd

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

    Func _redraw($pos)
    _GDIPlus_GraphicsDrawArc($hGraphic, 2, 2, 100, 100, 0, 360, $Pen1)
    _GDIPlus_GraphicsDrawArc($hGraphic, 2, 2, 100, 100, $pos, 90, $Pen2)
    EndFunc ;==>_redraw

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

    Func _Atan($num)
    $radToDeg = 180 / (4 * ATan(1))
    Return ATan($num) * $radToDeg
    EndFunc ;==>_Atan

    [/autoit]

    /Edit: kleiner Fix

  • Oki, THX, das ist cool! :thumbup::thumbup:
    Eine frage noch:
    Wie bekomme ich es hin, das wenn man z.b. mehr als 108 gedreht hat, das es dann nur noch in die eine Richtung geht, weil so springt es immer

    Spoiler anzeigen
    [autoit]

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

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

    $hWnd = GUICreate("Form1", 105, 105, 193, 125, $WS_POPUP)
    GUISetState(@SW_SHOW)

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

    Global $a, $b, $bufferarray[2]

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

    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    $Pen1 = _GDIPlus_PenCreate(0xFF0000FF, 5)
    $Pen2 = _GDIPlus_PenCreate(0xFFFF0000, 5)
    _GDIPlus_GraphicsDrawArc($hGraphic, 2, 2, 100, 100, 0, 360, $Pen1)
    _GDIPlus_GraphicsDrawArc($hGraphic, 2, 2, 100, 100, 90, 90, $Pen2)

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

    While 1
    $pos = MouseGetPos()
    If ($pos[0] <> $bufferarray[0]) And ($pos[1] <> $bufferarray[1]) Then
    $a = (125 + 50) - $pos[1]
    $b = (193 + 50) - $pos[0]
    $winkel = 180 - (90 + _Atan($b / $a))
    If $a > 0 Then $winkel = $winkel + 180
    _redraw($winkel - 45)
    $bufferarray[0] = $pos[0]
    $bufferarray[1] = $pos[1]
    EndIf

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

    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case - 3
    Exit
    EndSwitch
    WEnd

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

    Func _redraw($pos)
    _GDIPlus_GraphicsDrawArc($hGraphic, 2, 2, 100, 100, 0, 360, $Pen1)
    _GDIPlus_GraphicsDrawArc($hGraphic, 2, 2, 100, 100,90 , $pos, $Pen2)
    EndFunc ;==>_redraw

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

    Func _Atan($num)
    $radToDeg = 180 / (4 * ATan(1))
    Return ATan($num) * $radToDeg
    EndFunc ;==>_Atan

    [/autoit]

    mfg. Jam00

  • Hey,
    meinst du so?

    Spoiler anzeigen
    [autoit]


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

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

    $hWnd = GUICreate("Form1", 105, 105, 193, 125, $WS_POPUP)
    GUISetState(@SW_SHOW)

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

    Global $a, $b, $bufferarray[2]

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

    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    $Pen1 = _GDIPlus_PenCreate(0xFF0000FF, 5)
    $Pen2 = _GDIPlus_PenCreate(0xFFFF0000, 5)
    _GDIPlus_GraphicsDrawArc($hGraphic, 2, 2, 100, 100, 0, 360, $Pen1)
    _GDIPlus_GraphicsDrawArc($hGraphic, 2, 2, 100, 100, 90, 90, $Pen2)

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

    While 1
    $pos = MouseGetPos()

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

    If ($pos[0] <> $bufferarray[0]) And ($pos[1] <> $bufferarray[1]) Then
    $a = (125 + 50) - $pos[1]
    $b = (193 + 50) - $pos[0]
    $winkel = (-1) * _Atan($b / $a)
    If $a > 0 Then $winkel = $winkel + 180
    If $winkel < 0 Then $winkel = $winkel + 360
    _redraw($winkel)
    $bufferarray[0] = $pos[0]
    $bufferarray[1] = $pos[1]
    EndIf

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

    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case - 3
    Exit
    EndSwitch
    WEnd

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

    Func _redraw($pos)
    _GDIPlus_GraphicsDrawArc($hGraphic, 2, 2, 100, 100, 0, 360, $Pen1)
    _GDIPlus_GraphicsDrawArc($hGraphic, 2, 2, 100, 100, 90, $pos, $Pen2)
    EndFunc ;==>_redraw

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

    Func _Atan($num)
    $radToDeg = 180 / (4 * ATan(1))
    Return ATan($num) * $radToDeg
    EndFunc ;==>_Atan

    [/autoit]
  • Wie für beide Seiten?
    Soll das auch in die andere Richtung gehn?
    Das einzubauen ist nicht schwer, aber ich hab das Script jetzt schon 3 mal komplett umgebaut, nur weil du am Anfang nicht gesagt hast, was du willst :D.
    Wenn du einfach von vornherein ganz genau sagen würdest wie du das vorhast, dann wärst du 10 mal so schnell fertig.
    Jetzt darfst du erst mal alleine basteln :).

  • Ja genau das möchte ich^^
    Ja ich habe doch gesagt ist scheiße zu erklären^^
    Ja und ich habe gesagt ich Probiere es^^
    Wenn ich es nicht schaffe melde ich mich nochmal, das ist aber schon echt gut

    Also ich habe es bis jetzt so:

    Spoiler anzeigen
    [autoit]

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

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

    $hWnd = GUICreate("Form1", 105, 105, 193, 125, $WS_POPUP)
    GUISetState(@SW_SHOW)

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

    Global $a, $b, $bufferarray[2]

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

    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    $Pen1 = _GDIPlus_PenCreate(0xFF0000FF, 5)
    $Pen2 = _GDIPlus_PenCreate(0xFFFF0000, 5)
    _GDIPlus_GraphicsDrawArc($hGraphic, 2, 2, 100, 100, 0, 360, $Pen1)
    $posOld = 0
    $pos2Old = 0
    While 1
    $pos = MouseGetPos()

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

    If ($pos[0] <> $bufferarray[0]) And ($pos[1] <> $bufferarray[1]) Then
    $a = (125 + 50) - $pos[1]
    $b = (193 + 50) - $pos[0]
    $winkel = (-1) * _Atan($b / $a)
    If $a > 0 Then $winkel += 180
    If $winkel < 0 Then $winkel += 360
    _redraw($winkel)
    $bufferarray[0] = $pos[0]
    $bufferarray[1] = $pos[1]
    EndIf

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

    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case - 3
    Exit
    EndSwitch
    WEnd

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

    Func _redraw($pos)
    If $pos - 90 <= $posOld And $pos > 0 And $pos2Old < 90 Then
    _GDIPlus_GraphicsDrawArc($hGraphic, 2, 2, 100, 100, 0, 360, $Pen1)
    _GDIPlus_GraphicsDrawArc($hGraphic, 2, 2, 100, 100, 90, $pos, $Pen2)
    $posOld = $pos
    If $pos <= 360 And $pos >= 345 Then
    MsgBox (0,"","")
    _GDIPlus_GraphicsDrawArc($hGraphic, 2, 2, 100, 100, 0, 360, $Pen1)
    $posOld = 0
    EndIf
    EndIf
    EndFunc ;==>_redraw

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

    Func _Atan($num)
    $radToDeg = 180 / (4 * ATan(1))
    Return ATan($num) * $radToDeg
    EndFunc ;==>_Atan

    [/autoit]

    mfg. Jam00

  • Wenn ich jedes Mal gepostet hätte, wenn etwas eine Stunde nicht funktioniert hat, hätte ich jetzt 8000 Posts und nicht 4000 :D.

    Späßle ;).

    peethebee

    Genau das denke ich auch bei vielen Post's hier im Forum .... Juhu ich habe jetzt auch 340 Posts :rolleyes:

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Ich verstehs immer noch nicht ...

    Meinst du vielleicht so?

    Spoiler anzeigen
    [autoit]

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

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

    $hWnd = GUICreate("Form1", 105, 105, 193, 125, $WS_POPUP)
    GUISetState(@SW_SHOW)

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

    Global $a, $b, $bufferarray[2], $bufferpos

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

    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    $Pen1 = _GDIPlus_PenCreate(0xFF0000FF, 5)
    $Pen2 = _GDIPlus_PenCreate(0xFFFF0000, 5)
    _GDIPlus_GraphicsDrawArc($hGraphic, 2, 2, 100, 100, 0, 360, $Pen1)
    _GDIPlus_GraphicsDrawArc($hGraphic, 2, 2, 100, 100, 90, 90, $Pen2)

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

    While 1
    $pos = MouseGetPos()

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

    If ($pos[0] <> $bufferarray[0]) And ($pos[1] <> $bufferarray[1]) Then
    $a = (125 + 50) - $pos[1]
    $b = (193 + 50) - $pos[0]
    $winkel = (-1) * _Atan($b / $a)
    If $a > 0 Then $winkel = $winkel + 180
    If $winkel < 0 Then $winkel = $winkel + 360

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

    ToolTip($b & ' ' & $winkel)

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

    If ($winkel - $bufferpos) < 0 Then
    _redraw((360 - $winkel) * (-1))
    $bufferpos = $winkel
    Else
    _redraw($winkel)
    $bufferpos = $winkel
    EndIf

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

    $bufferarray[0] = $pos[0]
    $bufferarray[1] = $pos[1]
    EndIf

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

    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case - 3
    Exit
    EndSwitch
    WEnd

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

    Func _redraw($pos)
    _GDIPlus_GraphicsDrawArc($hGraphic, 2, 2, 100, 100, 0, 360, $Pen1)
    _GDIPlus_GraphicsDrawArc($hGraphic, 2, 2, 100, 100, 90, $pos, $Pen2)
    EndFunc ;==>_redraw

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

    Func _Atan($num)
    $radToDeg = 180 / (4 * ATan(1))
    Return ATan($num) * $radToDeg
    EndFunc ;==>_Atan

    [/autoit]

    PS. das ist das letzte mal, dass ich hierzu was bastele, wenn ich nicht genau weis was du willst. Ich hab jetzt zum 4. Mal geraten und dabei (bis jetzt) 2 mal falsch gelegen. Also sag mir jetzt endlich was du willst, das is ja furchtbar :D.