Objekt um Objekt kreisen lassen

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von prosnooper.

    Objekt um Objekt kreisen lassen

    Hey, ich möchte gerne Objekt A um Objekt B kreisen lassen und den Radius dabei immer ein wenig verringern. Allerdings habe ich über keine Ahnung wie ich vorgehen soll. Habs bisher nur hinbekommen, das Objekt A sich Objekt B irgendwie nähert, allerdings weiß ich - wie bereits erwähnt - nicht welche Berechnungen ich anstellen soll.

    Hoffe ihr könnt mir Tipps und Denkanstöße geben. Danke
    Am besten mit einer regelmässigen (logarithmischen) Spirale: Hier
    Denn wenn du den Radius in Abhängigkeit von X (In deinem Fall die Zeit, oder die jetztige Position) kannst du das Objekt mit GDI immer neu zeichnen an der errechneten Position.
    EDIT: Rechnungsweg für kartesische Koordinaten(Von Wikipedia):





    Grüsse
    Pascal

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

    Könntest du mir den Rechnungsweg erklären, bin leider noch nicht soweit in Mathe/Physik dass ich damit was anfangen kann.

    Edit: Also, ich bin schon mal auf die Idee gekommen den Radius auszurechnen, dass müsste dann ja

    VB.NET-Quellcode

    1. Dim A as integer = ObjektB.Location.X - ObjectA.Location.X
    2. Dim B as integer = ObjektB.Location.Y - ObjectA.Location.Y
    3. Dim Radius as integer = ((A ^ 2) + (B ^ 2)) ^ (1 / 2)

    sein.

    Nun weiter im Programm, was kann ich jetzt mit dem Radius anfangen? Wie berechne ich beispielsweise die neue X und Y Koordinate wenn ich im Uhrzeigersinn gehen will?

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „prosnooper“ ()

    Das Problem ist, dass ein Objekt um ein anderes KREISEN soll. Dein Code funktioniert aber nur, wenn Objekt B weiter rechts ist als Objekt A (Übrigens es wäre (A2 + B2)^0.5).
    Schau dir mal einen Threadüber die Programmierung einer analogen Uhr an. Da kreist ja auch der Zeiger um den Mittelpunkt.


    Grüsse
    Pascal
    Ja, das * hab ich auch schon in ein + geändert, kommt doch von der Formel a² + b² = c² oder nicht?

    B2T:

    Also, ich brauche

    VB.NET-Quellcode

    1. Math.Cos(winkel * Math.PI / 180)
    für X und

    VB.NET-Quellcode

    1. Math.Sin(winkel * Math.PI / 180)
    für Y?
    Nun du gehst von der Anfangsposition aus (Kannst dir ja eine Linie vorstellen zw. ObjektA und ObjektB) und dann gehst du immer weiter und stellst dir wieder eine Linie vor. Daraus lässt sich der Winkel schliessen.


    Grüsse
    Pascal
    Ah, ok. Und die neue X Koordinate beispielsweise berechne ich dann wie?


    VB.NET-Quellcode

    1. Dim i as integer = Math.Cos(winkel * Math.PI / 180)
    Was würde hier für ein Punkt rauskommen und was könnte ich damit anfangen? Würde es, wenn ich mit i was anfangen kann, etwas bringen, einfach immer den Winkel um beispielsweise 2° zu erhöhen?
    Das heißt durch erhöhen um beispielsweise 2° hab ich dann immer meinen neuen X Punkt, und Y bekomm ich mit

    VB.NET-Quellcode

    1. Math.Sin(winkel * Math.PI / 180)
    ?

    Nach intensiver Beschäftigung bin ich leider immer noch zu keinem Ergebnis gekommen. Kannst du villeicht mal ein kleines Beispiel posten?

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

    So, nach etwas länger Zeit hab ich das herumkreisen nun hinbekommen.

    VB.NET-Quellcode

    1. Dim Center As Point = New Point(150, 150)
    2. Do
    3. Grad += 1
    4. X = Center.X + Math.Cos((Winkel / 360) * 2 * Math.PI) * Radius
    5. Y = Center.Y + Math.Sin((Winkel / 360) * 2 * Math.PI) * Radius
    6. Dim pt As New Point(CInt(X), CInt(Y))
    7. Ball.Location = pt
    8. System.Threading.Thread.Sleep(5)
    9. Application.DoEvents()
    10. Loop Until Winkel > 360



    Nun zu einem Problem, was ist wenn ich jetz Center wechsele? Dann ändert sich ja der Winkel. Also die Frage wie Rechne ich den Winkel dann aus?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „prosnooper“ ()

    Ich hab dir mal ein kleines Beispiel gemacht:


    VB.NET-Quellcode

    1. Private Sub PictureBox3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox3.Click 'Meine PB heißt Picturebox3
    2. 'Das ganze läuft mit einem Timer, bei click auf die PB startet die Spirale:
    3. Timer1.Interval = 30 'geschwindigkeit variabel
    4. x1 = 150 'Zentrum des Festen Objekts das "umkreist" wird
    5. y1 = 150
    6. sx = 10 'größe meiner beiden Kreise = variable Siehe Paint Event
    7. sy = 10
    8. Winkel = Anz * 2 * Math.PI 'Start Winkel = Anzahl der Spiralen * 2 * Pi
    9. Timer1.Start() 'Timer Starten
    10. End Sub
    11. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    12. Radius = Anz * Winkel 'Radius = Anzahl Spiralen Mal Pi (Polarkoordinaten)
    13. x2 = Math.Cos(Winkel) * Radius + x1 'in kartesische Koordinaten umrechnen abhängig vom Zentrum
    14. y2 = Math.Sin(Winkel) * Radius + y1 'in kartesische Koordinaten umrechnen
    15. Winkel -= 0.1 'winkel verkleinern bis er irgendwann auf 0 bzw ins negative läuft
    16. PictureBox3.Invalidate() 'PB neuzeichnen
    17. If Winkel < 0 Then Timer1.Stop()
    18. End Sub
    19. Private x1, x2, y1, y2, sx, sy, Radius As Integer
    20. Private Winkel As Double
    21. Private Const Anz = 5
    22. Private Sub PictureBox3_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox3.Paint
    23. e.Graphics.FillEllipse(Brushes.Black, New Rectangle(x1, y1, sx, sy)) 'zentrumskreis
    24. e.Graphics.FillEllipse(Brushes.Blue, New Rectangle(x2, y2, sx, sy)) 'bewegliches objekt
    25. End Sub
    Das ist meine Signatur und sie wird wunderbar sein!