Bild in Richtung des Mauszeigers rotieren

  • Allgemein

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Byte.

    Bild in Richtung des Mauszeigers rotieren

    Hey Community,

    Ich versuche die Spitze eines Flugzeuges in Richtung des Mauszeigers zu drehen, was mir nicht gelingt!
    Hat jemand Erfahrung mit ähnlichen Beispielen?

    Ein Beipspiel:
    ZUMA

    Also Bild in Richtung des Mauszeigers rotieren.
    Die mathematischen Grundlagen dafür(Vektoren, Phythagoras, ..) hab ich mir schon angeschaut, nur brauche ich Hilfe von euch :)

    Danke im Vorraus,
    Byte

    VB.NET-Quellcode

    1. Public Function rotateImage(ByVal bitmap As Bitmap, ByVal angle As Single) As Bitmap
    2. Dim returnBitmap As New Bitmap(bitmap.Width, bitmap.Height)
    3. Dim graphics__1 As Graphics = Graphics.FromImage(returnBitmap)
    4. graphics__1.TranslateTransform(CSng(bitmap.Width) / 2, CSng(bitmap.Height) / 2)
    5. graphics__1.RotateTransform(angle)
    6. graphics__1.TranslateTransform(-CSng(bitmap.Width) / 2, -CSng(bitmap.Height) / 2)
    7. graphics__1.DrawImage(bitmap, New Point(10, 10))
    8. Return returnBitmap
    9. End Function


    Zum rotieren verwende ich das, jetzt würde ich vllt. noch alte Mauspositionen mit neuer vergleichen...
    Dann mit

    VB.NET-Quellcode

    1. rotateimage(image,angle)


    das Bild drehen und darstellen...

    Vielleicht reicht dir das ja als Ansatz...
    wie du das genau realisieren möchtes weiß ich nicht. entweder du klickst iwo hin (P1) und bewegst die Maus zu einem anderen punkt (P2). daraus berechnest du den winkel. DIe andere möglichkeit wäre, du benutzt beispielsweise den bildmittelpunkt als P1 und die neue mausposition als P2. egal wie, du hast immer diese beiden punkte und folgende rechnung:

    DX = p1.x - p2.x
    DY = p1.y - p2.y

    angle = math.atan2(dy,dx)

    das musst du normalerweise (hab grade kein VB am start) vom bogenmaß (ausgabe der atan2 funktion) ins gradmaß umrechnen:

    grad/180 = bogen/pi

    grad = angle * 180 / pi

    schon hast du den winkel. das drehen kannst du mit dem graphicsobjekt (siehe evtl rotateat) realisieren.
    lg
    kannst du mal zeigen wie du das gemacht hast? bitte einmal wie du P1 und P2 bekommst und die zeichenmethode. es kann sein, dass diese das bogenmaß verwendet und nicht das gradmaß... ist immer ein hin und her^^

    Edit: Kopiere das mal in eine leere Forms-Application. Erklärt vllt etwas mehr. Auf der Form dann einfach klicken und mit gedrucktem mausbutton ein bisschen hin und her bewegen^^

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim _mouseDown As Boolean = False
    2. Dim P1 As Point = New Point(0, 0)
    3. Dim P2 As Point = New Point(0, 0)
    4. Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
    5. P1 = e.Location
    6. P2 = e.Location
    7. _mouseDown = True
    8. Invalidate()
    9. End Sub
    10. Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
    11. If _mouseDown = True Then
    12. P2 = e.Location
    13. Invalidate() 'löst den zeichenvorgang aus, der u.a. den winkel berechnet. nicht sehr vorteilhaft aber läuft^^
    14. End If
    15. End Sub
    16. Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
    17. _mouseDown = False
    18. Invalidate()
    19. End Sub
    20. Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    21. Dim dx As Integer = P1.X - P2.X
    22. Dim dy As Integer = P1.Y - P2.Y
    23. Dim WinkelBogenmaß As Double = Math.Atan2(dy, dx)
    24. Dim WinkelGradmaß As Single = WinkelBogenmaß * 180 / Math.PI
    25. Dim tmpRectangle As New Rectangle(100, 100, 100, 100)
    26. Dim tmpMatrix As New Drawing2D.Matrix
    27. tmpMatrix.RotateAt(WinkelGradmaß, New Point(150, 150)) 'drehen um winkel bei mittepunkt rectangle
    28. With e.Graphics
    29. .FillEllipse(Brushes.Red, P1.X - 3, P1.Y - 3, 6, 6)
    30. .DrawLine(Pens.Red, P1, P2)
    31. 'erst hier wird die rotation umgesetzt
    32. .Transform = tmpMatrix
    33. .DrawRectangle(Pens.Black, tmpRectangle)
    34. End With
    35. End Sub

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „FreakJNS“ ()

    So jetzt ein weiteres Problem :/

    Die Transformation die ich dem Graphics Objekt des Paint Events zuweise, gelt für die ganze Form, ich habe versucht:

    VB.NET-Quellcode

    1. Dim dx As Integer = P1.X - P2.X
    2. Dim dy As Integer = P1.Y - P2.Y
    3. Dim WinkelBogenmas As Double = Math.Atan2(dy, dx)
    4. Dim WinkelGradmaß As Float = (WinkelBogenmas * 180 / Math.PI)
    5. Dim tmpMatrix As System.Drawing.Drawing2D.Matrix = New System.Drawing.Drawing2D.Matrix()
    6. tmpMatrix.RotateAt(WinkelGradmaß - 90, new Point(P1.X, P1.Y))
    7. Dim g As Graphics = Graphics.fromImage(img)
    8. g.drawImage(img, 300, 300, 375, 250)
    9. g.Transform = tmpMatrix
    10. g.flush()


    So, jetzt habe ich neue Graphics für mein Bild erstellt und die Transformation zugewiesen.
    Wie kann ich jetzt meine Graphics vom Bild in einen Bereich der Paint Graphics einfügen?

    Danke im Vorraus,
    Byte
    du kannst ja jedem objekt eine position und einen winkel zuordnen.

    die rotationsmatrix kannst du einfach zurücksetzten und für jedes objekt eine individuelle erstellen. ein objekt, dass gezeichnet wurde bleibt ja an ort und stelle egal was du im nachinein mit der matrix anstellst. so können alle objekte direkt auf die form gezeichnet werden.
    Hy FreakJNS,

    Danke! Hat perfekt geklappt.

    Allerdings funktioniert Reset() nicht..
    Mit e.Graphics.Transform = new Matrix() ging es!

    Danke, weitere Fragen *folgen warscheinlich noch ;D

    LG

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Byte“ ()