Ziel dieser Herausforderung ist es, den Winkel einer Linie in einem Bild zu bestimmen.
Regeln für das Bild:
- Der Bildhintergrund wird weiß (
#FFFFFF
) - Der Strich der Linie ist schwarz (
#000000
) - Die Leitung ist NICHT geglättet
- Das Bild hat eine Größe von 100 x 100 Pixel
- Die Linie beginnt in der Bildmitte
- Die Linie beginnt nach unten zu zeigen (6-Uhr)
- Die Linie wird 50 Pixel lang sein
- Der Winkel der Linie wird gegen den Uhrzeigersinn von der Startposition aus gemessen
- Der Bild-Codec ist entweder
.jpg
oder.png
Das Eingabeformat ist ein Dateiname, der von dem Befehlszeilenargument, der Skripteingabe oder dem Funktionsargument übergeben wird. Das Ausgabeformat ist einfach - geben Sie einfach die Gradzahl aus (z 90
. B. ).
Die Antworten können ± 1 Grad des angegebenen Maßes betragen. Hier einige Beispielbilder:
Ein Referenzbild bei 45 Grad mit grauem Hintergrund
0 Grad
45 Grad
50 grad
130 grad
230 grad
324 grad
Hier ist der Code, der zum Erstellen der Bilder verwendet wird (dies ist mit Processing codiert ):
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
quelle
quelle
Antworten:
Pyth -
2826 BytesVerwendet dieselbe Brute-Force-Strategie wie die Antwort von js.
Übernimmt die Eingabe als Dateiname von stdin.
quelle
JavaScript (ES6), 225
227244ByteLass uns die Sache in Schwung bringen:
Übergeben Sie einfach die URL des Bildes an die Funktion:
Alarmiert Grad innerhalb des Bereichs von ± 1. Hat alle Testfälle bestanden.
Ungolfed
Bearbeitungen
quelle
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://
. Sie müssen diecrossOrigin
Eigenschaft festlegen . Es funktioniert auch nicht, wenn das Laden des Bildes 0,00001 Sekunden länger dauert als das Erstellen der Leinwand. Außerdem brauchen Sie dief=
2 Bytes nicht abzuschneiden. Aber es ist in der Tat eine schöne Lösung !!! Mein Lob dafür.onload
Teil übersprungen, weil ich in einer anderen Herausforderung deswegen unterboten wurde. Ich dachte, es ist in Ordnung anzunehmen, dass es schnell genug geladen wird. Bezüglich der anonymen Funktion bin ich mir nicht sicher, wie ich sie zählen soll. Wenn ich abgeschnittenf=
und ich möchte es rufe ich habe es umwickeln()
wie(s=>{})('arg');
. Kann ich dies bei der Byteanzahl ignorieren?Matlab,
118104 BytesIch generiere eine Matrix mit der gleichen Größe wie das Bild mit komplexen Zahlen (0 in der Mitte) und extrahiere aus dieser Matrix die Werte, die auf der Linie stehen. Das Argument des Mittelwerts dieser wird dann angezeigt.
Vielen Dank an @ThomasKwa für den Hinweis auf eine Verbesserung der Genauigkeit, die auch zu einem kürzeren Code führte !!!
quelle
Matlab,
8677 BytesHier ist eine andere Möglichkeit, Matlab zu verwenden:
Dies liest die Datei (gestohlen von flawr ) und findet die Indizes der schwarzen Pixel. Dann wird der Vektor berechnet, der von der Bildmitte zu jedem schwarzen Pixel zeigt, und
atan2d
der Winkel ermittelt, gerundet, um ganzzahlige Winkel zu erhalten, und ausgeführtmod(...,360)
werden Ergebnisse im richtigen Bereich erzielt. Verwenden Sie den am häufigsten berechneten Winkel, um den richtigen Winkel zu erhalten (für die Pixel nahe der Mitte ist ein Fehler aufgetreten).Danke an slvrbld für den
im2bw
Vorschlag!quelle
Labview, 10098 Bytes
Lassen Sie uns einen weiteren Labview-Code veröffentlichen.
Da es in labview keine offizielle Möglichkeit gibt, Bytes zu zählen, verwende ich beim Speichern die Größe der Datei. Wenn Sie alternativ jeden Draht und jede Funktion als 1 und den Fall als 2 zählen, ergibt sich 71.
Bild laden, auf 1D reduzieren, von beiden Seiten nach Nullen suchen und die erste nehmen, zurück zum Punkt rechnen und Geometrie verwenden, um den Winkel zu bestimmen.
quelle
,
Nachkommastellen habt .