W przypadku wielu gier rozgrywanych na planszy sześciokąty to Clearly Superior Choice ™. Niestety, wiele darmowych stron z grafikami gier zawiera wyłącznie bezszwowe kafelki dla kwadratowych map. W poprzednim projekcie wykorzystałem niektóre z nich i ręcznie przekonwertowałem je na sześciokąty.
Jednak na starość stałem się leniwy. Zautomatyzowanie procesu powinno być łatwe za pomocą małego skryptu.
Jednak na starość stałem się leniwy. Więc zlecam to tobie i ukrywam jako wyzwanie dla golfa 1 .
Wkład
Dane wejściowe to kwadratowy obraz w dowolnym popularnym formacie obrazu z 24-bitowym kolorem RGB. Możesz również wziąć nazwę pliku jako dane wejściowe zamiast samych danych obrazu.
Możesz założyć, że obraz jest kwadratowy i że długość boku jest wielokrotnością czterech.
Wydajność
Dane wyjściowe to kafelek wejściowy, ale przekształcony w sześciokąt (sam obraz będzie kwadratowy z przezroczystymi obszarami). Możesz zapisać go do pliku lub wyświetlić na ekranie.
Ponownie, zrobi to każdy wspólny format obrazu. Jeśli używany format obsługuje przezroczystość, obszary tła muszą być przezroczyste. Jeśli nie, możesz użyć koloru # FF00FF (ten okropny fuksja) jako stand-in.
metoda
Więc jak to zrobimy? Metoda, której używam 2, powoduje ściśnięcie obrazu nieco pionowo, ale ogólnie rzecz biorąc wygląda całkiem dobrze w większości rzeczy. Zrobimy przykład z tym obrazem wejściowym:
- Skala: przeskaluj obraz do proporcji 3: 2. Ponieważ nasze obrazy będą kwadratami, oznacza to, że po prostu skalujesz je do 75% szerokości i 50% wysokości. Nasze przykładowe dane wejściowe to 200 x 200, więc otrzymujemy obraz o wymiarach 150 x 100:
- Kafelek: umieść kopie skalowanego obrazu w siatce 2x2:
- Przytnij: weź siatkę o odpowiednim rozmiarze z dowolnego miejsca na tej siatce 2x2. Dla ułatwienia układania ten sześciokąt nie jest dokładnie regularny. Po przycięciu kwadratu o oryginalnym rozmiarze (tutaj 200 x 200), następnie przycinasz rogi. Linie przycinania powinny przebiegać od (z grubsza) środka każdej lewej / prawej strony do jednej czwartej od krawędzi u góry / u dołu:
I to jest twój wynik!
Oto przykład tego, jak może wyglądać po ułożeniu kafelków (tutaj pomniejszony):
To jest kod golfowy, więc wygrywa najkrótszy kod w bajtach. Obowiązują standardowe luki itp.
1 Możesz w to wierzyć lub nie.
2 Metoda pierwsza z tej pomocnej strony.
Odpowiedzi:
Matlab,
223 215 209 184163 bajtówPrzeskalowanie jest dość proste. Aby przyciąć rogi, nakładam układ współrzędnych na piksele i tworzę maskę za pomocą czterech nierówności liniowych, które określają pole sześciokąta.
PS: To zamieniło się w grę w codegolf nim z przesłaniem @ MartinBüttner: na przemian musisz skrócić swój kod (zapewniając tę samą funkcjonalność) - ten, który może sprawić, że ostatnie „skrócenie” wygra =)
źródło
[k.*[2 3]/4]
.Mathematica,
231211209208201188173 bajtówTo jest nienazwana funkcja, która pobiera obiekt obrazu i zwraca obiekt obrazu:
Nie sądzę, żeby było tu wiele do wyjaśnienia, ale kilka ważnych szczegółów:
ImageAssemble[{{#,#},{#,#}}]
, tj.ImageAssemble
Podajesz matrycę 2x2 z kopiami obrazu. Istnieje jednakImageCollage
jakaś magiczna funkcja, która próbuje uporządkować kilka zdjęć tak dobrze, jak to możliwe (cokolwiek to oznacza ... możesz nawet nadać poszczególnym obrazom wagi i inne rzeczy). W każdym razie, dajesz mu cztery obrazy o równej wielkości i o równej (lub żadnej) wadze, ułoży je również w siatkę 2x2. To pozwala mi zapisać niektóre bajty do zagnieżdżenia macierzy, a także nazwę funkcji.Graphics
. Korzystam z wbudowanegoRegularPolygon@6
, ale wymuszam współczynnik proporcji,1
aby go rozciągnąć w razie potrzeby. Niestety,Graphics
potrzebuje kilku kosztownych opcji, aby uniknąć wypełnienia i tym podobnych, a także renderuje czarno na białym zamiast na odwrót. Wynik jest ustalany za pomocą,ColorNegate
a następnie dołączany do oryginalnych kanałów obrazu za pomocąSetAlphaChannel
.Graphics
nakłada niewielką ilość wypełnienia wokół sześciokąta, ale chcemy, aby sześciokąt alfa pokrył pełny rozmiar wycięcia. Jednakże,SetAlphaChannel
można łączyć zdjęcia o różnych rozmiarach, przez centrowanie je w górnej części siebie i kadrowanie w najmniejszym rozmiarze. Oznacza to, że zamiast ręcznego ustawianiaPlotRangePadding->0
, możemy po prostu trochę powiększyć obraz sześciokątaImageSize->1.05e
(i tak potrzebujemy opcji `ImageSize).źródło
HTML5 + JavaScript, 562 bajty
Pobiera dane wejściowe jako adres URL obrazu za pośrednictwem pola tekstowego (mam nadzieję, że adres URL liczy się jako nazwa pliku). Wysyła dane do kanwy.
Wersja działająca we wszystkich przeglądarkach (580 bajtów):
Przetestuj go za pomocą obrazu „bloków” z wcześniejszego adresu URL: http://i.stack.imgur.com/gQAZh.png
źródło
id=A
do<form>
iid=B
do<canvas>
, a następnie zastąpieniel[0]
zeA
il[1]
zeB
i usuwaniel=document.body.children;
. (Działa w przeglądarce Firefox 41; nie jestem pewien, które inne przeglądarki to obsługują). Ponadto uważam, że obok prawego nawiasów klamrowych jest kilka niepotrzebnych średników i kilka dodatkowych spacji.id=C
do<input>
, a następnie zastąpiće.target.children[0]
zC
.0.75
jest równa3/4
,1/0.75
jest równa4/3
,d/4+d/2
jest równad*3/4
, a zera wiodące na pozostałych liczbach dziesiętnych nie są konieczne. Wierzę również można wymienić pierwsząc.drawImage
zc[p="drawImage"]
, a następnie jeden z każdym kolejnymc[p]
; możesz zrobić to samo zc.lineTo
.Python 2 + PIL, 320
Odczytuje nazwę pliku obrazu ze standardowego wejścia.
źródło
PIL
miałam okazji do wypróbowania i nie myślałam o tym wystarczająco. Nadal jednak trzymam się mojego nowego oświadczenia: PPHP, 293 bajty
Dodałem kilka nowych linii dla czytelności:
Oto wersja bez golfa:
źródło