Ellipsenartige Bewegung um einen Punkt

  • Ich würde gern' den blauen Punkt auf der roten Bahn um den schwarzen Punkt rotieren lassen. Leider habe ich keinen blassen Schimmer, wie ich das machen soll.
    Mir fehlt die Rechnung, gibt es dafür eine?


    Einmal editiert, zuletzt von xp_fan (5. April 2010 um 21:23)

  • name22: Leider hatten wir diese ganzen Berechnungen im Unterricht noch nicht, welcher Teil im Script ist dafür genau verantwortlich?
    @tkaus: Danke, leider kann ich mit den ganzen Formel (noch) nicht soviel abgewinnen. ;(

    Vielleicht könnte mir jemand ein einfaches Beispiel schreiben.

  • Das hier ist dafür verantwortlich:

    [autoit]

    For $i = 0 To 270 Step 90
    $VectorX1 = Cos(($Degree1 - 90 + $i) * $Pi_Div_180) * $Width1 + $GUIWidth / 2
    $VectorY1 = Sin(($Degree1 - 90 + $i) * $Pi_Div_180) * $Height1 + $GUIHeight / 2 + 125
    $Points1[$j][0] = $VectorX1
    $Points1[$j][1] = $VectorY1
    $j += 1
    Next
    $j = 1
    For $i = 0 To 270 Step 90
    $VectorX2 = Cos(($Degree2 - 90 + $i) * $Pi_Div_180) * $Width2 + $GUIWidth / 2
    $VectorY2 = Sin(($Degree2 - 90 + $i) * $Pi_Div_180) * $Height2 + $GUIHeight / 2
    $Points2[$j][0] = $VectorX2
    $Points2[$j][1] = $VectorY2
    $j += 1
    Next

    [/autoit]


    Und so schwer ist das doch nicht. Im Prinzip musst du es nicht einmal verstehen :D .
    Einfaches Beispiel folgt :thumbup:

    • Offizieller Beitrag

    Diese Form der Berechnung hat allerdings einen Nachteil. Als Basis wird die Gradzahl herangezogen. An den beiden Scheitelpunkten der Ellipse liegen die Punkte am dichtesten, während die auf der übrigen Bahn relativ weit gestreut liegen. Ursache ist die unterschiedliche Bahngeschwindigkeit. Da wäre es vielleicht sinnvoll mit dem Bogenmaß zu rechnen, damit man zwischen 2 Punkten stets dieselbe zurückgelegte Strecke hat. Dann hätten wir auch eine gleichförmige Bahnbewegung.

  • Hier eine von vielen Möglichkeiten:

    Spoiler anzeigen
    [autoit]


    #include <GDIPlus.au3>

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

    Local Const $width = 800
    Local Const $height = 800
    Local $hGraphics, $hBackbuffer, $hBitmap, $hPen1, $hPen2, $hPen3, $hPen1_s, $hPen2_s, $i, $pi_div_180 = 4 * ATan(1) / 180
    Local $w_h = $width * 0.5, $h_h = $height * 0.5 ; Bildschirm Mitte
    Local $r1 = 300 ;Radius 1
    Local $r2 = 100 ;Radius 2

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

    Local $title = "GDI+ Beispiel von UEZ"

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

    Opt("GUIOnEventMode", 1)
    $hwnd = GUICreate($title, $width, $height, -1, -1)
    GUISetOnEvent(-3, "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)
    $hPen1_s = 40
    $hPen2_s = 90
    $hPen1 = _GDIPlus_PenCreate(0xFF0000FF, $hPen1_s)
    $hPen2 = _GDIPlus_PenCreate(0xFFFFFF00, $hPen2_s)
    $hPen3 = _GDIPlus_PenCreate(0x80404040)

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

    Do
    _GDIPlus_GraphicsClear($hBackbuffer)
    _GDIPlus_GraphicsDrawEllipse($hBackbuffer, $w_h - $r1, $h_h - $r2, 2 * $r1, 2 * $r2, $hPen3) ;zeichne Ellipsenbahn
    If Sin($i * $pi_div_180) < 0 Then ;zeichen zu erst "Sonne", dann "Erde"
    _GDIPlus_GraphicsDrawEllipse($hBackbuffer, $w_h - $hPen1_s * 0.5 + Cos($i * $pi_div_180) * $r1, $h_h - $hPen1_s * 0.5 + Sin($i * $pi_div_180) * $r2, $hPen1_s, $hPen1_s, $hPen1) ;zeichne "Erde"
    _GDIPlus_GraphicsDrawEllipse($hBackbuffer, $w_h - $hPen2_s * 0.5, $h_h - $hPen2_s * 0.5, $hPen2_s, $hPen2_s, $hPen2) ;zeichne "Sonne"
    Else ;ansonsten zuerst "Erde", dann "Sonne"
    _GDIPlus_GraphicsDrawEllipse($hBackbuffer, $w_h - $hPen2_s * 0.5, $h_h - $hPen2_s * 0.5, $hPen2_s, $hPen2_s, $hPen2) ;zeichne "Sonne"
    _GDIPlus_GraphicsDrawEllipse($hBackbuffer, $w_h - $hPen1_s * 0.5 + Cos($i * $pi_div_180) * $r1, $h_h - $hPen1_s * 0.5 + Sin($i * $pi_div_180) * $r2, $hPen1_s, $hPen1_s, $hPen1) ;zeichne "Erde"
    EndIf
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, $width, $height) ;kopiere Backbuffer in die GUI
    $i += 2 ;Geschwindigkeit der Kugel
    Sleep(20)
    Until False

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

    Func close()
    _GDIPlus_PenDispose($hPen1)
    _GDIPlus_PenDispose($hPen2)
    _GDIPlus_PenDispose($hPen3)
    _GDIPlus_GraphicsDispose($hBackbuffer)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_Shutdown()
    Exit
    EndFunc

    [/autoit]

    Ich habe die dynamische Größe der blauen Kugel auf der Z-Achse nicht implementiert!

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯