Koordinatensuche "zusammfassbar"?

  • Ich habe ein Koordinatensystem, bei dem ich gern eine "Erleichterung" bei der Suche hätte...
    Würde also anstatt Einzelfunktionen für jeden Vergleich, lieber etwas kompakteres haben, wenn möglich...

    Vielleicht habt ihr ja eine Idee :)!

    So sieht es halt aus...
    x x x x x
    x x x x x
    x x x x x
    x x x x x
    x x x x x


    bzw.

    x-1 : y-1 | x : y-1 | x+1 : x-1
    x-1 : y | x : y | x +1 : y
    x-1 : y+1 | x: y+1 | x+1 : y+1


    Das ist beliebig erweiterbar...
    Ich möchte nun ein bestimmtes "Suchraster" "schreiben"...
    Er soll also erst den Mittelpunkt "nehmen", dann das "Kreuz" darum (also x:y, x:y-1, x:y+1, x-1:y, x+1:y), dann die Kanten, die das Kreuz zum Quadrat machen (x-1:y-1, x-1, y+1, x+1:x-1, x+1:y+1)... (sozusagen)
    Dann wieder ein "größeres" Kreuz, etc...

    Der Mittelpunkt hat halt mit der höchsten Wahrscheinlichkeit einen "Treffer"...


    Ich möchte also von den Koordinaten x:y ausgehend wissen, ob ich das "Raster" dafür vereinfacht schreiben kann...
    Oder halt jede Koordinate einzeln erfassen muss, wie ich es ja schon "dargestellt" habe...
    Hat jemand eine Idee für mich?
    Es muss zwar nicht ins Endlose gemacht werden, aber hätte da schon gern eine... nicht Erleichterung... Code-Kosmetik drin :)...


    LG Acanis

    Einmal editiert, zuletzt von Acanis (9. Dezember 2009 um 08:58)

  • Sagen wir, wir gehen von einer Schnitzeljagd aus... Wir haben eine Figur, die in der Mitte steht und wollen halt das "Ziel" verteilen, so, dass der Nutzer "ein Schnitzel" bekommt xD!...


    Das soll aber nach diesem Prinzip verteilt werden. Dafür will ich jedes Feld auf bestimmte Präferenzen "untersuchen" lassen, ob die Möglichkeit für die Verteilung gegeben ist...


    Und hier soll das halt auch möglichst "nahe" sein, da... Naja, das führt zu weit, denke ich :p...


    Ist das denn wichtig? Oo...


    LG

  • Hallo,
    wenn du in deinem Koordinatensystem immer unterschiedliche Zustände hast (zum Beispiel bei verschiedenen farbigen Bildern), dann bleibt dir nichts anderes übrig als die von dir angesprochene Methode, jede Koordinate einzeln abzufragen (Bildervergleich)

    Allerdings könntest du auch beschleunigen, wenn (wie in einem Labyrinth) bestimmte Koordinaten schon vordefiniert sind.
    Beispiel: du bist an Position @ und fragst die nähere Umgebung ab (x=freie fläche, O=Wand), dann könntest du jeden Punkt einzeln abfragen, oder
    xxxxOxxxxxxxxxxxxxxxxxx
    xxxxOOOOOOOOOOxxxxxx
    xxxxxxxxxxxxxxxxOxxxxxx
    xxxxxxxxxx@xxxxOxxxxxx
    xxxxxxxxxxxxxxxxOxxxxxx
    xxxxOOOOOOOOOOxxxxxx
    direkt alle 3 blauen Felder oder alle roten mit einem Vergleich.

    Bei solchen Suchen kommt es auf die Anwendung an, oder ist diese Anwendung "geheim"? 8)

  • Ja, so dachte ich mir das auch...

    Hatte die Hoffnung, dass es da eine geniale Lösung für gibt, auf die ich nicht komme ;D...

    Ich könnte zwar die Balken der Kreuze zusammenfassen, sozusagen... Aber das hilft mir nicht weiter^^ Das würde den Sinn killen, dass er vom Mittelpunkt aus beginnt :)...


    Aber danke für die Bestätigung, lasse es noch mal offen, in der Hoffnung, dass hier jemand erleuchteter ist, als wir ;) *gg*


    Ja, Anwendung ist sowas von TOP SECRET 8) *gg*!


    Eine theoretische, allgemeine Lösung, wäre mir vollkommen hinreichend ;D...
    Ich habe, wie gesagt, auch keine Ahnung, wo man da ansetzen könnte... Aber vielleicht gibts irgendwas vordefiniertes dafür oder irgendeine verrückte Formel *hehe*


    LG

    • Offizieller Beitrag

    Hier mal ein Schema, um die erforderlichen Koordinaten in einer Schleife zu ermitteln.
    Weiterverarbeitung kannst du dann einbauen.
    Ist aus dem Kopf geschrieben - ungetestet. Aber ich vertraue mir. :D

    Spoiler anzeigen
    [autoit]

    ; Ausgangsposition
    Local $x, $y
    Local $n = 1 ; Umkreisvariable, 1 beim Start dann 2..3.. usw.
    Local $max = 10 ; Anzahl Suchkreise

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

    For $n = 1 To $max
    ; Diagonal-Eckpunkte
    ; l.o.
    Local $lo[2] = [$x-$n, $y-$n]
    ; r.o.
    Local $ro[2] = [$x+$n, $y-$n]
    ; l.u.
    Local $lu[2] = [$x-$n, $y+$n]
    ; r.u.
    Local $ru[2] = [$x+$n, $y+$n]

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

    ; Kanten
    ; oben (alles zwischen l.o. und r.o.)
    Local $_o[$ro[0]-$lo[0]][2]
    For $i = 0 To UBound($_o) -1
    $_o[$i][0] = $lo[0] +$i +1
    $_o[$i][1] = $lo[1]
    Next
    ; unten (alles zwischen l.u. und r.u.)
    Local $_u[$ru[0]-$lu[0]][2]
    For $i = 0 To UBound($_u) -1
    $_u[$i][0] = $lu[0] +$i +1
    $_u[$i][1] = $lu[1]
    Next
    ; links (alles zwischen l.o. und l.u.)
    Local $_l[$lu[1]-$lo[1]][2]
    For $i = 0 To UBound($_l) -1
    $_l[$i][0] = $lo[0]
    $_l[$i][1] = $lo[1] +$i +1
    Next
    ; rechts (alles zwischen r.o. und r.u.)
    Local $_r[$ru[1]-$ro[1]][2]
    For $i = 0 To UBound($_r) -1
    $_r[$i][0] = $ru[0]
    $_r[$i][1] = $ru[1] +$i +1
    Next
    Next

    [/autoit]
  • Zitat

    Eine theoretische, allgemeine Lösung, wäre mir vollkommen hinreichend

    ERST das Problem, DANN die Lösung. Alles andere ist philosophisch und hat m.E. keinen sittlichen Nährwert! Natürlich kannst du irgendeinen Algorithmus entwickeln und darauf hoffen daß irgendwer den irgendwann einmal benutzen kann, aber sinnvoller ist es doch, für das konkrete Problem an einer Lösung zu arbeiten! Also beschreibe KONKRET dein Problem und warte auf die brauchbaren Vorschläge...

  • Andy: Ich will nicht, dass jemand einen Algo, der mir einfällt, für mich entwickelt, damit ich, wenn es jemand braucht, ihn als meinen ausgeben kann o.O... Ich habe ein Problem beschrieben und habe um Hilfe, bzw. VERBESSERUNG meiner Lösung gebeten...

    Und ich halte das auch für angenehmer, als hier einen 2000-Zeilen-Code hinzuklatschen und zu fragen "Wie kann ich das kürzen/verbessern?"...


    BugFix : Sieht super aus, ich versuch grade, es mir reinzuziehen xD Wie kann man sich nur in sowas so krass reindenken...
    Ich vertrau dir auch xD Hast mir ja schon öfter geholfen... Aber wie meistens *lach*... Kann ich mich ERSTMAL noch nicht da rein denken xD...
    Am Besten wäre wohl testen und gucken, wie genau das arbeitet... Aber dann lern ich nicht, es selbst aufzubauen xD Naja, ich setz es mal in ein MiniScript... Oo

    *edit* Glaube, ich weiss das, was hier als Frage stand, nun xD *edit*


    LG :D

    *edit*

    Kann es sein, dass da Felder fehlen?!^^


    oxoxo
    xooox
    ooooo
    xooox
    oxoxo


    Baut das Script das nicht so auf? x = fehlende Felder...
    Aber ich teste es weiter... Sieht bisher aber beeindruckend gut aus :D
    Oder ich habe das links, rechts, unten, oben nicht so ganz korrekt kapiert... Oo

    *edit*

    Umkreis 1 geht wunderbar :D... GEIL!^^

    Spoiler anzeigen
    [autoit]

    ; Ausgangsposition
    Local $x = 27, $y = 9
    Local $n = 1 ; Umkreisvariable, 1 beim Start dann 2..3.. usw.
    Local $max = 1 ; Anzahl Suchkreise

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

    For $n = 1 To $max
    ; Diagonal-Eckpunkte
    ; l.o.
    Local $lo[2] = [$x-$n, $y-$n]
    ; r.o.
    Local $ro[2] = [$x+$n, $y-$n]
    ; l.u.
    Local $lu[2] = [$x-$n, $y+$n]
    ; r.u.
    Local $ru[2] = [$x+$n, $y+$n]

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

    ; Kanten
    ; oben (alles zwischen l.o. und r.o.)
    Local $_o[$ro[0]-$lo[0]][2]
    For $i = 0 To UBound($_o) -1
    $_o[$i][0] = $lo[0] +$i +1
    $_o[$i][1] = $lo[1]
    Next
    ; unten (alles zwischen l.u. und r.u.)
    Local $_u[$ru[0]-$lu[0]][2]
    For $i = 0 To UBound($_u) -1
    $_u[$i][0] = $lu[0] +$i +1
    $_u[$i][1] = $lu[1]
    Next
    ; links (alles zwischen l.o. und l.u.)
    Local $_l[$lu[1]-$lo[1]][2]
    For $i = 0 To UBound($_l) -1
    $_l[$i][0] = $lo[0]
    $_l[$i][1] = $lo[1] +$i +1
    Next
    ; rechts (alles zwischen r.o. und r.u.)
    Local $_r[$ru[1]-$ro[1]][2]
    For $i = 0 To UBound($_r) -1
    $_r[$i][0] = $ru[0]
    $_r[$i][1] = $ru[1] +$i +1
    Next

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

    MsgBox(64, "", $lo[0] & " | " & $lo[1])
    MsgBox(64, "", $ro[0] & " | " & $ro[1])
    MsgBox(64, "", $lu[0] & " | " & $lu[1])
    MsgBox(64, "", $ru[0] & " | " & $ru[1])
    MsgBox(64, "", $_u[0][0] & " | " & $_u[0][1])
    MsgBox(64, "", $_o[0][0] & " | " & $_o[0][1])
    MsgBox(64, "", $_l[0][0] & " | " & $_l[0][1])
    MsgBox(64, "", $_r[0][0] & " | " & $_r[0][1])

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

    Next

    [/autoit]

    Ist genau Umkreis 1 ;) Teste ich es mal mit 2... War mir nur nicht sicher, wegen l/r/o/u, wofür ich dann z.B. $_r[1][0] und $_r[1][1] habe... :D

    Da klappt es leider nicht...
    Ich stelle es mal zeichnerisch dar!...

    22--2
    2111-
    -1x1-
    -111-
    22--2
    ____+

    1 - 1. Zyklus
    2 - 2. Zyklus
    _ - muss nicht und ist nicht
    + - muss nicht, ist aber!
    x - Startpunkt
    - - muss, ist aber nicht


    LG

    Die eine Zeile muss so verändert werden... -> Denke, dann gehts auch, ist halt dann doch mit den anderen Indizes... Rest sollte ich wohl auch ausknobeln können^^ Also super!
    thx!

    [autoit]

    $_r[$i][1] = $ru[1] +$i -1

    [/autoit]

    6 Mal editiert, zuletzt von Acanis (7. Dezember 2009 um 16:12)

  • Da der Beitrag sonst zu lang und übersichtlich wird, entschuldige ich meinen Doppelpost... ->

    Ich habe nun etwas "drum geschrieben", damit man es "testen" kann und mein Problem "visualisiert" sieht ;)...

    Die Funktion von BugFix klappt noch nicht perfekt, es gibt Doppelfindungen und teils verirrte Koordinaten...


    Hier das aktuelle Script, hoffe, jemand findet den Fehler, ich komme nicht drauf...

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <File.au3>

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

    HotKeySet("!s", "_test")

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

    #Region ### START Koda GUI section ### Form=
    $Form2 = GUICreate("Form2", 141, 132, 499, 313)
    $m25_8 = GUICtrlCreateCheckbox("m25_8", 32, 40, 17, 17)
    $m25_7 = GUICtrlCreateCheckbox("Checkbox1", 32, 24, 17, 17)
    $m25_9 = GUICtrlCreateCheckbox("Checkbox1", 32, 56, 17, 17)
    $m26_7 = GUICtrlCreateCheckbox("Checkbox1", 48, 24, 17, 17)
    $m26_8 = GUICtrlCreateCheckbox("Checkbox1", 48, 40, 17, 17)
    $m26_9 = GUICtrlCreateCheckbox("Checkbox1", 48, 56, 17, 17)
    $m27_7 = GUICtrlCreateCheckbox("Checkbox1", 64, 24, 17, 17)
    $m27_8 = GUICtrlCreateCheckbox("Checkbox1", 64, 40, 17, 17)
    $m27_9 = GUICtrlCreateCheckbox("Checkbox1", 64, 56, 17, 17)
    $m28_7 = GUICtrlCreateCheckbox("Checkbox1", 80, 24, 17, 17)
    $m28_8 = GUICtrlCreateCheckbox("Checkbox1", 80, 40, 17, 17)
    $m28_9 = GUICtrlCreateCheckbox("Checkbox1", 80, 56, 17, 17)
    $m29_7 = GUICtrlCreateCheckbox("Checkbox1", 96, 24, 17, 17)
    $m29_8 = GUICtrlCreateCheckbox("Checkbox1", 96, 40, 17, 17)
    $m29_9 = GUICtrlCreateCheckbox("Checkbox1", 96, 56, 17, 17)
    $m25_10 = GUICtrlCreateCheckbox("Checkbox1", 32, 72, 17, 17)
    $m26_10 = GUICtrlCreateCheckbox("Checkbox1", 48, 72, 17, 17)
    $m27_10 = GUICtrlCreateCheckbox("Checkbox1", 64, 72, 17, 17)
    $m28_10 = GUICtrlCreateCheckbox("Checkbox1", 80, 72, 17, 17)
    $m29_10 = GUICtrlCreateCheckbox("Checkbox1", 96, 72, 17, 17)
    $m25_11 = GUICtrlCreateCheckbox("Checkbox1", 32, 88, 17, 17)
    $m26_11 = GUICtrlCreateCheckbox("Checkbox1", 48, 88, 17, 17)
    $m27_11 = GUICtrlCreateCheckbox("Checkbox1", 64, 88, 17, 17)
    $m28_11 = GUICtrlCreateCheckbox("Checkbox1", 80, 88, 17, 17)
    $m29_11 = GUICtrlCreateCheckbox("Checkbox1", 96, 88, 17, 17)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    if FileExists("test.txt") = 1 Then _FileCreate("test.txt")

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    EndSwitch
    WEnd

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

    Func _test()

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

    ; Ausgangsposition
    Local $x = 27, $y = 9
    Local $n = 1 ; Umkreisvariable, 1 beim Start dann 2..3.. usw.
    Local $max = 2 ; Anzahl Suchkreise

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

    For $n = 1 To $max
    ; Diagonal-Eckpunkte
    ; l.o.
    Local $lo[2] = [$x-$n, $y-$n]
    ; r.o.
    Local $ro[2] = [$x+$n, $y-$n]
    ; l.u.
    Local $lu[2] = [$x-$n, $y+$n]
    ; r.u.
    Local $ru[2] = [$x+$n, $y+$n]

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

    ; Kanten
    ; oben (alles zwischen l.o. und r.o.)
    Local $_o[$ro[0]-$lo[0]][2]
    For $i = 0 To UBound($_o) - 1
    $_o[$i][0] = $lo[0] + $i + 1
    $_o[$i][1] = $lo[1]
    Next
    ; unten (alles zwischen l.u. und r.u.)
    Local $_u[$ru[0]-$lu[0]][2]
    For $i = 0 To UBound($_u) - 1
    $_u[$i][0] = $lu[0] + $i + 1
    $_u[$i][1] = $lu[1]
    Next
    ; links (alles zwischen l.o. und l.u.)
    Local $_l[$lu[1]-$lo[1]][2]
    For $i = 0 To UBound($_l) - 1
    $_l[$i][0] = $lo[0]
    $_l[$i][1] = $lo[1] + $i + 1
    Next
    ; rechts (alles zwischen r.o. und r.u.)
    Local $_r[$ru[1]-$ro[1]][2]
    For $i = 0 To UBound($_r) - 1
    $_r[$i][0] = $ru[0]
    $_r[$i][1] = $ru[1] + $i - 1
    Next

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

    $file = FileOpen("test.txt", 1)
    FileWrite ( $file, $lo[0] & " | " & $lo[1] & @CRLF)
    FileWrite ( $file, $ro[0] & " | " & $ro[1] & @CRLF)
    FileWrite ( $file, $lu[0] & " | " & $lu[1] & @CRLF)
    FileWrite ( $file, $ru[0] & " | " & $ru[1] & @CRLF)
    FileWrite ( $file, $_u[0][0] & " | " & $_u[0][1] & @CRLF)
    FileWrite ( $file, $_o[0][0] & " | " & $_o[0][1] & @CRLF)
    FileWrite ( $file, $_l[0][0] & " | " & $_l[0][1] & @CRLF)
    FileWrite ( $file, $_r[0][0] & " | " & $_r[0][1] & @CRLF)
    FileWrite ( $file, $_u[1][0] & " | " & $_u[1][1] & @CRLF)
    FileWrite ( $file, $_o[1][0] & " | " & $_o[1][1] & @CRLF)
    FileWrite ( $file, $_l[1][0] & " | " & $_l[1][1] & @CRLF)
    FileWrite ( $file, $_r[1][0] & " | " & $_r[1][1] & @CRLF)
    ;~ FileWrite ( $file, $_u[2][0] & " | " & $_u[2][1] & @CRLF)
    ;~ FileWrite ( $file, $_o[2][0] & " | " & $_o[2][1] & @CRLF)
    ;~ FileWrite ( $file, $_l[2][0] & " | " & $_l[2][1] & @CRLF)
    ;~ FileWrite ( $file, $_r[2][0] & " | " & $_r[2][1] & @CRLF)

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

    While 1
    $coords = FileReadLine("test.txt", 1)
    _FileWriteToLine("test.txt", 1, '', 1)

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

    if $coords = "25 | 7" Then GUICtrlSetState($m25_7, $GUI_CHECKED)
    if $coords = "25 | 8" Then GUICtrlSetState($m25_8, $GUI_CHECKED)
    if $coords = "25 | 9" Then GUICtrlSetState($m25_9, $GUI_CHECKED)
    if $coords = "25 | 10" Then GUICtrlSetState($m25_10, $GUI_CHECKED)
    if $coords = "25 | 11" Then GUICtrlSetState($m25_11, $GUI_CHECKED)

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

    if $coords = "26 | 7" Then GUICtrlSetState($m26_7, $GUI_CHECKED)
    if $coords = "26 | 8" Then GUICtrlSetState($m26_8, $GUI_CHECKED)
    if $coords = "26 | 9" Then GUICtrlSetState($m26_9, $GUI_CHECKED)
    if $coords = "26 | 10" Then GUICtrlSetState($m26_10, $GUI_CHECKED)
    if $coords = "26 | 11" Then GUICtrlSetState($m26_11, $GUI_CHECKED)

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

    if $coords = "27 | 7" Then GUICtrlSetState($m27_7, $GUI_CHECKED)
    if $coords = "27 | 8" Then GUICtrlSetState($m27_8, $GUI_CHECKED)
    if $coords = "27 | 9" Then GUICtrlSetState($m27_9, $GUI_CHECKED)
    if $coords = "27 | 10" Then GUICtrlSetState($m27_10, $GUI_CHECKED)
    if $coords = "27 | 11" Then GUICtrlSetState($m27_11, $GUI_CHECKED)

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

    if $coords = "28 | 7" Then GUICtrlSetState($m28_7, $GUI_CHECKED)
    if $coords = "28 | 8" Then GUICtrlSetState($m28_8, $GUI_CHECKED)
    if $coords = "28 | 9" Then GUICtrlSetState($m28_9, $GUI_CHECKED)
    if $coords = "28 | 10" Then GUICtrlSetState($m28_10, $GUI_CHECKED)
    if $coords = "28 | 11" Then GUICtrlSetState($m28_11, $GUI_CHECKED)

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

    if $coords = "29 | 7" Then GUICtrlSetState($m29_7, $GUI_CHECKED)
    if $coords = "29 | 8" Then GUICtrlSetState($m29_8, $GUI_CHECKED)
    if $coords = "29 | 9" Then GUICtrlSetState($m29_9, $GUI_CHECKED)
    if $coords = "29 | 10" Then GUICtrlSetState($m29_10, $GUI_CHECKED)
    if $coords = "29 | 11" Then GUICtrlSetState($m29_11, $GUI_CHECKED)

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

    if $coords <> "25 | 7" AND $coords <> "25 | 8" AND $coords <> "25 | 9" AND $coords <> "25 | 10" AND $coords <> "25 | 11" AND $coords <> "26 | 7" AND $coords <> "26 | 8" AND $coords <> "26 | 9" AND $coords <> "26 | 10" AND $coords <> "26 | 11" AND $coords <> "27 | 7" AND $coords <> "27 | 8" AND $coords <> "27 | 9" AND $coords <> "27 | 10" AND $coords <> "27 | 11" AND $coords <> "28 | 7" AND $coords <> "28 | 8" AND $coords <> "28 | 9" AND $coords <> "28 | 10" AND $coords <> "28 | 11" AND $coords <> "29 | 7" AND $coords <> "29 | 8" AND $coords <> "29 | 9" AND $coords <> "29 | 10" AND $coords <> "29 | 11" AND $coords <> "" AND $coords <> " " Then
    MsgBox(64, "Ausserhalb des Bereichs", $coords)
    ConsoleWrite ( $coords )
    EndIf
    If $coords = "" Then ExitLoop
    Sleep ( 500 )
    Wend

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

    FileClose($file)

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

    Next

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

    EndFunc

    [/autoit]


    LG

    • Offizieller Beitrag

    Ich habe mal ein eigenes Script erstellt:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    $hGui = GUICreate('Koordinatensuche', 320, 320)
    Global $aField[15][15]
    For $x = 0 To 14
    For $y = 0 To 14
    $aField[$x][$y] = GUICtrlCreateCheckbox('', 10 + $x * 20, 10 + $y * 20, 20, 20)
    Next
    Next
    GUISetState()
    _Search(7, 7, 3)
    MsgBox(0, 0, 'Fertig')
    Do
    Until GUIGetMsg() = -3

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

    Func _Search($x, $y, $iLoop)
    $sleep = 500
    For $i = 1 To $iLoop
    GUICtrlSetState($aField[$x - 1 * $i][$y], $GUI_CHECKED)
    Sleep($sleep)
    GUICtrlSetState($aField[$x + 1 * $i][$y], $GUI_CHECKED)
    Sleep($sleep)
    GUICtrlSetState($aField[$x][$y - 1 * $i], $GUI_CHECKED)
    Sleep($sleep)
    GUICtrlSetState($aField[$x][$y + 1 * $i], $GUI_CHECKED)
    Sleep($sleep)
    For $j = $x - 1 * $i To $x + 1 * $i
    If $j = $x Then ContinueLoop
    GUICtrlSetState($aField[$j][$y - 1 * $i], $GUI_CHECKED)
    Sleep($sleep)
    Next
    For $j = $x - 1 * $i To $x + 1 * $i
    If $j = $x Then ContinueLoop
    GUICtrlSetState($aField[$j][$y + 1 * $i], $GUI_CHECKED)
    Sleep($sleep)
    Next
    If $i = 1 Then ContinueLoop
    For $j = $y - 1 * ($i-1) To $y + 1 * ($i-1)
    If $j = $y Then ContinueLoop
    GUICtrlSetState($aField[$x - 1 * $i][$j], $GUI_CHECKED)
    Sleep($sleep)
    Next
    For $j = $y - 1 * ($i-1) To $y + 1 * ($i-1)
    If $j = $y Then ContinueLoop
    GUICtrlSetState($aField[$x + 1 * $i][$j], $GUI_CHECKED)
    Sleep($sleep)
    Next
    Next
    EndFunc

    [/autoit]


    Meinst Du sowas?

  • "Not enought timers avaiable" kam grade beim ersten Mal...^^

    Aber beim 2. Mal hat ers durchlaufen lassen... Und... PERFEKT!^^ Genau das habe ich gesucht...

    Mal schauen, ob ich rein steige, sieht auf jeden Fall wunderbar nach dem aus, was ich mir vorgestellt habe.


    Vielen Dank!^^


    LG

  • Zitat

    Würde also anstatt Einzelfunktionen für jeden Vergleich, lieber etwas kompakteres haben, wenn möglich...

    will ja nicht meckern, aber was ist jetzt "kompakt"? Der Einzelvergleich findet nach wie vor statt. In welcher Reihenfolge die Inhalte in einem Array nacheinander abgeklappert werden ist doch völlig egal. Nutzen hat das "Suchmuster" doch nur, solange es in bestimmten Fällen Vorteile bietet. Und die sehe ich nicht.
    Das meinte ich in meinem Post mit "konkretem Problem".
    Wenn es darum geht, erstmalig den Abstand zu einem oder mehreren "Objekten" auf der Karte herauszufinden, dann muß sowieso die komplette Karte gescannt werden.
    Wenn sich diese Objekte dann bewegen, ist es doch wesentlich einfacher, ihre einzelnen Positionen miteinander zu vergleichen als wiederum die komplette Karte zu scannen. Daher verstehe ich den Ansatz mit dem angesprochenen (komplizierten=langsamen) Suchmuster nicht.

  • Komisch, dass 2 Leute mir helfen konnten!^^
    UND eine Lösung ist perfekt das, was ich gesucht habe, kurz, mathematisch und super ;) (Danke an Ocar nochmal^^!)

    Du solltest die Posts vor dir mal durchlesen... Zumal das Problem auch schon als "gelöst" markiert wurde...

    Verstehe nicht, warum du scheinbar so ein Problem mit mir hast...


    Aber lass das mal nicht zum OT werden... Bin glücklich und es gibt Menschen, die helfen konnten/wollten und mir geholfen haben ;)...

    Es geht sehr wohl ;) Siehe zwei Posts über dir und es macht Sinn... :D Danke...

    Ende^^....


    LG Acanis

  • Zitat

    Ich habe ein Koordinatensystem, bei dem ich gern eine "Erleichterung" bei der Suche hätte...

    Das war deine Anfrage im Startpost, gefolgt von der bildlichen Darstellung und der "bisherigen" Suchreihenfolge

    Zitat

    x-1 : y-1 | x : y-1 | x+1 : x-1
    x-1 : y | x : y | x +1 : y
    x-1 : y+1 | x: y+1 | x+1 : y+1

    Das ist also m.E. der IST-Zustand, gefolgt von:

    Zitat

    Ich möchte also von den Koordinaten x:y ausgehend wissen, ob ich das "Raster" dafür vereinfacht schreiben kann...
    Oder halt jede Koordinate einzeln erfassen muss, wie ich es ja schon "dargestellt" habe...

    Bis hierhin dein "Problem". Das was jetzt als "Lösung" gepostet wurde ist doch nichts anderes als das, was von dir im Startposting schon als IST-Zustand vorgestellt wurde?! Oder fehlte dir einzig und allein das Script? Dann schreib das doch in dein erstes Posting rein, und alles ist klar. Dann brauchst du auch nicht von "Erleichterung" und "und habe um Hilfe, bzw. VERBESSERUNG meiner Lösung gebeten..." zu reden, wenn garnichts verbessert, sondern genau so wie von dir beschrieben gescriptet wurde!
    WAS ist jetzt an der von Oscar (übrigens sehr schön anschaulich) in Scriptform gegossenen Reihenfolge der Abfragen BESSER als der genau so von dir im ersten Post gemachte IST-Zustand?

    Mir gings eigentlich um die von dir geforderte Verbesserung, d.h. wie könnte man aus 100 Abfragen beispielsweise mit einer "cleveren" Suchroutine nur 25 machen. So etwas ist nämlich durchaus möglich, mit Hilfe von Spiegelung, Drehung, und einem modifizierten Koordinatensystem. Daher meine Frage nach dem konkreten Problem. Aber mittlerweile vermute ich, daß es dir darauf garnicht ankommt. DEINE Lösung ist ja nun "verbessert" :rolleyes: , wobei du es ja vorziehst, deine Lösung garnicht erst vorzustellen:

    Zitat

    Und ich halte das auch für angenehmer, als hier einen 2000-Zeilen-Code hinzuklatschen und zu fragen "Wie kann ich das kürzen/verbessern?"...


    Und OT ist das schonmal garnicht!

  • Ich habe das StepbyStep gemacht, wie beschrieben und scheinbar bei den anderen auch angekommen!?...

    Das sind haufenweise Koordinaten und je höher der Umkreisfaktor ist,... Das steigt "krass" an...

    Durch die Schleifen bin ich variabler, habe Code/Ressourcen gespart und es ist übersichtlicher...

    Meine "Lösung" war halt, jede Koordinate selber hinzuschreiben, was sehr umständlich ist und nicht so einfach reagiert... (hier kann ich für nen anderen Umkreisfaktor einfach eine Zahl ändern...^^)

    Ich hatte ne "Lösung", die für mich keine war...
    Ne Not-Lösung halt...


    Meine Suchreihenfolge sollte ja beibehalten werden Oo... Aber halt Code-Kosmetik... Das fehlte mir... Da fehlt mir noch etwas das Auge und vielleicht auch teils das mathematische Reindenken zu...


    Hoffe, du weisst was ich meine xD Ich gehe nu schlafen...^^


    Gute n8!


    LG Aca