Mit diesem Stapel-Snippet wird ein weißes Rechteck mit einem Alias auf schwarzem Hintergrund gezeichnet. Dabei werden die Abmessungen, die Position, der Winkel und die Rastermaße angegeben:
<style>html *{font-family:Consolas,monospace}input{width:24pt;text-align:right;padding:1px}canvas{border:1px solid gray}</style><p>grid w:<input id='gw' type='text' value='60'> grid h:<input id='gh' type='text' value='34'> w:<input id='w' type='text' value='40'> h:<input id='h' type='text' value='24'> x:<input id='x' type='text' value='0'> y:<input id='y' type='text' value='0'> θ:<input id='t' type='text' value='12'>° <button type='button' onclick='go()'>Go</button></p>Image<br><canvas id='c'>Canvas not supported</canvas><br>Text<br><textarea id='o' rows='36' cols='128'></textarea><script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><script>function toCart(t,a,n,r){return{x:t-n/2,y:r/2-a}}function vtx(t,a,n){return{x:n.x+t*Math.cos(a),y:n.y+t*Math.sin(a)}}function sub(t,a){return{x:t.x-a.x,y:t.y-a.y}}function dot(t,a){return t.x*a.x+t.y*a.y}function inRect(t,a,n,r){var e=sub(a,t),o=sub(a,n),l=sub(a,r),i=dot(e,o),v=dot(e,l);return i>0&&i<dot(o,o)&&v>0&&v<dot(l,l)}function go(){var t=parseInt($("#gw").val()),a=parseInt($("#gh").val()),n=parseFloat($("#w").val()),r=parseFloat($("#h").val()),e={x:parseFloat($("#x").val()),y:parseFloat($("#y").val())},o=Math.PI*parseFloat($("#t").val())/180,l=Math.sqrt(n*n+r*r)/2,i=Math.atan2(r,n),v=vtx(l,o+i,e),h=vtx(l,o+Math.PI-i,e),u=vtx(l,o-i,e),x=$("#c");x.width(t).height(a).prop({width:t,height:a}),x=x[0].getContext("2d");for(var s="",c=0;a>c;c++){for(var f=0;t>f;f++)inRect(toCart(f+.5,c+.5,t,a),v,h,u)?(s+="..",x.fillStyle="white",x.fillRect(f,c,1,1)):(s+="XX",x.fillStyle="black",x.fillRect(f,c,1,1));a-1>c&&(s+="\n")}$("#o").val(s)}$(go)</script>
Die Textdarstellung hat XX
überall dort, wo sich ein schwarzes Pixel im Bild befindet, und ..
überall dort, wo sich ein weißes Pixel befindet. (Es sieht zerquetscht aus, wenn sie X
und sind .
.)
Schreiben Sie ein Programm, das die Textdarstellung eines vom Snippet erzeugten Rechtecks verwendet und die ungefähre Breite und Höhe des Rechtecks innerhalb von ± 7% der tatsächlichen Breite und Höhe ausgibt .
Ihr Programm sollte für alle möglichen Rechtecke, die vom Snippet gezeichnet werden können, mit den folgenden Einschränkungen funktionieren:
- Die Rechteckbreite und -höhe beträgt mindestens 24.
- Die Gitterbreite und -höhe beträgt mindestens 26.
- Das Rechteck berührt und verlässt niemals die Gittergrenzen.
Das Eingaberechteck kann also eine beliebige Drehung, Position und Bemaßung haben, und das Gitter kann eine beliebige Bemaßung haben, solange die drei oben genannten Bedingungen erfüllt sind. Beachten Sie, dass die Snippet-Parameter mit Ausnahme der Rastermaße Gleitkommazahlen sein können.
Einzelheiten
- Nehmen Sie das Rohtextrechteck als Eingabe oder den Dateinamen einer Datei, die das Rohtextrechteck enthält (über stdin oder Befehlszeile). Sie können davon ausgehen, dass das Textrechteck einen nachgestellten Zeilenumbruch hat.
- Sie können davon ausgehen, dass das Textrechteck aus zwei unterschiedlichen druckbaren ASCII- Zeichen besteht, die nicht
X
und.
falls gewünscht sind. (Zeilenumbrüche müssen Zeilenumbrüche bleiben.) - Geben Sie die gemessene Breite und Höhe als Ganzzahlen oder Gleitkommazahlen in beliebiger Reihenfolge als stdout aus (da nicht festgestellt werden kann, welcher Parameter tatsächlich zu welchem Parameter gehört). Jedes Format , dass eindeutig die beiden Dimensionen zeigt ist in Ordnung, zum Beispiel
D1 D2
,D1,D2
,D1\nD2
,(D1, D2)
etc. - Anstelle eines Programms können Sie eine Funktion schreiben, die das Textrechteck als Zeichenfolge oder als Dateinamen verwendet und das Ergebnis normal ausgibt oder als Zeichenfolge oder Liste / Tupel mit zwei Elementen zurückgibt.
- Denken Sie daran, dass
XX
oder..
ein Pixel des Rechtecks ist, nicht zwei.
Beispiele
Ex. 1
Parameter: grid w:60 grid h:34 w:40 h:24 x:0 y:0 θ:12
(Snippet-Standardeinstellungen)
Eingang
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX....XXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX............XXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX........................XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX..................................XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX............................................XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX....................................................XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX..............................................................XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX..........................................................................XXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX..................................................................................XXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX..................................................................................XXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX..................................................................................XXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXX................................................................................XXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXX..................................................................................XXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXX..................................................................................XXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXX..................................................................................XXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXX..................................................................................XXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX..................................................................................XXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX..................................................................................XXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX..................................................................................XXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX..................................................................................XXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXX................................................................................XXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXX..................................................................................XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXX..................................................................................XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXX..................................................................................XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXX..........................................................................XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX..............................................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX....................................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX............................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX..................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX........................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXX............XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXX....XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Beispielausgaben
40 24
24 40
[40.0, 24.0]
42.8, 25.68
(+ 7%)37.2, 22.32
(-7%)
Ex. 2
Parameter: grid w:55 grid h:40 w:24.5 h:24 x:-10.1 y:2 θ:38.5
Eingang
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX..XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX......XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX............XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX..............XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXX..................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXX......................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXX............................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX..............................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXX..................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX......................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXX............................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXX................................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXX..................................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXX......................................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XX............................................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XX..............................................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XX................................................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXX..............................................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXX..............................................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXX............................................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXX......................................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXX....................................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXX................................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXX............................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX......................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXX..................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXX................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX..........................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXX......................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX..................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXX..........XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXX......XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX..XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Beispielausgaben
24.0 24.5
25.68 26.215
(+ 7%)22.32 22.785
(-7%)
Wertung
Der kürzeste Code in Bytes gewinnt. Tiebreaker ist der am höchsten gewählte Beitrag.
Antworten:
Matlab, 226 Bytes
Die Idee ist einfach: Zuerst versuche ich herauszufinden, um wie viel das Rechteck gedreht wurde, und dann drehe ich das Bild entsprechend, sodass das Rechteck aufrecht steht. Dann 'summiere' ich einfach alle Pixel in den Zeilenspalten und zähle, wie viele der Summen über dem Durchschnitt liegen (einfaches Schwellenwertverfahren), um die Breite und Höhe zu bestimmen. Diese einfache Methode funktioniert überraschend zuverlässig.
Wie kann ich den Winkel erkennen?
Ich versuche einfach jeden Schritt (jeweils ein Grad) und summiere entlang der Spalten und erhalte einen Summenvektor. Wenn das Rechteck aufrecht ist, sollte ich idealerweise nur zwei plötzliche Änderungen in diesem Summenvektor erhalten. Wenn sich das Quadrat auf der Spitze befindet, sind die Änderungen sehr allmählich. Ich verwende also nur die erste Ableitung und versuche, die Anzahl der "Sprünge" zu minimieren. Hier sehen Sie eine grafische Darstellung des Kriteriums, das wir zu minimieren versuchen. Beachten Sie, dass Sie die vier Minima sehen können, die den vier möglichen aufrechten Ausrichtungen entsprechen.
Weitere Überlegungen: Ich bin mir nicht sicher, wie viel Golf gespielt werden kann, da die exhausive Winkelsuche viele Zeichen erfordert, und ich bezweifle, dass Sie dies mit integrierten Optimierungsmethoden so gut erreichen können, da es, wie Sie sehen, viele lokale Minima gibt das suchen wir nicht. Sie können ganz einfach die Genauigkeit (für große Bilder) verbessern , indem eine kleinere Schrittweite für die Winkel wählen und nur 90 suchen ° statt 360 ° , so dass Sie ersetzen könnte
0:360
mit0:.1:90
oder somehting so. Für mich bestand die Herausforderung jedoch eher darin, einen robusten Algorithmus zu finden, als Golf zu spielen, und ich bin mir sicher, dass die Einträge in den Golfsprachen meine Einsendung weit hinter sich lassen werden =)PS: Jemand sollte wirklich eine Golfsprache von Matlab / Octave ableiten.
Ausgänge
Beispiel 1:
Beispiel 2:
Code
Golf gespielt:
Ungolfed:
quelle
CJam,
68 6564 BytesDies kann ein wenig mehr golfen werden ..
Wie es funktioniert
Die Logik ist ziemlich einfach, wenn Sie darüber nachdenken.
Alles, was wir von den Eingabekombinationen benötigen,
X.
sind 3 Koordinaten von zwei benachbarten Seiten. So bekommen wir sie:First
Bei jeder Ausrichtung des Rechtecks ist die erste
.
in der gesamten Eingabe eine der Ecken. Beispielsweise..Hier ist die erste
.
in der 2 nd Linie, 8 th Spalte.Aber das ist es nicht, wir müssen einige Anpassungen vornehmen und die Breite des
.
Laufs auf dieser Linie zu den Koordinaten hinzufügen , um die Koordinate des rechten Endes zu erhalten.Second
Wenn wir das obige Rechteck transponieren (in Zeilenumbrüchen gedreht), nimmt die linke untere Ecke den Platz des obigen Schritts ein. Aber hier kompensieren wir die
.
Lauflänge nicht, da wir uns sowieso gewünscht hätten, die untere linke Koordinate der Kante zu erhalten (die in transponierter Form immer noch die erste sein wird, auf die wir stoßen.
).Rest two
Zum Ausruhen zweier Koordinaten drehen wir einfach das Rechteck horizontal und führen die obigen beiden Schritte aus. Eine der Ecken hier wird von den ersten beiden gemeinsam sein.
Nachdem wir alle 4 erhalten haben, berechnen wir einfach die Entfernungen.
Dies ist nicht die genaueste Methode, funktioniert jedoch innerhalb der Fehlergrenze und für alle möglichen Ausrichtungen des Rechtecks.
Code-Erweiterung (etwas veraltet)
Probieren Sie es hier online aus
quelle
-2
. Der Fehler liegt bei 28%. Ich habe einen ähnlichen Ansatz ausprobiert (es war meine ursprüngliche Idee, bevor ich mich mit Ihrer befasst habe), und es stellte sich heraus, dass es schwieriger als erwartet war, genau genug zu sein, insbesondere wenn die Seiten in der Nähe von horizontal / vertikal sind. Funktioniert gut, wenn sie näher an der Diagonale liegen. Ich denke, dies erfordert entweder mehr Logik (z. B. auch die Suche nach Extremen in diagonaler Richtung) oder einen völlig anderen Ansatz..
Breitenanpassung an der zweiten statt an der ersten Koordinate erforderlich ist . Wird reparieren. Sollte kurz sein.Python 3,
347337 BytesDies fiel schwerer aus als ich erwartet hatte. In Arbeit...
Definiert eine Funktion,
f
die den String als Argument verwendet und das Ergebnis an STDOUT ausgibt.Pyth,
87848281757271 Bytes(MÖGLICHERWEISE UNGÜLTIG, UNTERSUCHUNG, WENN ICH NACH HAUSE KOMME)
Wegnoch zu lang. Grundsätzlich ein Port des Vorgängers. Pyths.a
euklidische Distanz lieben . Übernimmt die Eingabe über STDIN und gibt die Ausgabe über STDOUT aus. Erwartet, dass das Nicht-Rechteck-Zeichen in Kleinbuchstaben geschrieben wirdx
(also alles mit einem ASCII-Wert von 98 oder mehr).Algorithmus
Beide verwenden den gleichen Algorithmus. Ich beginne im Grunde genommen mit einem Array, das den Massenmittelpunkt des Rechteckbereichs enthält. Ich füge dann drei Punkte zum Array aller Punkte im Rechteck hinzu und wähle immer den Punkt mit der maximalen Summe der Abstände zu den bereits im Array vorhandenen Punkten. Das Ergebnis sind immer drei Punkte in verschiedenen Ecken des Rechtecks. Ich berechne dann einfach alle drei Abstände zwischen diesen drei Punkten und nehme die zwei kürzesten.
quelle
[33.0, 59.0]
statt[40, 24]
und[39.0, 54.0]
statt[24.0, 24.5]
.Python 2, 342 Bytes
Dies wurde vom Algorithmus von @ Pietu1998 inspiriert. Es geht darum, eine Ecke als den Punkt zu bestimmen, der am weitesten vom Zentrum entfernt ist, unterscheidet sich jedoch von dort:
Der Code folgt also dieser Sequenz:
r
mit Rechteckpunkten.1.0
wird zu den Entfernungen hinzugefügt, da die ursprünglichen Entfernungsberechnungen Pixelindizes verwenden. Wenn Sie beispielsweise 5 Pixel haben, betrug die Differenz zwischen dem Index des letzten und des ersten Pixels nur 4, was im Endergebnis ausgeglichen werden muss.Präzision ist ziemlich gut. Für die beiden Beispiele:
quelle
Python 2, 272 Bytes
Posten Sie dies als separate Antwort, da es sich um einen völlig anderen Algorithmus handelt als meinen vorherigen:
Dieser Ansatz identifiziert überhaupt keine Ecken. Es basiert auf der Beobachtung, dass die Größe (Breite und Höhe) des Begrenzungsrahmens und der Bereich des gedrehten Rechtecks ausreichen, um die Breite und Höhe des Rechtecks zu bestimmen.
Wenn Sie auf einer Skizze betrachten, ist es ziemlich einfach , die Breite (zu berechnen
wb
) und Höhe (hb
) des Begrenzungsrahmens mitw
/h
die Größe des Rechtecks undp
der Drehwinkel:wb
undhb
kann direkt aus dem Bild extrahiert werden. Wir können die Gesamtflächea
des Rechtecks auch schnell extrahieren, indem wir die Anzahl der..
Pixel zählen. Da es sich um ein Rechteck handelt, erhalten wir die zusätzliche Gleichung:So haben wir drei Gleichungen mit drei Unbekannten (
w
,h
undp
), die die Unbekannten bestimmen genug ist. Das einzige Problem ist, dass die Gleichungen trigonometrische Funktionen enthalten, und zumindest mit meiner Geduld und meinen mathematischen Fähigkeiten kann das System nicht einfach analytisch gelöst werden.Was ich implementiert habe, ist eine Brute-Force-Suche nach dem Winkel
p
. Sobaldp
gegeben ist, werden die ersten beiden obigen Gleichungen zu einem System von zwei linearen Gleichungen, die fürw
und aufgelöst werden könnenh
:Mit diesen Werten können wir dann
w * h
mit dem gemessenen Bereich des Rechtecks vergleichen. Die beiden Werte wären idealerweise irgendwann gleich. Dies wird in der Gleitkomma-Mathematik natürlich nicht passieren.Der Wert von
w * h
nimmt mit zunehmendem Winkel ab. Wir beginnen also bei Winkel 0.0 und erhöhen den Winkel dann in kleinen Schritten, bis das erste Malw * h
kleiner als der gemessene Bereich ist.Der Code besteht nur aus zwei Hauptschritten:
Die Genauigkeit der Ausgabe ist gut für Rechtecke, bei denen Breite und Höhe erheblich voneinander abweichen. Bei Rechtecken, die fast quadratisch und fast um 45 Grad gedreht sind, wird es etwas zweifelhaft, und die 7% -Fehlerhürde für Testbeispiel 2 wird kaum überwunden.
Die Bitmap für Beispiel 2 sieht tatsächlich etwas seltsam aus. Die linke Ecke sieht verdächtig langweilig aus. Wenn ich an der linken Ecke ein Pixel mehr hinzufüge, sieht beides (für mich) besser aus und liefert eine viel bessere Präzision für diesen Algorithmus.
quelle