Ambil satuan lingkaran yang berpusat pada titik asal. Di dua kuadran tetangga , cerminkan kurva lingkaran melintasi garis yang menghubungkan intersep x dan y lingkaran.
Dengan bentuk yang dihasilkan, Anda dapat memasang bidang:
Saya membuat gambar ini dengan kotak pasir fisika 2D yang mengagumkan, Algodoo !
Tulis sebuah program yang mengeluarkan gambar yang mirip dengan ini dalam beberapa format file gambar umum yang tidak ada ruginya. Anda dapat menyimpan gambar sebagai file dengan nama pilihan Anda atau Anda dapat menampilkannya. Tidak ada input yang harus diambil.
Aturan:
The Seluruh gambar harus tessellated dengan ubin diubah-lingkaran menggunakan dua warna RGB visual yang berbeda: satu untuk ubin vertikal menunjuk, satu untuk ubin horizontal menunjuk.
Jari-jari petak lingkaran minimal harus 32 piksel. (Jari-jari pada gambar di atas adalah sekitar 110 piksel.)
Ukuran gambar harus minimal 4 ubin dan tinggi 4 ubin. Ini, digabungkan dengan aturan di atas, berarti bahwa gambar dapat memiliki ukuran minimum 256 × 256 piksel. (Gambar di atas adalah 4 ubin dengan 4 ubin.)
Tessellation dapat diterjemahkan dengan jumlah berapa pun. Misalnya, sudut kiri atas gambar tidak perlu menjadi titik di mana ubin bertemu. (Namun, tessellation tidak boleh diputar.)
Anda dapat menggunakan pustaka grafik eksternal yang memiliki perintah untuk menggambar lingkaran dan menghasilkan gambar dan sejenisnya.
Kurva harus benar-benar mendekati lingkaran, seperti yang dapat dilakukan dengan algoritma lingkaran titik tengah , yang sebagian besar pustaka grafis akan lakukan untuk Anda.
Anti-aliasing di sekitar tepi ubin diperbolehkan tetapi tidak diperlukan.
Pengajuan terpendek dalam byte menang.
sumber
0.1
dan offset0.001
disk dimiringkan oleh $ \ phi = \ arctan (0,01) = 0,57 ° $, tampak dari atas disk-disk tersebut diperas oleh faktor $ \ cos (\ phi) = 0,99995 $, itu jauh lebih kecil dari satu piksel.camera{orthographic location -9z}
. Tetapi karena adegan ini pada dasarnya 2D tidak ada bedanya, Anda bahkan dapat membuatnya dengan tampilanangle 170
tanpa distorsi mata ikan di hasilnya.Gnuplot, 182
Saya perhatikan bahwa batas antar sel terlihat sangat sinusoidal, jadi saya mencari solusi analitik dengan persamaan inti yang sangat sederhana
Meskipun terlihat serupa, lingkarannya terlalu persegi. Dengan ide yang sama, saya menggantinya
sin
dengan kurva yang terbuat dari lingkaran quartercircle-concatenated dan memutarnya 45 ° dengan menggantix
dany
denganx+y
danx-y
sumber
Konteks Gratis, 99 byte
Anda dapat melihat hasilnya di Galeri Gratis Konteks .
sumber
HTML + JavaScript, 277
Untuk menguji, simpan sebagai file html dan buka dengan browser. Atau yang lain, jalankan cuplikan
Karena permintaan yang populer, di sini adalah gambar output. Lagipula tidak begitu menarik ...
sumber
=>
seperti banyak posting Anda dan hanya akan berfungsi di Firefox. Tapi jangan khawatir.IDL 8.3,
201193183 byteGambar dikeluarkan ke jendela grafis IDL; Saya mengambil tangkapan layar, di bawah.
EDIT: terima kasih kepada @AlexA. dan @ Sp3000 untuk membantu saya mencukur beberapa byte
sumber
Mathematica: 86 byte (atau 82 byte)
Berkat infinite @alephalpha untuk metode berbasis array yang pintar:
Di dalam array adalah fungsi anonim, yang menggunakan trik pintar untuk menambahkan argumennya (
+##
) dan menentukan apakah jumlahnya aneh. Boolean itu digunakan sebagai syarat untuk sebuah pola yang menggantikan seluruh ubin 'putih' dengan ubin 'hitam' yang ditransformasikan. Dari sana,ArrayFlatten
bergabung bersama ubin danImage
menampilkannya.Perhatikan penggunaan yang lebih pendek
Thread
untuk menggantiTranspose
. Kita masih dapat menyimpan 4 byte dengan menggunakan simbol transpos sebagai gantinya.Sebelumnya: 97 byte (atau 90 byte)
Anda dapat mengurangi jumlah byte dengan mengganti
Transpose@#
dengan simbol superscript-t (codepoint U + F3C7, pintasan ESCtr
ESC). Dalam UTF-8 yang membawa total hingga 90 byte dalam 88 karakter .Kita mulai dengan
DiskMatrix
, yang menghasilkan matriks biner:Kami kemudian menggeser-geser baris matriks untuk menghasilkan sel satuan untuk ubin:
Jika pesawat itu papan catur, ini adalah kotak 'putih'. Untuk kotak 'hitam', kita perlu membalikkan warna dan memutar 90 derajat. Kita dapat membalikkan dengan mengurangi dari 1 (
1 - 1 -> 0
dan1 - 0 -> 1
), dan memutar dengan mengambil transpos:Jika dimensi gambar rata (seperti ukuran minimum, 4), maka ubin di tepi kanan akan sama dengan yang berikutnya di tepi kiri. Namun, menambahkan satu ubin untuk mendapatkan ukuran ganjil (5) kemudian menggabungkan baris menghasilkan pola bergantian yang teratur.
Ini menunjukkan bahwa kita bisa mendapatkan gambar penuh dengan membungkus satu baris ubin bergantian dengan
Partition
. Kami menggunakanTable
untuk membuat daftar13
pasangan ubin hitam / putih, danJoin
untuk meratakan daftar pasangan ke daftar 26 ubin. Kemudian kitaPartition
daftar menjadi5
oleh5
matriks ubin (Partition
membuang trailing 26 th genteng):Akhirnya
ArrayFlatten
mengubah matriks matriks ubin menjadi matriks datar, danImage
menampilkan hasilnya.Sebelumnya: 111 byte
sumber
Image@ArrayFlatten@Array[RotateLeft[DiskMatrix@32,32]/.a_/;OddQ[+##]:>1-Thread@a&,{5,5}]
Java,
550540508504 byteIni adalah applet java.
Diperluas dengan boilerplate:
Applet: Program aplikasi kecil yang dapat dipanggil untuk digunakan saat bekerja di aplikasi lain.
Contoh gambar:
Penjelasan:
Ini berfungsi dengan menggunakan metode untuk mencetak setiap ubin. Sebelum metode dibuat, diberikan objek grafis yang menggunakan sistem koordinat yang berpusat di sudut kiri atas setiap ubin:
Untuk membuat ubin, kami menggunakan metode berikut:
Namun, setiap ubin lain harus dipantulkan secara horizontal untuk menghasilkan gambar yang benar.
Untuk mencerminkan ubin, kami cukup memodifikasi
graphics
objek yang disediakan dengan kode ini:Terima kasih @CoolGuy untuk 4 byte.
sumber
x
dany
sebagai bidang kelas:int a = 98, b = 49,x,y;
Mathematica
299256Wordy tapi itu bagus untuk mencari tahu.
Ubin dasar adalah r (diperlihatkan di bawah), yang merupakan wilayah yang ditampilkan oleh RegionPlot. Refleksi kiri-kanan ubin dibuat dan bergabung dengan r. Angka dua ubin yang dirakit kemudian diulang untuk ubin ruang.
sumber
C,
237209180 byte180 byte Versi ini mencakup perubahan yang disarankan oleh edc65 dalam komentar. Ini memberikan 9 peringatan kompiler ketika membangun pada Mac dengan dentang dan opsi default:
209 byte, menggunakan beberapa saran dari komentar oleh Martin. Kompilasi tanpa peringatan dengan dentang:
Versi asli, 237 byte:
Hasil (256x256):
Kode asli dengan spasi putih untuk keterbacaan yang lebih baik:
Ini tidak menggunakan perpustakaan grafik, rendering sepenuhnya terkandung dalam kode.
Ide dasarnya adalah dengan hanya mengulang semua 256x256 piksel, dan melihat apakah mereka berada di dalam / di luar lingkaran melingkar dari sub-square 32x32 mereka berada. 5 bit bawah dari keseluruhan koordinat piksel menentukan koordinat relatif dari piksel dalam sub-square. Tes dalam / luar
(x, y)
berada di dalam busur dengan jari-jarir
adalah standar:Sebagian besar logika adalah untuk menempatkan pusat busur di sudut yang benar dari sub-square, dan menentukan warna mana yang ada di dalam / di luar.
Beberapa komentar tentang solusinya:
sumber
int a,b,c,d,x,y;
... Saya pikir Anda bahkan mungkin bisa melakukannya,main(a,b,c,d,x,y)
saya ingat sesuatu yang tipe defaultnya int. Setelah Anda menyingkirkan itu, Anda dapat memindahkan tugas ke d, x dan y kefor
pernyataan kenaikan bagian dalam sepertid=c+32&64,...,++c
(bahkan mungkin memindahkan++
ke tempat lain di mana Anda sebutkanc
), dan kemudian Anda dapat menghilangkan kawat gigi dari batinfor
. Kerja bagus, btw! :)main()
adalah patuh pada standar. Saya tentu harus mengelompokkan deklarasi. Dan memindahkan kenaikan akan menghemat beberapa byte juga. Untukputs()
baris baru ada di lingkaran luar, jadi saya tidak yakin apakah saya bisa menyingkirkan kawat gigi.stdio
tidak diperlukan, gunakan deklarasi fungsi standar.int
adalah standar untuk global dan dapat dihilangkan (variabel dan utama). Pertamaputs
bisa masuk ke dalam untuk. c var tidak digunakan di dalam lingkaran dalam, jadi kenaikan kondisinya. 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("");}}
(kompilasi dengan banyak peringatan tetapi berjalan)