Gesucht: Algorithmus zur Berechnung umliegender Punkte

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Gesucht: Algorithmus zur Berechnung umliegender Punkte

    Hallo,
    vor dem Erklärung des Problems eine kleine Skizze:

    -2, 2|-1, 2|0, 2|1, 2|2, 2
    -2, 1|-1, 1|0, 1|1, 1|2, 1
    -2, 0|-1, 0|0, 0|1, 0|2, 0
    -2,-1|-1,-1|0,-1|1,-1|2,-1
    -2,-2|-1,-2|0,-2|1,-2|2,-2


    Ich versuche seit geraumer Zeit einen Algorithmus zu entwickeln, welcher es mir ermöglicht, alle umliegenden Punkte eines Punktes zu berechnen,
    und zwar in einem egal-wie-großen Radius.

    Zum Beispiel:
    Ursprungspunkt: 0,0
    Radius: 1
    Zurückgegeben: alle grünen Punke

    Ursprungspunkt: 0,0
    Radius: 2
    Zurückgegeben: alle grünen Punke + alle blauen Punkte

    Das Problem: Ich weiß nicht, wie ich einen 'dynamischen' Radius entwicken soll.
    Mein bisheriger Code errechnet die Positionen noch 'statisch', nicht 'dynamisch':

    VB.NET-Quellcode

    1. Dim TMP As New List(Of Point)
    2. Dim TargetPoint As new Point
    3. For i As Integer = 1 To Radius
    4. TMP.Add(New Point(TargetPoint.x - i, TargetPoint.y - i))
    5. TMP.Add(New Point(TargetPoint.x - i, TargetPoint.y))
    6. TMP.Add(New Point(TargetPoint.x - i, TargetPoint.y + i))
    7. TMP.Add(New Point(TargetPoint.x, TargetPoint.y - i))
    8. TMP.Add(New Point(TargetPoint.x, TargetPoint.y + i))
    9. TMP.Add(New Point(TargetPoint.x + i, TargetPoint.y - i))
    10. TMP.Add(New Point(TargetPoint.x + i, TargetPoint.y))
    11. TMP.Add(New Point(TargetPoint.x + i, TargetPoint.y + i))
    12. Next


    Wie könnte ein solch 'dynamischer' Code aussehen?

    MfG, Christopher

    VB.NET-Quellcode

    1. Dim TargetPoint As New Point
    2. Dim count As Integer = 1
    3. Do
    4. TMP.Add(New Point(TargetPoint.X - count, TargetPoint.Y - count))
    5. TMP.Add(New Point(TargetPoint.X - count, TargetPoint.Y))
    6. TMP.Add(New Point(TargetPoint.X - count, TargetPoint.Y + count))
    7. TMP.Add(New Point(TargetPoint.X, TargetPoint.Y - count))
    8. TMP.Add(New Point(TargetPoint.X, TargetPoint.Y + count))
    9. TMP.Add(New Point(TargetPoint.X + count, TargetPoint.Y - count))
    10. TMP.Add(New Point(TargetPoint.X + count, TargetPoint.Y))
    11. TMP.Add(New Point(TargetPoint.X + count, TargetPoint.Y + count))
    12. count += 1
    13. Loop Until count > Radius

    lg

    EDIT: Sry falsch berechnet vergiss das wieder... :S
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    @-= Christopher =-: Willkommen im Forum.
    Mach es etwa so:

    VB.NET-Quellcode

    1. 'Pseudocode
    2. 'x0 - Zentrum in x (Index)
    3. 'y0 - Zentrum in y (Index)
    4. 'r0 - Zielradius in Index-Einheiten
    5. For x = startX to endX
    6. For x = startY to endY
    7. rr = (x - x0) * (x - x0) + (y - y0) + (y - y0)
    8. if rr < r0 * r0 Then
    9. ' Punkt aufnehmen:
    10. TMP.Add(...)
    11. End If
    12. Next
    13. Next
    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!
    Ich kann mir nur an den Kopf schlagen: die Lösung ist so simpel!
    Dafür muss man nicht vom Ursprungspunkt, sondern von den Maximal- bzw Minimalwerten ausgehen.

    Hier meine Lösung für alle, die irgendwann mal vor dem selben Problem stehen:

    VB.NET-Quellcode

    1. Public Function getPoints(ByVal startPoint As Point, ByVal Radius As Integer) As Point()
    2. Dim TMP As New List(Of Point)
    3. For X = startPoint.X - Radius To startPoint.X + Radius
    4. For Y = startPoint.Y - Radius To startPoint.Y + Radius
    5. TMP.Add(New Point(X, Y))
    6. Next
    7. Next
    8. TMP.Remove(startPoint)
    9. Return TMP.ToArray()
    10. End Function


    @RodFromGermany
    Vielen Dank, gleich in zweifacher Sicht:
    1. Dein Code hat mich auf die richtige Lösung geführt.
    2. Vielen Dank für das Willkommen!

    MfG, Christopher

    -= Christopher =- schrieb:

    vor dem selben Problem stehen
    Das eine ist das Bereitstellen von Werten (Dein Beispiel),
    das andere ist das Bereitstellen von Indizes in einem Array (mein Beispiel). :thumbsup:
    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!