Wielkość tajemnicy księżyca
Jestem pewien, że słyszałeś, że księżyc zmienia swój rozmiar. Kiedy jesteś zakochany i masz szczęście, księżyc ma prawie dwa razy większy rozmiar niż normalne sytuacje. Niektórzy twierdzą, że przyczyną jest atmosfera, która działa jak soczewka. Inni uważają, że to tylko kwestia porównania z innymi obiektami, takimi jak drzewa w pobliżu. Każde wyjaśnienie, które przeczytasz, jest dość subiektywne.
Wielkość nauki o księżycu
Ok, jesteśmy programistami, prawda? Opieramy się na faktach, prawda? Oto eksperyment:
- Weź ładny aparat, który ręcznie ustawia czas i przysłonę.
- Ustaw aparat na maksymalny poziom powiększenia.
- Wyjdź, zrób kilka zdjęć księżyca, aby wykryć najlepsze ustawienia, aby księżyc był ostry, a oświetlenie w porządku.
- Zapamiętaj ustawienia
- Rób zdjęcia księżyca z tymi ustawieniami za każdym razem, gdy uważasz, że księżyc jest duży lub mały.
- Oblicz rozmiar księżyca w pikselach
Aparat nie kłamie, prawda? Licząc jasne piksele, możemy skutecznie zmierzyć rozmiar księżyca - przynajmniej w pikselach.
Jeśli rozmiar jest taki sam na wszystkich zdjęciach, oznacza to błąd w naszym mózgu. Jeśli rozmiar się różni, jest miejsce na spekulacje
- księżyc naprawdę rośnie (ale co je?)
- występuje efekt soczewki atmosferycznej
- księżyc ma łuk eliptyczny i czasami jest bliżej, a czasem dalej od ziemi
- ...
Ale zostawię to otwarte, dopóki twoje zadanie nie zostanie ukończone. Oczywiście chcesz z góry wiedzieć, czy twoje oprogramowanie może dokładnie obliczyć rozmiar księżyca.
Zadanie
Biorąc pod uwagę kilka zoptymalizowanych zdjęć Księżyca, proszę obliczyć jego rozmiar. Optymalizacja jest następująca: piksele są czarne lub białe. Nic pomiędzy. Bez antyaliasingu. To sprawia, że jest to łatwe, prawda?
Zastrzeżenie: księżyc nie zawsze jest pełny, wiesz ... może być sierpem! Ale nawet w kształcie sierpa rozmiar księżyca jest większy. Proszę obliczyć pełny rozmiar.
- Twój program pobiera PNG jako dane wejściowe, np. Jako argument wiersza polecenia nazwy pliku, przesyłany do
stdin
lub jako obiekt Bitmap (standardowej biblioteki frameworka), jeśli napiszesz funkcję zamiast programu. - Twój program działa z dowolną rozsądną wielkością bitmapy wejściowej, niekoniecznie kwadratową. Gwarantowana jest minimalna szerokość i wysokość 150 pikseli.
- Pełnia księżyca pokrywa co najmniej 25% zdjęcia.
- Twój program wyświetla obliczony rozmiar księżyca w pikselach, tak jakby był pełnią księżyca.
- Zakładamy, że księżyc jest idealną kulą.
- Dokładny rozmiar jest zawsze liczbą całkowitą, ale możesz podać liczbę dziesiętną, jeśli obliczenia ją zwrócą.
- Dokładność powinna wynosić od 98% do 102%. (To raczej zgadywanie niż coś, co mógłbym zagwarantować, że będzie możliwe do osiągnięcia. Jeśli uważasz, że jest to zbyt trudne do osiągnięcia, zostaw komentarz).
Aktualizacja :
- Środek księżyca niekoniecznie musi znajdować się na środku zdjęcia.
- Minimalny widoczny obszar to 5% księżyca lub 1,25% całkowitej liczby pikseli.
- Zdjęcie jest zrobione w taki sposób, aby cały księżyc pasował do obrazu, tj. Całkowita liczba pikseli jest górną granicą wielkości księżyca.
- Księżyc nie zostanie przycięty / obcięty.
Przykłady
Jeśli chcesz, możesz wygenerować własne próbki przy użyciu pliku mieszania . Stworzyłem dla ciebie następujące zdjęcia. Możesz policzyć piksele w pliku PNG za pomocą WhitePixelCounter.exe (wymaga .NET), aby sprawdzić, czy obraz zawiera tylko czarno-białe piksele i ile z nich.
Poniższe obrazy 256 x 256 pikseli różnią się ilością białych pikseli, ale wszystkie powinny mieć obliczony rozmiar księżyca wynoszący 16416 pikseli.
Te obrazy 177 x 177 pikseli powinny zwracać 10241 pikseli. Obrazy są w zasadzie takie same, ale tym razem zastosowano aparat o innej ogniskowej.
Próbki niekwadratowe i niecentrowane z wynikiem 9988:
Och, na razie nie mam implementacji referencyjnej, a nawet nie wiem, czy mogę coś zaimplementować. Ale w moim umyśle istnieje silne przekonanie, które mówi mi, że musi to być matematyczne rozwiązanie.
Zasady
To jest Code Golf. Najkrótszy kod na 30.03.2015 zostanie zaakceptowany.