Celem tego wyzwania jest określenie kąta linii na obrazie.
Zasady dotyczące obrazu:
- Tło obrazu będzie białe (
#FFFFFF
) - Obrys linii będzie czarny (
#000000
) - Linia NIE będzie wygładzana
- Obraz będzie miał wymiary 100 x 100 pikseli
- Linia zacznie się na środku obrazu
- Linia zacznie być skierowana w dół (6-OClock)
- Linia będzie miała długość 50 pikseli
- Kąt linii będzie mierzony w kierunku przeciwnym do ruchu wskazówek zegara od pozycji początkowej
- Kodek obraz będzie albo
.jpg
albo.png
Format wejściowy to nazwa pliku przekazywana przez wiersz poleceń arg, dane wejściowe skryptu lub arg funkcji. Format wyjściowy jest prosty - wystarczy podać liczbę stopni (np 90
.).
Odpowiedzi mogą wynosić ± 1 stopień podanej miary. Oto kilka przykładowych obrazów:
Obraz odniesienia w 45 stopniach z szarym tłem
0 stopni
45 stopni
50 stopni
130 stopni
230 stopni
324 stopnie
Oto kod używany do tworzenia obrazów (jest to kodowane przy pomocy Przetwarzania ):
int deg = 45;
int centX = width/2, centY = height/2;
background(255);
noSmooth();
line(centX,
centY,
centX + sin(radians(deg))*50,
centY + cos(radians(deg))*50);
saveFrame("line-"+deg+".png");// image codec can be changed here. use '.png' or '.jpg'
code-golf
image-processing
J Atkin
źródło
źródło
Odpowiedzi:
Pyth -
2826 bajtówUżywa tego samego rodzaju strategii brutalnej siły, co odpowiedź JS.
Pobiera dane wejściowe jako stdin jako nazwę pliku.
źródło
JavaScript (ES6), 225
227244bajtówZacznijmy:
Po prostu przekaż adres URL obrazu do funkcji:
Alarmuje stopnie w zakresie ± 1. Przeszedł wszystkie przypadki testowe.
Nie golfił
Edycje
źródło
s=>{(i=new Image).src=s;with(Math)with(document.createElement`canvas`.getContext`2d`)for(drawImage(i,0,0,100,100),a=360;r=--a/180*PI;)getImageData(50+48*cos(r),50+48*sin(r),1,1).data[1]||alert((450-a)%360)}
file://
. Musisz ustawićcrossOrigin
właściwość. Nie zadziała także, jeśli ładowanie obrazu zajmie 0,00001 sekundy dłużej niż tworzenie płótna. Ponadto nie potrzebujeszf=
odcinania 2 bajtów. Ale to naprawdę fajne rozwiązanie !!! Mój głos za to.onload
część, ponieważ z tego powodu zostałem podcięty w innym wyzwaniu. Pomyślałem więc, że można założyć, że ładuje się wystarczająco szybko. Jeśli chodzi o funkcję anonimową, nie jestem pewien, jak ją policzyć. Jeśli odetnęf=
i chcę to przywołać, muszę to owinąć()
jak(s=>{})('arg');
. Czy mogę zignorować tę liczbę bajtów?Matlab,
118104 bajtówGeneruję macierz tego samego rozmiaru co obraz z liczbami zespolonymi (0 na środku) i wycinam z tej macierzy wartości, które są na linii. Wyświetlany jest argument średniej z nich.
Podziękowania dla @ThomasKwa za zasugerowanie poprawy dokładności, co spowodowało również krótszy kod !!!
źródło
Matlab,
8677 bajtówOto inny sposób korzystania z Matlaba:
Odczytuje plik (skradziony z Flawr ) i znajduje indeksy czarnych pikseli. Następnie oblicza wektor, który wskazuje od środka obrazu do każdego czarnego piksela, i używa go
atan2d
do znalezienia kąta, zaokrąglenia w celu uzyskania kątów całkowitych imod(...,360)
uzyskania wyników we właściwym zakresie. Aby uzyskać prawidłowy kąt (w przypadku pikseli znajdujących się blisko środka jest trochę błędu), wybierz najczęściej obliczany kąt.Dzięki slvrbld za
im2bw
sugestię!źródło
Labview, 10098 bajtów
Podajmy inny kod labview.
Ponieważ nie ma oficjalnego sposobu liczenia bajtów w labview, używam rozmiaru pliku po zapisaniu. Alternatywnie licząc każdy drut i funkcję jako 1, a obudowa jako 2, wyszedłby na 71.
Załaduj obraz, spłaszcz do 1D, skanuj po 0 z obu stron i weź pierwszą, oblicz z powrotem do punktu i użyj geometrii, aby uzyskać kąt.
źródło
,
miejsca dziesiętne.