Weź koło jednostki wyśrodkowane na początku. W dowolnych dwóch sąsiednich kwadrantach odbij krzywą okręgu wzdłuż linii łączących przecięcia xiy koła.
Dzięki uzyskanemu kształtowi możesz kafelkować płaszczyznę:
Zrobiłem ten obraz z niesamowitą piaskownicą fizyki 2D Algodoo !
Napisz program, który wyświetla obraz podobny do tego w popularnym formacie plików bezstratnych. Możesz zapisać obraz jako plik o wybranej nazwie lub możesz go po prostu wyświetlić. Nie należy pobierać żadnych danych wejściowych.
Zasady:
Cały obraz musi być poddawana tesselacji z płytek zmodyfikowanym koła przez jakiekolwiek dwa optycznie różnych kolorów RGB: jeden z pionowo skierowanymi płytek, jednej na płytki poziomo wskazującego.
Promień płytek koła powinien wynosić co najmniej 32 piksele. (Promień na powyższym obrazku wynosi około 110 pikseli.)
Obraz powinien mieć co najmniej 4 płytki szerokości i 4 płytki wysokości. W połączeniu z powyższą regułą oznacza to, że obrazy mogą mieć minimalny rozmiar 256 x 256 pikseli. (Zdjęcie powyżej to 4 kafelki na 4 kafelki).
Teselacja może być przetłumaczona na dowolną kwotę. Na przykład lewy górny róg obrazu nie musi być wierzchołkiem, w którym stykają się kafelki. (Teselacji nie należy jednak obracać.)
Możesz używać zewnętrznych bibliotek graficznych, które mają polecenia do rysowania okręgów i wysyłania obrazów itp.
Krzywe naprawdę powinny aproksymować koła, co można zrobić za pomocą algorytmu okręgu punktu środkowego , co zrobi większość bibliotek graficznych.
Wygładzanie wokół krawędzi płytek jest dozwolone, ale nie wymagane.
Najkrótsze przesłanie w bajtach wygrywa.
źródło
0.1
i przesunięciu0.001
dysku jest przechylony o $ \ phi = \ arctan (0,01) = 0,57 ° $, patrząc od góry dyski wydają się ściśnięte współczynnikiem $ \ cos (\ phi) = 0,99995 $, to znacznie mniej niż piksel.camera{orthographic location -9z}
. Ale ponieważ scena jest w zasadzie 2D, nie ma znaczenia, możesz nawet renderować ją podczas oglądaniaangle 170
bez zniekształceń rybiego oka w wyniku.Gnuplot, 182
Zauważyłem, że granice między komórkami wyglądają bardzo sinusoidalnie, więc wybrałem rozwiązanie analityczne z bardzo prostym równaniem rdzenia
Wygląda podobnie, ale koła są zbyt kwadratowe. Z tej samej idei, zastąpić
sin
przez krzywą wykonane z łączonych quartercircle łuków elektrycznych i obrócić o 45 ° w zastępującx
ay
zx+y
ax-y
źródło
Bezkontekstowy, 99 bajtów
Możesz zobaczyć wynik w Context Free Gallery .
źródło
HTML + JavaScript, 277
Aby przetestować, zapisz jako plik HTML i otwórz w przeglądarce. Albo uruchom fragment kodu
Ze względu na popularny popyt, oto obraz wyjściowy. W końcu nie takie ekscytujące ...
źródło
=>
wielu twoich postów i działałby tylko w Firefoksie. Ale nie martw się.IDL 8.3,
201193183 bajtówObraz jest wyprowadzany do okna graficznego IDL; Zrobiłem zrzut ekranu poniżej.
EDYCJA: dzięki @AlexA. i @ Sp3000 za pomoc w goleniu niektórych bajtów
źródło
Mathematica: 86 bajtów (lub 82 bajtów)
Dzięki nieskończonemu @alephalpha za sprytną metodę opartą na tablicy:
Wewnątrz tablicy znajduje się anonimowa funkcja, która wykorzystuje sprytną sztuczkę, aby dodać swoje argumenty (
+##
) i ustalić, czy suma jest nieparzysta. Ta wartość logiczna jest używana jako warunek wzoru, który zastępuje całą „białą” płytkę transformowaną, „czarną” płytką. StamtądArrayFlatten
łączy płytki iImage
wyświetla je.Zwróć uwagę na użycie krótszego
Thread
do zastąpieniaTranspose
. Nadal możemy zapisać 4 bajty, używając zamiast tego symbolu transpozycji.Poprzedni: 97 bajtów (lub 90 bajtów)
Można zmniejszyć liczbę bajtów, zastępując
Transpose@#
symbol indeksu górnego t (punkt kodowy U + F3C7, skrót ESCtr
ESC). W UTF-8 daje to w sumie 90 bajtów w 88 znakach .Zaczynamy od
DiskMatrix
, który generuje macierz binarną:Następnie przesuwamy kołowo rzędy macierzy, aby utworzyć komórkę elementarną dla kafelków:
Jeśli samolot jest szachownicą, są to „białe” kwadraty. W przypadku „czarnych” kwadratów musimy odwrócić kolory i obrócić o 90 stopni. Możemy odwrócić, odejmując od 1 (
1 - 1 -> 0
i1 - 0 -> 1
), i obracać, wykonując transpozycję:Jeśli wymiary obrazu są równe (jak minimalny rozmiar 4), to kafelek na prawej krawędzi będzie taki sam jak następny na lewej krawędzi. Jednak dodanie jednego kafelka, aby uzyskać nieparzysty rozmiar (5), a następnie konkatenacja wierszy tworzy regularny naprzemienny wzór.
Sugeruje to, że możemy uzyskać pełny obraz, owijając jeden rząd naprzemiennie płytek
Partition
. UżywamyTable
do tworzenia listy13
czarnych / białych par płytek iJoin
spłaszczania listy par do listy 26 płytek. NastępniePartition
otrzymaną listę w5
przez5
matrycę płytek (Partition
odrzuty spływu 26 th dachówka):Na koniec
ArrayFlatten
zamienia macierz macierzy kafelków w płaską macierz iImage
wyświetla wynik.Poprzedni: 111 bajtów
źródło
Image@ArrayFlatten@Array[RotateLeft[DiskMatrix@32,32]/.a_/;OddQ[+##]:>1-Thread@a&,{5,5}]
Java,
550540508504 bajtówTo jest aplet Java.
Rozszerzony o płytę grzewczą:
Aplet: mały program, który można wywołać w celu użycia podczas pracy w innej aplikacji.
Przykładowy obraz:
Wyjaśnienie:
Działa to przy użyciu metody drukowania każdego kafelka. Przed utworzeniem metody otrzymuje obiekt graficzny, który wykorzystuje układ współrzędnych wyśrodkowany w lewym górnym rogu każdej płytki:
Aby utworzyć kafelek, używamy następującej metody:
Jednak każda inna płytka musi być odbijana poziomo, aby uzyskać prawidłowy obraz.
Aby odzwierciedlić kafelek, po prostu modyfikujemy dostarczony
graphics
obiekt za pomocą tego kodu:Dzięki @CoolGuy za 4 bajty.
źródło
x
y
int a = 98, b = 49,x,y;
Mathematica
299256Wordy, ale miło było to rozgryźć.
Podstawowym kafelkiem jest r (pokazany poniżej), który jest regionem wyświetlanym przez RegionPlot. Odbicie lewej i prawej płytki jest wykonywane i łączone za pomocą r. Figurka złożona z dwóch kafelków jest następnie powtarzana, aby kafelkować przestrzeń.
źródło
C,
237209180 bajtów180 bajtów. Ta wersja zawiera zmiany sugerowane przez edc65 w komentarzu. Daje 9 ostrzeżeń kompilatora podczas budowania na komputerze Mac z opcją clang i domyślnymi:
209 bajtów, korzystając z sugestii z komentarzy Martina. Kompiluje bez ostrzeżeń z clang:
Wersja oryginalna, 237 bajtów:
Wynik (256 x 256):
Oryginalny kod z białymi spacjami dla lepszej czytelności:
Nie korzysta z żadnej biblioteki graficznej, rendering jest całkowicie zawarty w kodzie.
Podstawową ideą jest po prostu zapętlenie wszystkich 256 x 256 pikseli i sprawdzenie, czy znajdują się one wewnątrz / na zewnątrz okrągłego łuku kwadratu 32 x 32, w którym się znajdują. Dolne 5 bitów ogólnych współrzędnych pikseli określa względne współrzędne piksela w obrębie pod-kwadrat. Test wewnątrz / na zewnątrz
(x, y)
przebywania wewnątrz łuku o promieniur
jest wówczas standardem:Większość logiki polega na umieszczeniu środka łuku w odpowiednim rogu kwadratu i określeniu, który kolor znajduje się wewnątrz / na zewnątrz.
Kilka uwag na temat rozwiązania:
źródło
int a,b,c,d,x,y;
... Myślę, że możesz to zrobićmain(a,b,c,d,x,y)
, pamiętam coś, że domyślnym typem jest int. Kiedy już się tego pozbędziesz, możesz przenieść przypisania do d, x i y dofor
instrukcji inkrementacji wewnętrznej , np.d=c+32&64,...,++c
(Prawdopodobnie nawet przenieść++
w inne miejsce, o którym ic
tak wspominasz ), a następnie możesz pominąć nawiasy klamrowe wewnętrznyfor
. Dobra robota, btw! :)main()
zgodne ze standardem. Z pewnością powinienem pogrupować deklaracje. Przesunięcie przyrostów pozwoli również zaoszczędzić kilka bajtów. Nowaputs()
linia znajduje się w zewnętrznej pętli, więc nie jestem pewien, czy uda mi się pozbyć nawiasów klamrowych.stdio
niepotrzebne, użyj domyślnej deklaracji funkcji.int
jest domyślny dla globałów i można go pominąć (zmienne i główny). Najpierwputs
może wejść do środka. Zmienna nie jest używana w wewnętrznej pętli, więc należy zwiększyć jej wartość. 180:a,b,c,d,x,y;main(){for(puts("P1 256 256");b=a+32&64,a<256;++a){for(c=0;d=c+32&64,x=(a&64)-d?31-a&31:a&31,y=(c&64)-b?c&31:31-c&31,c++<256;)putchar(48+(x*x+y*y<962^b==d));puts("");}}
(kompiluje się z wieloma ostrzeżeniami, ale działa)