Na przykład, tutaj kształt zamierzonego spirali (a każdy etap iteracji)Algorytm iteracji nad zewnątrz spirali na dyskretnej siatce 2D od początku
y
|
|
16 15 14 13 12
17 4 3 2 11
-- 18 5 0 1 10 --- x
19 6 7 8 9
20 21 22 23 24
|
|
Jeżeli linie X i y osie.
Tutaj byłoby rzeczywiste wartości algorytm będzie „powrót” z każdej iteracji (współrzędne punktów):
[0,0],
[1,0], [1,1], [0,1], [-1,1], [-1,0], [-1,-1], [0,-1], [1,-1],
[2,-1], [2,0], [2,1], [2,2], [1,2], [0,2], [-1,2], [-2,2], [-2,1], [-2,0]..
itp
próbowałem poszukiwania, ale jestem Nie wiem dokładnie, czego dokładnie szukać, a jakie wyszukiwania próbowałem wymyślić ślepych zaułków.
Nie jestem nawet pewien, od czego zacząć, poza czymś nieporządnym, nieeleganckim i ad-hoc, jak tworzenie/kodowanie nowej spirali dla każdej warstwy.
Czy ktoś może mi pomóc zacząć?
Czy istnieje sposób, który można łatwo przełączać w kierunku zgodnym lub przeciwnym do ruchu wskazówek zegara (orientacja) i w którym kierunku "rozpocząć" spiralę? (obrót)
Czy istnieje sposób na rekursywne robienie tego?
Moja aplikacja
mam rzadką siatkę wypełnioną punktów danych, a chcę, aby dodać nowy punkt danych do sieci i mają być „tak blisko, jak to możliwe” Do podany inny punkt.
Aby to zrobić, zadzwonię pod numer grid.find_closest_available_point_to(point)
, który przejdzie przez spiralę podaną powyżej i zwróci pierwszą pozycję, która jest pusta i dostępna.
Po pierwsze, sprawdzi to point+[0,0]
(tylko ze względu na kompletność). To sprawdzi point+[1,0]
. To sprawdzi point+[1,1]
. Następnie point+[0,1]
itd. Zwróć pierwszą, dla której pozycja w siatce jest pusta (lub nie zajęta już przez punkt danych).
Nie ma górnej granicy do rozmiaru siatki.
Zrobiłem to, ale nie mogę zrozumieć na przykładzie wyjścia dałeś – alcuadrado
Brzmi jak pytanie Kod golfowego ... –
@alcuadrado Po pierwsze, zwraca pochodzenie.Następnie zwraca punkt [1,0]. Następnie "wiruje wokół" w kierunku przeciwnym do ruchu wskazówek zegara i zwraca punkt [1,1]. Spróbuję uczynić to bardziej zrozumiałym –