Objekte an Kreis ausrichten

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von FreakJNS.

    Objekte an Kreis ausrichten

    Guten Tag,

    Ich habe keine Ahnung wie ich Pictureboxen an einem Kreis mit einem unbestimmten Radius ausrichten soll.
    Deshalb dachte ich, das ich euch mal hier belästige und Frage wie ich das anstellen könnte. Die Pictureboxen sollen immer den gleichen Abstand von einander haben.

    Danke :)
    Vielleicht malste mal ein Bildchen, damit wir uns was unter Deiner Anforderung vorstellen können.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wau Nice Arbeit. Es lebe die Mathematik.

    Viel Spass beim Kreisbogen und Teilabschnittberechnen.

    Was hast du für Werte?

    1. Größe der Pictureboxen und die daraus resultierende Diagonale und der mathematische Mittelpunkt
    2. Größe des Kreises (Durchmesser) und die Relative Position in der Form.

    Was brauchst du für Werte?

    1. den Abstand der Pictureboxen untereinander unter Berücksichtigung der unterschiedlichen Kantenlängen
    2. die Berechnete Position der Picturebox im Bezug auf den Durchmesser des Kreises und den brechneten Abstand der Box zur anderen.
    mit der Matrix-Klasse kann man alle Punkte eines Punkte-Arrays um einen bestimmten Punkt rotieren lassen.

    Hier wäre das etwas entartet, denn es muß nur ein Punkt rotieren, also man hätte ein Array mit nur einem Punkt, und würde das 6 mal um 30° rotieren, und jeweils das Ergebnis in eine List(Of Point) schreiben.
    Damit hätte man 6 Punkte auf einer Kreislinie.
    sei
    mx, my der mittelpunkt des kreises
    r der radius desselben
    winkel der Winkel in Bogenmaß um den die Picturebox auf der Kreisbahn bewegt werden soll
    px, py die Mittelpunktsposition der Picturebox

    dann gilt:
    px = mx+(Math.cos(winkel)*r)
    py = my+(Math.sin(winkel)*r)


    Diese Formel liefert die Position des Mittelpunkts der Picturebox, die benötigte linke obere Ecke ist dann
    PB1.Left = px - PB1.Width
    PB1.Top = py + PB1.Height
    SᴛᴀʀGᴀᴛᴇ01

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

    Mhm... danke bisher :)

    Nur hab ich ein Problem :/ Die Abstände müssen gleichmäßig sein



    VB.NET-Quellcode

    1. Dim mx As Integer = Me.Width / 2
    2. Dim myx As Integer = Me.Height / 2
    3. Dim ges As Integer = 15
    4. Dim x As Integer = 0
    5. Dim y As Integer = 1
    6. Dim r As Integer = 120
    7. Dim alpha As Integer
    8. Do Until x = ges
    9. x += x
    10. alpha = 2 * Math.PI / ges * y
    11. Dim f As New PictureBox
    12. Me.Controls.Add(f)
    13. With f
    14. .BackColor = Color.IndianRed
    15. .Left = mx + r * Math.Cos(alpha) - 20 / 2
    16. .Top = myx + r * Math.Sin(alpha) - 20 / 2
    17. .Height = 20
    18. .Width = 20
    19. End With
    20. Me.Controls.Add(f)
    21. y += y
    22. Loop
    23. End Sub
    Definiere

    Rad4Day schrieb:

    Die Abstände müssen gleichmäßig sein
    - Die Mittelpunkt aller anliegenden Rechtecke haben zueinander, bezogen auf den Kreismittelpunkt, denselben Winkel
    oder
    - der Winkelabstand zwischen den Rechtecken ist gleich groß
    oder ???
    Und: Winkel werden im Bogenmaß angegeben, der Kreis hat einen Vollwinkel von 2 * PI.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ja was nun?
    Zwischenraum gleich?
    Dann musst Du die Summe der Winkel der Rechtecke berechnen, und die Differenz von (2PI-Summe) durch die Anzahl dividieren. Das wäre die "Winkellücke".
    Problem:
    Der Winkel, unter dem ein Rechteck vom Kreismittelpunkt zu sehen ist, ist vom Winkel am Kreis selbst abhängig, sieht also nach einer dynamischen Optimierung aus.
    Mach Dir einen Startwert und verbessere ihn in 3 oder 4 Umläufen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Der Code in Post#11 ist aber immernoch recht falsch, wenn ich das richtig sehe^^ (x+=x und so)
    Schau dir mal die For-Schleife an:

    VB.NET-Quellcode

    1. for i as integer= 0 to 10
    2. 'mache iwas, i ist die Zählervariable und wird automatisch hochgezählt
    3. next


    Wenn du n Rechtecke hast, dann ist der Winkel zwischen ihnen (2Pi)/n groß. Die For-Schleife lässt du nun einfach von 0 bis n-1 laufen, sodass du den aktuellen Winkel mittels i * ( (2Pi)/n) rausbekommst. Das ist viel praktischer als die x (und y-Werte? kp was du da bezwecken willst) manuel hochzuzählen. Wenn du die For-Schleife ganz verstanden hast, dann kannst du das sogar noch geschickter anstellen:

    VB.NET-Quellcode

    1. For aktuellerWinkel as double = (2pi/n) to 2Pi step (2pi/n)

    Du kannst also zustätzlich eine Schrittweite angeben, die Scleife durchläuft automatisch alle notwendigen Winkel.


    (Ich glaube immernoch, dass die Rechteck-Mittelpunkte unter gleichem Winkel zum Kreismittelpunkt liegen sollen. Anders wird es komplizierter)

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

    FreakJNS schrieb:

    Wenn du die For-Schleife ganz verstanden hast, dann kannst du das sogar noch geschickter anstellen:


    Visual Basic Quellcode
    1
    For aktuellerWinkel as double = (2pi/n) to 2Pi step (2pi/n)

    Du kannst also zustätzlich eine Schrittweite angeben, die Scleife durchläuft automatisch alle notwendigen Winkel.


    Das ist keine so gute Idee. Es kann zu Rechenungenauigkeiten kommen, was zur Folge hat,
    dass ein Schleifendurchlauf weniger oder mehr ausgeführt wird. Bei Schleifen sollte man nach
    Möglichkeit mit ganzen Zahlen arbeiten und Ganzzahl-Variablentypen verwenden.
    Gruss,

    Neptun