Zainspirowany przez vi.sualize.us
Cel
Dane wejściowe to obraz w skali szarości, a dane wyjściowe to obraz czarno-biały. Obraz wyjściowy składa się tylko z jednej zamkniętej krzywej (pętli), która nie może się przecinać ani dotykać. Szerokość linii powinna być stała na całym obrazie. Wyzwanie polega na znalezieniu odpowiedniego algorytmu. Wyjście musi po prostu reprezentować obraz wejściowy, ale z dowolną swobodą artystyczną. Rozdzielczość nie jest tak ważna, ale proporcje powinny pozostać mniej więcej takie same.
Przykład
Więcej zdjęć testowych
The width of the line shall be constant throughout the whole image.
Ale wciąż przydatna wskazówkaOdpowiedzi:
Java: styl matrycowy
Ponieważ nikt jeszcze nie odpowiedział na to pytanie, dam mu szansę. Najpierw chciałem wypełnić płótno krzywymi Hilberta, ale ostatecznie zdecydowałem się na prostsze podejście:
Oto kod:
Aktualizacja : teraz tworzy cykl, a nie tylko jedną linię
źródło
Python: Krzywa Hilberta (
373361)Zdecydowałem się narysować krzywą Hilberta o zmiennej ziarnistości w zależności od intensywności obrazu:
Właściwie planowałem podejmować decyzje na różnych poziomach szczegółowości, np. „To miejsce jest tak jasne, że zatrzymam rekurencję i przejdę do następnego bloku!”. Ale lokalna ocena intensywności obrazu prowadząca do dużych ruchów jest bardzo niedokładna i wygląda brzydko. Więc ostatecznie zdecydowałem, czy pominąć poziom 1, czy narysować kolejną pętlę Hilberta.
Oto wynik pierwszego obrazu testowego:
Dzięki @githubphagocyte renderowanie jest dość szybkie (przy użyciu
turtle.tracer
). Dlatego nie muszę czekać całą noc na wynik i mogę iść do mojego zasłużonego łóżka. :)Trochę golfa
@flawr: „krótki program”? Nie widziałeś wersji w golfa! ;)
Tak dla zabawy:
(
373361 znaków. Ale to potrwa wieczność, odkąd usunęłemturte.tracer(...)
polecenie!)Animacja autorstwa flawr
flawr: Mój algorytm jest nieco zmodyfikowany do tego, co powiedział mi @DenDenDo: Musiałem usunąć niektóre punkty w każdej iteracji, ponieważ konwergencja drastycznie spowolniłaby. Dlatego krzywa się przecina.
źródło
screen.tracer(0)
zamiastturtle.speed(0)
. Może być konieczne utworzenie instancji ekranu na początku, ale jeśli jest to jedyna instancja ekranu, wszystkie żółwie zostaną automatycznie do niego przypisane. Następniescreen.update()
na samym końcu, aby wyświetlić wyniki. Byłem zaskoczony różnicą prędkości, kiedy po raz pierwszy to odkryłem ...Python 3.4 - Problem podróżującego sprzedawcy
Program tworzy przerywany obraz z oryginału:
Dla każdego czarnego piksela losowo generowany jest punkt w pobliżu środka piksela i punkty te są traktowane jako problem podróżnego sprzedawcy . Program zapisuje plik HTML zawierający obraz SVG w regularnych odstępach czasu, gdy próbuje zmniejszyć długość ścieżki. Ścieżka zaczyna się przecinać i stopniowo maleje z upływem godzin. W końcu ścieżka przestaje się przecinać:
Program wykorzystuje 3 różne podejścia do ulepszania rozwiązania i mierzy wydajność na sekundę dla każdego z nich. Czas przydzielony na każde podejście jest dostosowywany, aby zapewnić większość czasu na to, które podejście najlepiej sprawdza się w danym momencie.
Początkowo próbowałem zgadnąć, jaki procent czasu należy przeznaczyć na każde podejście, ale okazuje się, że to, które podejście jest najskuteczniejsze, różni się znacznie w trakcie procesu, więc dużą różnicą jest automatyczne dostosowywanie.
Trzy proste podejścia to:
Dla podejścia 3 używana jest siatka, zawierająca wszystkie linie przechodzące przez daną komórkę. Zamiast sprawdzać przecięcie każdej linii na stronie, sprawdzane są tylko te, które mają wspólną komórkę siatki.
Pomysł na wykorzystanie problemu sprzedawcy podróżującego wpadłem na post z bloga, który widziałem przed opublikowaniem tego wyzwania, ale nie mogłem go wyśledzić, kiedy opublikowałem tę odpowiedź. Wierzę, że obraz w tym wyzwaniu został również stworzony przy użyciu podejścia sprzedawcy podróżującego, w połączeniu z pewnego rodzaju wygładzaniem ścieżki w celu usunięcia ostrych zakrętów.
Nadal nie mogę znaleźć konkretnego wpisu na blogu, ale teraz znalazłem odniesienie do oryginalnych artykułów, w których Mona Lisa została wykorzystana do zademonstrowania problemu sprzedawcy podróżującego .
Implementacja TSP tutaj jest podejściem hybrydowym, z którym eksperymentowałem dla zabawy dla tego wyzwania. Nie czytałem powiązanych artykułów, kiedy to opublikowałem. Moje podejście jest boleśnie powolne w porównaniu. Zwróć uwagę, że mój obraz tutaj wykorzystuje mniej niż 10 000 punktów i zebranie go zajmuje wiele godzin, aby nie przekraczać linii. Przykładowy obraz w linku do artykułów wykorzystuje 100 000 punktów ...
Niestety większość linków wydaje się już martwa, ale artykuł „TSP Art” autorstwa Craiga S. Kaplana i Roberta Boscha 2005 nadal działa i daje ciekawy przegląd różnych podejść.
źródło
Java - Oscylacje
Program rysuje zamkniętą ścieżkę i dodaje oscylacje, których amplituda i częstotliwość oparte są na jasności obrazu. „Narożniki” ścieżki nie mają oscylacji, aby upewnić się, że ścieżka się nie przecina.
Poniżej porównywalny algorytm oparty na spirali. ( Wiem, że ścieżka się nie zamyka i na pewno przecina , po prostu umieszczam ją ze względu na sztukę :-)
źródło
Java - Ścieżka rekurencyjna
Zaczynam od zamkniętej ścieżki 2x3. Skanuję każdą komórkę ścieżki i dzielę ją na nową pod ścieżkę 3x3. Za każdym razem staram się wybrać ścieżkę podrzędną 3x3, która „wygląda jak” oryginalny obraz. Powyższy proces powtarzam 4 razy.
Oto kod:
źródło