2009-09-29 18 views
15

Próbuję wprowadzić buddhabrot fractal. Nie mogę zrozumieć jednej rzeczy: wszystkie zastosowane przeze mnie rewizje wybierają losowe punkty na obrazie, aby obliczyć ścieżkę ucieczki cząstek. Dlaczego to robią? Dlaczego nie przejrzeć wszystkich pikseli?Buddhabrot Fractal

Jakiemu celowi ma służyć losowe punkty? Więcej punktów sprawia, że ​​lepsze zdjęcia, więc myślę, że przeglądanie wszystkich pikseli sprawia, że ​​najlepszy obraz - czy jestem tutaj w błędzie?

Z moich danych testowych:

Praca na 400x400 obraz. Tak więc 160 000 pikseli do iteracji, jeśli przejdę na drugą stronę.

Korzystanie wyrywkowej, Obraz zaczyna się kształtować dopiero po 1 mln punktów. Dobre wyniki pokazują około 1 miliarda punktów losowych, których obliczenie zajmuje godziny.

+0

Co się tyczy twojej edycji - czy dane z testu pochodzą z losowego próbkowania, czy też z metody brute force przechodzenia przez wszystkie piksele? Chociaż spodziewam się, że losowe próbkowanie będzie szybsze (średnio), chciałbym zobaczyć, jak te dwie metody * faktycznie * dla ciebie porównują w praktyce. – Streklin

+1

mój błąd zapomniał o tym wspomnieć. Te dane pochodzą z losowego pobierania próbek. –

+1

Hmm, liczby wydają się trochę dziwne - jak robisz losową próbkę - pomyślałbym, że po miliardie punktów zdobędziesz co najmniej kilka punktów zainteresowania (choć nie ma gwarancji że) z próbnego zestawu 160 000. Czy uzyskujesz taką samą jakość obrazu, gdy raz przekroczysz każdy piksel za pomocą brutalnej siły? – Streklin

Odpowiedz

31

losowe próbkowanie jest lepsza niż próbkowania siatki z dwóch głównych powodów. Po pierwsze dlatego, że próbkowanie siatki spowoduje powstanie artefaktów podobnych do siatki w wynikowym obrazie. Po drugie dlatego, że próbkowanie siatki może nie dostarczyć wystarczającej liczby próbek do uzyskania konwergentnego obrazu wynikowego. Jeśli po ukończeniu przejścia do siatki chciałeś więcej próbek, musisz wykonać kolejne przejście z nieco przesuniętą siatką (aby nie powtórzyć tych samych punktów) lub przejść na lepszą siatkę, która może zakończyć się wykonywaniem więcej pracy niż jest to potrzebne . Losowe próbkowanie daje bardzo gładkie wyniki i można zatrzymać proces, gdy obraz się połączy, lub jesteś zadowolony z wyników.

jestem wynalazca techniki więc możesz mi zaufać w tej sprawie. :-)

1

Choć nie jestem 100% świadomy tego, co dokładna przyczyna będzie, chciałbym założyć, że ma więcej wspólnego z efektywnością. Jeśli zamierzasz wielokrotnie powtarzać każdy punkt, będzie to zmarnować wiele cykli przetwarzania, aby uzyskać obraz, który nie będzie wyglądał o wiele lepiej. Wykonując losowe próbkowanie, można zredukować ilość pracy wymaganej do wykonania - a biorąc pod uwagę wystarczająco duży rozmiar próbki, otrzymujemy wynik trudny do "odróżnienia" od iteracji nad wszystkimi pikselami (z wizualnego punktu widzenia).

0

Jest to prawdopodobnie pewnego rodzaju Monte-Carlo method, więc tak, przejście przez wszystkie piksele dałoby idealny wynik, ale byłoby strasznie czasochłonne.

Dlaczego nie można po prostu go wypróbować i zobaczyć co się dzieje?

+5

Myślę, że ty i inni jesteście trochę zawieszeni na tym samym niewypowiedzianym założeniu, że istnieje tylko skończona liczba punktów początkowych. Piksele nie są punktami; są to regiony kwadratowe. Rozpoczynanie od różnych punktów w danym pikselu może generować drastycznie różne trajektorie. –

3

To samo dotyczy fraktali płomieniowych: Budda ma na celu znalezienie "atraktorów", , więc nawet jeśli zaczniesz od losowego punktu, zakłada się, że dość szybko zbiegają się one do tych przyciągających krzywych. Zwykle unikasz malowania pierwszych 10 pikseli w iteracji, a więc i tak, więc punkt początkowy nie jest tak naprawdę istotny, ALE, aby uniknąć dwukrotnego wykonywania tego samego obliczenia, losowe próbkowanie jest znacznie lepsze. Jak wspomniano, eliminuje ryzyko artefaktów.

Ale najważniejszą cechą losowego próbkowania jest to, że ma on wszystkie poziomy dokładności (przynajmniej teoretycznie). Jest to BARDZO ważne dla fraktali: mają szczegóły na wszystkich poziomach dokładności, a więc wymagają również danych wejściowych ze wszystkich poziomów.

0

Losowe pobieranie próbek jest używane w celu uzyskania jak najbardziej zbliżonego do rozwiązania, które w takich przypadkach nie może być obliczone dokładnie ze względu na statystyczny charakter problemu.

Można "przechodzić przez wszystkie piksele", ale ponieważ każdy piksel jest w rzeczywistości kwadratem z wymiarami dx * dy, do obliczeń można użyć tylko num_x_pixels * num_y_pixels punktów i uzyskać bardzo ziarniste wyniki.

Innym sposobem byłoby użycie bardzo dużej rozdzielczości i skalowanie po renderowaniu po obliczeniu. Dałoby to pewien rodzaj "systematycznego" renderowania, w którym każdy piksel ostatecznego renderowania jest dzielony w równych ilościach subpikseli.