Tile pesawat dengan lingkaran yang dimodifikasi ini

22

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:

lingkaran tessellation

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.

Hobi Calvin
sumber

Jawaban:

4

gs2, 49 bytes

50 31 05 0d 1f 2a 48 0a 1e 2e 40 83 2c e8 64 2d
1e 73 ed 1e 33 40 20 30 9a a2 22 e8 e9 40 20 30
9a 30 40 20 30 ee 40 20 30 12 32 e9 12 32 55 e8
2b

Menghasilkan gambar PBM:

keluaran

Ilmu tentang cara menghafal:

# Print header
"P1" space 256 double
2dup new-line

# Make 1/4 circle
64 range dup cartesian-product
square m1 sum sqrt 64 >= m6
64 /

# Make tile
dup reverse + transpose
@2 not m1 m2
dup reverse + transpose
+

# Make quarter of image
dup reverse + z1
dup reverse +

# Loop
2 * m2
2 *

# Format
show-words m1
unlines
Lynn
sumber
36

POV-Ray, 199 163

Old version
camera{location -9*z}light_source{-9*z}#declare L=union{#for(X,-9,9,2)#for(Y,-9,9,2)cylinder{X*x+x+Y*y,<.001*pow(-1,(X+Y)/2),0,.1>+X*x+x+Y*y,1}#end#end}object{L pigment{color x}}object{L rotate z*90}

Same output, but golfed down further by using default light/camera, so I dont even need to specify them
#declare L=union{#for(X,-9,9,2)#for(Y,-9,9,2)cylinder{<X+1,Y,9>,<.001*pow(-1,(X+Y)/2),0,.1>+<X+1,Y,9>,1}#end#end}object{L pigment{color rgb x}rotate z*90}object{L}

masukkan deskripsi gambar di sini
Saya menggunakan sebanyak mungkin parameter default untuk kamera dan sumber cahaya, itu sebabnya agak gelap. Mari kita ungolf dulu

camera{location 9*z look_at 0}
light_source{9*z color 1} 
#declare L=union{
    #for(X,-9,9,2)
        #for(Y,-9,9,2)
            cylinder{<1+X,Y,0>,                                 //central axis, start
                     <1+X,Y,0> + <.001*pow(-1,(X+Y)/2), 0, .1>, //central axis, end
                      1}                                        //radius
        #end         
    #end
}                         
object{L pigment{color x}} // x is the <1,0,0> vector, here interpreted as RGB
object{L rotate<0,0,90>}

Jelas apa yang terjadi setelah kami meningkatkan offset sumbu silinder dan mengubah perspektif

masukkan deskripsi gambar di sini

DenDenDo
sumber
1
Bukankah ujungnya akan sedikit terdistorsi berkat perspektif 3d?
orlp
6
Dengan ketinggian 0.1dan offset 0.001disk 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.
DenDenDo
@DenDenDo apakah pov-ray tidak dapat menempatkan kamera pada jarak tak terbatas?
Random832
@ Random832 bisa, dengan camera{orthographic location -9z}. Tetapi karena adegan ini pada dasarnya 2D tidak ada bedanya, Anda bahkan dapat membuatnya dengan tampilan angle 170tanpa distorsi mata ikan di hasilnya.
DenDenDo
11

Gnuplot, 182

Saya perhatikan bahwa batas antar sel terlihat sangat sinusoidal, jadi saya mencari solusi analitik dengan persamaan inti yang sangat sederhana
masukkan deskripsi gambar di sini

set view map
set isosamples 900
f(x,y)=.3*sin(x*3.14)+y
splot(ceil(f(x,y))+ceil(f(y,x)))%2?1:NaN   #can only modulo integers

masukkan deskripsi gambar di sini
Meskipun terlihat serupa, lingkarannya terlalu persegi. Dengan ide yang sama, saya menggantinya sindengan kurva yang terbuat dari lingkaran quartercircle-concatenated dan memutarnya 45 ° dengan mengganti xdan ydengan x+ydanx-y

set view map
set samples 800
set isosamples 800
d=.5**.5
c(x,k)=(-1)**k*sqrt(1-(x-d*(1+2*k))**2)-(-1)**k*d  # k-th circle arc
# s(x)=c(x,floor(x/d/2))                           # circlified sinus
# f(x,y)=d*s(x/d)+y
f(x,y)=d*c(x/d,floor(x))+y                         # combined commented functions
splot(ceil(f(x+y,x-y))+ceil(f(x-y,x+y)))%2?1:NaN

masukkan deskripsi gambar di sini

DenDenDo
sumber
9

Konteks Gratis, 99 byte

startshape d CF::Tile=[s 4]CF::Symmetry=CF::pmg,0,1,0path d{ARCTO(-1,1,1)ARCTO(1,1,-1)ARCTO(0,0,1)}

Anda dapat melihat hasilnya di Galeri Gratis Konteks .

MtnViewJohn
sumber
Bagus, itu penggunaan luar biasa dari Context Free. :)
Martin Ender
7

HTML + JavaScript, 277

<canvas id=C></canvas><script>r=50,C.width=C.height=9*r,T=C.getContext('2d');
for(f=1,P=Math.PI,i=0;i<45;f=-f,i+=i&7?1:2)x=2*r*(i%8-2),y=2*r*(i>>3),T.moveTo(x,y+f*r),
T.arc(x+r,y+f*r,r,P,-f*P/2,f<0),T.arc(x,y,r,0,P,f>0),T.arc(x-r,y+f*r,r,-f*P/2,0,f<0);
T.fill()</script>

Untuk menguji, simpan sebagai file html dan buka dengan browser. Atau yang lain, jalankan cuplikan

r=50,C.width=C.height=9*r,T=C.getContext('2d')
for(f=1,P=Math.PI,i=0;i<45;f=-f,i+=i&7?1:2)
  x=2*r*(i%8-2),y=2*r*(i>>3),
  T.moveTo(x,y+f*r),
  T.arc(x+r,y+f*r,r,P,-f*P/2,f<0),
  T.arc(x,y,r,0,P,f>0),
  T.arc(x-r,y+f*r,r,-f*P/2,0,f<0)
T.fill()
<canvas id=C></canvas>

Karena permintaan yang populer, di sini adalah gambar output. Lagipula tidak begitu menarik ...

Ubin

edc65
sumber
1
Anda mungkin ingin memposting gambar sehingga kode tidak harus dijalankan setiap kali seseorang ingin melihat hasilnya.
Hobi Calvin
@ CalvinHobbies oh well itu cukup cepat dan berjalan di setiap browser modern. Saya akan membuat gambar lebih besar
edc65
Itu benar. Saya pikir ini digunakan =>seperti banyak posting Anda dan hanya akan berfungsi di Firefox. Tapi jangan khawatir.
Calvin Hobi
1
Alasan yang lebih baik untuk memposting gambar: Cuplikan ini tidak berfungsi dengan baik di seluler :(
Sp3000
6

IDL 8.3, 201 193 183 byte

Gambar dikeluarkan ke jendela grafis IDL; Saya mengambil tangkapan layar, di bawah.

EDIT: terima kasih kepada @AlexA. dan @ Sp3000 untuk membantu saya mencukur beberapa byte

p=!pi/99*[0:99]
q=p[49:0:-1]
o=p[99:50:-1]
window,xs=(ys=400)
for i=0,24 do cgpolygon,i mod 5*100+50*[cos(p),cos(q)-1,cos(o)+1],i/5*100+(-1)^i*50*[sin(p),sin(q)-1,sin(o)-1],/d,/fi
end

masukkan deskripsi gambar di sini

Sirpercival
sumber
6

Mathematica: 86 byte (atau 82 byte)

Berkat infinite @alephalpha untuk metode berbasis array yang pintar:

Image@ArrayFlatten@Array[DiskMatrix@32~RotateLeft~32/.a_/;OddQ@+##:>1-Thread@a&,{5,5}]

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, ArrayFlattenbergabung bersama ubin dan Imagemenampilkannya.

Perhatikan penggunaan yang lebih pendek Threaduntuk mengganti Transpose. Kita masih dapat menyimpan 4 byte dengan menggunakan simbol transpos sebagai gantinya.

Sebelumnya: 97 byte (atau 90 byte)

Image@ArrayFlatten@Partition[
 Join@@Table[{#,1-Transpose@#}&@RotateLeft[DiskMatrix@32,32],{13}],5]

Anda dapat mengurangi jumlah byte dengan mengganti Transpose@#dengan simbol superscript-t (codepoint U + F3C7, pintasan ESCtrESC). Dalam UTF-8 yang membawa total hingga 90 byte dalam 88 karakter .

masukkan deskripsi gambar di sini

Kita mulai dengan DiskMatrix, yang menghasilkan matriks biner:

DiskMatrix@32 // Image

masukkan deskripsi gambar di sini

Kami kemudian menggeser-geser baris matriks untuk menghasilkan sel satuan untuk ubin:

RotateLeft[DiskMatrix@32, 32] // Image

masukkan deskripsi gambar di sini

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 -> 0dan 1 - 0 -> 1), dan memutar dengan mengambil transpos:

Image /@ {#, 1 - Transpose@#} &@RotateLeft[DiskMatrix@32, 32]

masukkan deskripsi gambar di sini

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 menggunakan Tableuntuk membuat daftar 13pasangan ubin hitam / putih, dan Joinuntuk meratakan daftar pasangan ke daftar 26 ubin. Kemudian kita Partitiondaftar menjadi 5oleh 5matriks ubin ( Partitionmembuang trailing 26 th genteng):

Map[Image] /@ 
  Partition[
   Join @@ Table[{#, 1 - #\[Transpose]} &@
      RotateLeft[DiskMatrix@32, 32], {13}], 5] // MatrixForm

masukkan deskripsi gambar di sini

Akhirnya ArrayFlattenmengubah matriks matriks ubin menjadi matriks datar, dan Imagemenampilkan hasilnya.

Sebelumnya: 111 byte

Image[ArrayFlatten[{{#, #}, {#, #}}] &[
  Join[#, Reverse@#, 2] &[
   Join[1 - Transpose@#, #] &@RotateLeft[DiskMatrix[32], 32]]]]

masukkan deskripsi gambar di sini

2012 Arcampion
sumber
Image@ArrayFlatten@Array[RotateLeft[DiskMatrix@32,32]/.a_/;OddQ[+##]:>1-Thread@a&,{5,5}]
alephalpha
4

Java, 550 540 508 504 byte

Ini adalah applet java.

import java.awt.*;public class T extends java.applet.Applet{int a=98,b=49,x,y;public void paint(Graphics g){for(x=0;x<5;x++)for(y=0;y<5;y++)a(g.create(x*a,y*a,a,a),x%2^y%2);}void a(Graphics g,int c){if(c>0){g.translate(a,0);((Graphics2D)g).scale(-1,1);}g.setColor(Color.red);g.fillRect(0,0,b,b);g.fillRect(b,b,b,b);g.setColor(Color.blue);g.fillRect(b,0,b,b);g.fillRect(0,b,b,b);g.fillArc(0,-b,a,a,180,90);g.fillArc(0,b,a,a,0,90);g.setColor(Color.red);g.fillArc(-b,0,a,a,0,-90);g.fillArc(b,0,a,a,90,90);}}

Diperluas dengan boilerplate:

import java.awt.*;
public class T extends java.applet.Applet{
    int a = 98, b = 49, x, y; //Make these larger for better quality pictures. a = b * 2
    public void paint(Graphics g) {
        for (x=0; x < 5; x++)      //Make these larger for more tiles.
            for (y=0; y < 5; y++)  //
                a(g.create(x * a, y * a, a, a), x % 2 ^ y % 2);
    }

    void a(Graphics g, int c) {
        if (c > 0) {
            g.translate(a, 0);
            ((Graphics2D) g).scale(-1, 1);
        }
        g.setColor(Color.red);            //Change colors for nicer looking colors.
        g.fillRect(0, 0, b, b);
        g.fillRect(b, b, b, b);
        g.setColor(Color.blue);
        g.fillRect(b, 0, b, b);
        g.fillRect(0, b, b, b);
        g.fillArc(0, -b, a, a, 180, 90);
        g.fillArc(0, b, a, a, 0, 90);
        g.setColor(Color.red);
        g.fillArc(-b, 0, a, a, 0, -90);
        g.fillArc(b, 0, a, a, 90, 90);
    }
}

Applet: Program aplikasi kecil yang dapat dipanggil untuk digunakan saat bekerja di aplikasi lain.

Contoh gambar:

masukkan deskripsi gambar di sini

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:

void a(Graphics g, int c) {
    g.setColor(Color.red);
    g.fillRect(0, 0, b, b);
    g.fillRect(b, b, b, b);
    g.setColor(Color.blue);
    g.fillRect(b, 0, b, b);
    g.fillRect(0, b, b, b);
    g.fillArc(0, -b, a, a, 180, 90);
    g.fillArc(0, b, a, a, 0, 90);
    g.setColor(Color.red);
    g.fillArc(-b, 0, a, a, 270, 90);
    g.fillArc(b, 0, a, a, 90, 90);
}

Namun, setiap ubin lain harus dipantulkan secara horizontal untuk menghasilkan gambar yang benar.

Untuk mencerminkan ubin, kami cukup memodifikasi graphicsobjek yang disediakan dengan kode ini:

g.translate(a, 0);
((Graphics2D) g).scale(-1, 1);

Terima kasih @CoolGuy untuk 4 byte.

TheNumberOne
sumber
1
Anda dapat bermain golf lebih banyak dengan mendeklarasikan xdan ysebagai bidang kelas:int a = 98, b = 49,x,y;
Spikatrix
4

Mathematica 299 256

Wordy 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.

r

a_~f~b_ := (x + a)^2 + (y + b)^2 <= 1;
a = ImageAssemble;
r = RegionPlot[(0~f~0 && y <= 0 && ! f[-1, 1]) \[Or] (0~f~2 && 
      y >= -2 && ! f[1, 1]), {x, -1, 1}, {y, -2, 0}, Frame -> False,
    BoundaryStyle -> None];
s = ImageCrop@Rasterize@r;
t = s~ImageReflect~Right;
i = a@{s, t};
j = a@{t, s};
a@{k = {i, i, i, i}, m = {j, j, j, j}, k, m, k, m}

ubin

DavidC
sumber
1

C, 237 209 180 byte

180 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:

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("");}}

209 byte, menggunakan beberapa saran dari komentar oleh Martin. Kompilasi tanpa peringatan dengan dentang:

#include <stdio.h>
int a,b,c,d,x,y;int main(){puts("P1 256 256");for(;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;++c)putchar(48+(x*x+y*y<962^b==d));puts("");}}

Versi asli, 237 byte:

#include <stdio.h>
int main(){puts("P1 256 256");for(int a=0;a<256;++a){int b=a+32&64;for(int c=0;c<256;++c){int d=c+32&64;int x=(a&64)-d?31-a&31:a&31;int y=(c&64)-b?c&31:31-c&31;putchar(48+(x*x+y*y<962^b==d));}puts("");}}

Hasil (256x256):

masukkan deskripsi gambar di sini

Kode asli dengan spasi putih untuk keterbacaan yang lebih baik:

#include <stdio.h>
int main()
{
    puts("P1 256 256");
    for (int a = 0; a < 256; ++a)
    {
        int b = a + 32 & 64;
        for (int c = 0; c < 256; ++c)
        {
            int d = c + 32 & 64;
            int x = (a & 64) - d ? 31 - a & 31 : a & 31;
            int y = (c & 64) - b ? c & 31 : 31 - c & 31;
            putchar(48 + (x * x + y * y < 962 ^ b == d));
        }
        puts("");
    }
}

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-jari radalah standar:

x * x + y * y < r * r

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:

  • Kode menghasilkan gambar dalam format PBM ASCII. Saya memuat hasilnya ke GIMP, dan melakukan copy & paste ke Paint untuk menghasilkan file aktual yang saya posting di sini. Jadi formatnya sudah dikonversi, tetapi isinya persis seperti keluaran aslinya.
  • Jika Anda perhatikan lebih teliti, Anda mungkin memperhatikan bahwa kualitasnya tidak bagus. Ini karena perhitungan di dalam / luar dilakukan untuk sudut pixel, bukan pusat pixel, menyebabkan semuanya menjadi 1/2 pixel off. Saya tidak berpikir itu akan sangat sulit untuk dilakukan lebih baik, tetapi itu akan membuat kode agak lebih lama. Dan karena tidak ada persyaratan kualitas khusus, saya yakin ini sudah cukup.
  • Kode dikompilasi menggunakan dentang pada Mac. Versi terbaru memberi peringatan, versi awal tidak.
  • Ini adalah pertama kalinya saya mencoba salah satunya, jadi saya mungkin melewatkan beberapa trik untuk menyelamatkan byte terakhir yang mungkin.
Reto Koradi
sumber
3
Selamat datang di PPCG! Saya bukan pegolf C besar, tapi saya pikir saya bisa melihat beberapa perbaikan: kelompokkan deklarasi Anda seperti 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 ke forpernyataan kenaikan bagian dalam seperti d=c+32&64,...,++c(bahkan mungkin memindahkan ++ke tempat lain di mana Anda sebutkan c), dan kemudian Anda dapat menghilangkan kawat gigi dari batin for. Kerja bagus, btw! :)
Martin Ender
Terima kasih! Saya melihat triknya dengan mendeklarasikan argumen tanpa mengetikkan daftar tips, tetapi tampaknya sangat kotor sehingga saya tidak bisa pergi ke sana. ;) Saya tidak berpikir memiliki argumen non-standar main()adalah patuh pada standar. Saya tentu harus mengelompokkan deklarasi. Dan memindahkan kenaikan akan menghemat beberapa byte juga. Untuk puts()baris baru ada di lingkaran luar, jadi saya tidak yakin apakah saya bisa menyingkirkan kawat gigi.
Reto Koradi
Kami biasanya oke dengan itu selama dikompilasi di beberapa kompiler umum (jadi tidak harus sepenuhnya standar C). Juga ya saya tidak berpikir Anda bisa menyingkirkan kawat gigi luar, tetapi Anda harus bisa, untuk menghapus kawat gigi bagian dalam.
Martin Ender
Turunkan ke 210 byte. Terima kasih atas idenya.
Reto Koradi
1
Petunjuk: stdiotidak diperlukan, gunakan deklarasi fungsi standar. intadalah standar untuk global dan dapat dihilangkan (variabel dan utama). Pertama putsbisa 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)
edc65