Für viele Spiele, die auf einem Gitter gespielt werden, sind Sechsecke die eindeutig überlegene Wahl. Leider haben viele kostenlose Spielekunstseiten nur nahtlose Kachelsätze für quadratische Karten. Bei einem früheren Projekt habe ich einige davon verwendet und sie manuell in Sechsecke konvertiert.
Allerdings bin ich in meinem Alter faul geworden. Es sollte einfach sein, den Prozess mit einem kleinen Skript zu automatisieren.
Allerdings bin ich in meinem Alter faul geworden. Also lagere ich es an Sie aus und verkleide es als Code-Golf-Herausforderung 1 .
Eingang
Die Eingabe ist ein quadratisches Bild in jedem gängigen Bildformat, das 24-Bit-RGB-Farben unterstützt. Sie können anstelle der Bilddaten auch einen Dateinamen als Eingabe verwenden.
Sie können davon ausgehen, dass das Bild quadratisch ist und die Seitenlänge ein Vielfaches von vier ist.
Ausgabe
Die Ausgabe ist die Eingabe-Kachel, wird jedoch in ein Sechseck umgewandelt (das Bild selbst ist quadratisch mit transparenten Bereichen). Sie können es in einer Datei speichern oder auf dem Bildschirm anzeigen.
Auch hier kann jedes gängige Bildformat verwendet werden. Wenn das von Ihnen verwendete Format Transparenz unterstützt, müssen die Hintergrundbereiche transparent sein. Wenn dies nicht der Fall ist, können Sie die Farbe # FF00FF (diese schreckliche Fuchsie) als Ersatz verwenden.
Methode
Wie machen wir das? Die Methode, die ich 2 verwende, drückt das Bild ein wenig vertikal zusammen, aber insgesamt sieht es für die meisten Dinge ziemlich gut aus. Wir werden ein Beispiel mit diesem Eingabebild machen:
- Skalieren: Skaliert das Bild auf ein Verhältnis von 3: 2. Da es sich bei unseren Bildern um Quadrate handelt, skalieren Sie sie einfach auf 75% Breite und 50% Höhe. Unsere Beispieleingabe ist 200x200, daher erhalten wir dieses 150x100-Bild:
- Kacheln: Legen Sie Kopien Ihres skalierten Bildes in einem 2x2-Raster ab:
- Zuschneiden: Ergreifen Sie ein Sechseck von geeigneter Größe an einer beliebigen Stelle in diesem 2x2-Raster. Dieses Sechseck ist zur Erleichterung des Kachelns nicht gerade regelmäßig. Nachdem Sie ein Quadrat der Originalgröße (hier 200x200) zugeschnitten haben, schneiden Sie die Ecken aus. Die Schnittlinien sollten von (ungefähr) der Mitte jeder linken / rechten Seite bis zu einem Viertel vom Rand oben / unten verlaufen:
Und das ist deine Ausgabe!
Hier ist ein Beispiel, wie es aussehen könnte, wenn es gekachelt ist (hier herausgezoomt):
Dies ist Codegolf, also gewinnt der kürzeste Code in Bytes. Es gelten Standardlücken usw.
1 Fühlen Sie sich frei, dies zu glauben oder nicht.
2 Methode eins von dieser hilfreichen Site.
Antworten:
Matlab,
223 215 209 184163 BytesDie Neuskalierung ist recht unkompliziert. Zum Beschneiden der Ecken lege ich ein Koordinatensystem über die Pixel und erstelle eine Maske über vier lineare Ungleichungen, die die Fläche des Sechsecks bestimmen.
PS: Dies wurde zu einem Codegolf- Nim- Spiel mit @ MartinBüttner's Submission: Sie müssen alternativ Ihren Code kürzer machen (bei gleicher Funktionalität) - derjenige, der die letzte Verkürzung bewirken kann, gewinnt =)
quelle
[k.*[2 3]/4]
.Mathematica,
231211209208201188173 BytesDies ist eine unbenannte Funktion, die ein Bildobjekt aufnimmt und ein Bildobjekt zurückgibt:
Ich denke, es gibt hier nicht viel zu erklären, aber einige Details, die von Bedeutung sind:
ImageAssemble[{{#,#},{#,#}}]
dh Sie übergebenImageAssemble
eine 2x2-Matrix mit Kopien des Bildes. Es gibtImageCollage
jedoch eine Art magische Funktion, die versucht, eine Reihe von Bildern so "gut" wie möglich anzuordnen (was auch immer das bedeutet ... Sie können den einzelnen Bildern sogar Gewichte und Zeug geben). Wie auch immer, Sie geben ihm vier Bilder gleicher Größe und mit gleichen (oder keinen) Gewichten, es ordnet sie auch in einem 2x2-Raster an. Dadurch kann ich einige Bytes für die Verschachtelung der Matrix sowie den Funktionsnamen speichern.Graphics
. Ich verwende das eingebauteRegularPolygon@6
, aber erzwinge ein Seitenverhältnis von1
, um es nach Bedarf zu dehnen. Benötigt leiderGraphics
ein paar teure Optionen, um Auffüllen und dergleichen zu vermeiden, und rendert auch Schwarz auf Weiß anstelle des Gegenteils. Das Ergebnis wird mit fixiertColorNegate
und dann mit an die Originalkanäle des Bildes angehängtSetAlphaChannel
.Graphics
legt eine kleine Menge Polsterung um das Sechseck, aber wir möchten, dass das Alpha-Sechseck die volle Größe des Ausschnitts bedeckt. SieSetAlphaChannel
können jedoch Bilder unterschiedlicher Größe kombinieren, indem Sie sie übereinander zentrieren und auf die kleinste Größe zuschneiden. Das heißt,PlotRangePadding->0
wir können das Sechseckbild nicht manuell einstellen, sondern einfach ein wenig mit skalierenImageSize->1.05e
(und wir benötigen trotzdem die Option `ImageSize).quelle
HTML5 + Javascript, 562 Bytes
Übernimmt die Eingabe als Bild-URL über ein Textfeld (die URL zählt hoffentlich als Dateiname). Gibt die Daten auf der Leinwand aus.
Version, die über alle Browser funktioniert (580 Bytes):
Testen Sie es mit dem Bild "blocks" von früher über diese URL: http://i.stack.imgur.com/gQAZh.png
quelle
id=A
zu dem<form>
undid=B
auf die<canvas>
dann ersetztl[0]
mitA
undl[1]
mitB
und Entfernenl=document.body.children;
. (Funktioniert in Firefox 41; ich bin mir nicht sicher, welche anderen Browser dies unterstützen.) Außerdem glaube ich, dass sich neben den geschweiften Klammern ein paar unnötige Semikolons und ein paar zusätzliche Leerzeichen befinden.id=C
um das<input>
, dann ersetzene.target.children[0]
mitC
.0.75
ist gleich3/4
,1/0.75
ist gleich4/3
,d/4+d/2
ist gleichd*3/4
und führende Nullen auf den anderen Dezimalstellen sind nicht erforderlich. Ich glaube auch, dass Sie das erstec.drawImage
durchc[p="drawImage"]
, dann jedes nachfolgende durch ersetzen könntenc[p]
; Sie könnten das gleiche mit tunc.lineTo
.Python 2 + PIL, 320
Liest den Namen der Bilddatei von stdin.
quelle
PIL
ich hatte keine Gelegenheit, es zu versuchen, und ich habe nicht genug darüber nachgedacht. Ich stehe aber immer noch zu meiner Newline-Aussage: PPHP, 293 Bytes
Ich habe einige Zeilen hinzugefügt, um die Lesbarkeit zu verbessern:
Hier ist die ungolfed Version:
quelle