Sebuah epicycloid adalah kurva titik pada lingkaran membuat seperti gulungan sekitar lingkaran lain. Sebuah cyclogon adalah bentuk titik pada poligon beraturan membuat seperti gulungan di pesawat. Sebuah epicyclogon adalah kurva dilacak oleh titik pada satu poligon beraturan seperti gulungan sekitar lain.
Menulis sebuah program yang menarik sebuah epicyclogon diberikan r
, r1
, r2
, n1
, n2
:
r = number of clockwise revolutions rolling polygon makes around stationary polygon (any real number as limited by float values)
r1 = distance from center of stationary polygon to each of its vertices (positive real number)
r2 = distance from center of rolling polygon to each of its vertices (positive real number)
n1 = number of sides stationary polygon has (integer greater than 2)
n2 = number of sides rolling polygon has (integer greater than 2)
Catatan
- Bila
r
negatif, roller harus berlawanan arah jarum jam . - Sebab
r
, satu revolusi terjadi ketika garis yang menghubungkan centroid dari dua bentuk menyapu 360 derajat penuh. Gagasan ini diperluas untuk mencakup semua nilair
. (Jadi dalam seperempat revolusi garis yang menghubungkan centroid menyapu 90 derajat.) - Argumen ini harus berasal dari baris perintah atau program Anda harus meminta mereka (misalnya dengan Python
input()
). r1
danr2
relatif satu sama lain, bukan dimensi gambar. Jadi, Anda dapat mengatur satu "unit" menjadi sejumlah piksel aktual.
Poin yang harus Anda lacak adalah salah satu simpul dari bentuk penggulungan. Bentuk harus dimulai dengan titik ini menyentuh titik diam dan dua sisi yang berdekatan:
Verteks awal yang tepat dan sudut poligon stasioner tidak masalah.
Keluaran
Output harus pergi ke gambar yang setidaknya 600x600 piksel (atau beberapa dimensi variabel daripada yang dapat diatur ke 600). Itu harus menunjukkan seluruh kurva epicyclogon yang ditentukan oleh parameter, dibingkai dengan baik dalam gambar.
Poligon bergulir dan stasioner juga harus digambar (dengan roller dalam keadaan akhir itu). Dua bentuk dan epicyclogon haruslah tiga warna yang sangat berbeda.
Harus juga ada cara sederhana untuk tidak menggambar poligon (perubahan true
ke false
dalam kode sudah mencukupi).
Tolong tunjukkan kepada kami setidaknya 2 gambar output. Tidak masalah untuk mengecilkannya jika perlu.
Mencetak gol
Kode terpendek yang menghasilkan gambar output yang valid menang.
Bonus
- Mengurangi 50 byte jika outputnya berupa animasi gif (atau serupa) dari kurva yang sedang digambar.
- Minus 150 byte jika Anda membiarkan
n1
dann2
mengambil nilai 2 sehingga bentuk menjadi segmen garis panjang2 * r1
(ataur2
), "berguling" di sekitar satu sama lain. Bagaimana Anda menanganir
kapann1
dann2
2 tergantung Anda karena centroid tidak berputar satu sama lain seperti yang mereka lakukan dalam kasus lain. (Tidak "menggulung" sama sekali tidak termasuk penanganannya.)
Karena saya sangat ingin melihat ide novel ini dieksekusi dengan baik (dan itu bukan cakewalk), saya akan memberikan 150 perwakilan hadiah kepada pemenang. Kontes akan berakhir pada hari yang sama ketika hadiah habis.
Hadiah tidak akan diberikan kepada pemenang jika jelas bahwa mereka hanya menulis ulang sebagian besar kode dari pengajuan lain.
Fungsi perpustakaan yang sudah melakukan ini (jika ada) tidak diizinkan.
Catatan: Ini datang dari pertanyaan sisa saya yang bebas dikirim oleh siapa pun. Tetapi jika tidak ada orang lain yang mempostingnya, ada kemungkinan saya akan tepat waktu. : P
sumber
Jawaban:
MATLAB: 735 byte - 200 bonus = 535
Program saya menangani case n = 2 dan menggambar animasi real-time. Ada beberapa perbedaan antara versi golf dan ungolfed:
Versi ungolfed hanya memiliki opsi untuk menyimpan animasi ke file 'g.gif', dengan menetapkan
savegif = 1
kode. Secara default tidak aktif karena dapat mengganggu karena beberapa alasan:Penghematan gif harus dijatuhkan dalam versi golf karena memerlukan waktu sekitar 100 byte, melebihi ukuran bonus.Versi ungolfed menggambar lingkaran pada vertebra pelacak. Ini juga menghasilkan lebih banyak bingkai dan bergerak lebih cepat (meskipun ini dapat disesuaikan dalam versi golf dengan mengubah angka).
Sampel:
f(11,5,90,2,99,0)
setelah penghentian programepic(1.3,4,2,6,6,1)
dengan output gifKode tidak dikunci
Kode golf
Instruksi:
Simpan fungsi ke file dengan nama yang sama, yaitu
epic.m
atauf.m
. Jalankan dengan memanggil fungsi dari konsol Matlab.Penggunaan: di
epic(r, r1, r2, n1, n2, dispPoly)
manadispPoly
variabel Boolean (nol jika salah, angka bukan nol jika benar) menentukan apakah akan menggambar poligon.Sunting: Menambahkan bonus 50 untuk gambar animasi.
sumber
Java -
2.7262.634 - 200 = 2434 karakterDitingkatkan dari 3800 byte ish
Terima kasih untuk semua saran Anda (terutama pseudonim117), ini adalah versi baru.
Saya menambahkan kelas P yang merupakan kelas titik dan kelas L yang memperluas ArrayList
Saya juga menambahkan beberapa perubahan logika kecil.
Ini kelas utamanya (bukan golf):
Dan versi golfnya:
Serta kelas P:
Dan saya:
Ubah int d ke 0 atau 1 untuk menampilkan poligon
argumen - 1 100 50 5 2
args - 1.5 100 100 7 3
args - 2 40 100 3 7
sumber
r
benar-benar 50 dalam semua contoh Anda? Itu berarti roller berjalan sekitar 50 kali.RotatingPolygonsGolfed
dalam kode "golf" sementara itu hanyaRotatingPolygons
dalam kode normal. ;)Javascript, 1284 karakter (-200 = 1084 karakter)
Kode yang diperkecil adalah
Kode lengkapnya adalah
Sebuah biola untuk dilihat rutin dalam semua kemuliaan poligoni (dan untuk menunjukkan animasi) ditemukan di
http://jsfiddle.net/7rv751jy/2/embedded/result/
Script mendefinisikan fungsi yang disebut
epi
yang menerima lima parameter yang tercantum dalam OP.epi
mengembalikan fungsi dengan tanda tangan(e,t,isCCW,flags)
yang menerima argumen:e
- referensi ke elemen kanvas 600x600 HTML5 yang akan di-rendert
- sudut total (dalam radian) bahwa centroid dari poligon kedua harus menyapu sekitar centroid yang pertama. Argumen yang diteruskan tidak boleh melebihi 2 pi kali jumlah rotasi yang dilewatiepi
.isCCW
- boolean yang menunjukkan apakah jejak harus dilanjutkan dengan arah berlawanan arah jarum jam (berlawanan dengan arah jarum jam)flags
- satu set flag bit yang menunjukkan elemen mana yang harus direnderFungsi ini dapat dipanggil berapa kali dengan berbagai set argumen.
Beberapa Catatan:
Rutin menangani kasus yang merosot di mana
n1 = 2
dan / ataun2 = 2
. Saat menjiwai, kombinasi panjang tertentu akan menyebabkan kemajuan cepat yang mendadak dalam jejak. Ini karena frame animasi diindeks oleh sudut ke centroid dari poligon kedua, dan d theta poly2 / d theta centroid menjadi singular dalam kasus-kasus di mana centroid dari 2-sided poly 2 berada di dekat sebuah simpul 2-sided poly 1 Namun, ini tidak mempengaruhi jejak.Nama-nama parameter dalam
epi
akan tampak membingungkan karena selama pengembangan, saya menyebut poligon 1 sebagai "2", dan poligon 2 sebagai "1". Ketika saya menyadari ketidakkonsistenan antara konvensi saya dan OP, daripada menukar semua indeks dalam kode, saya hanya bertukar urutan argumen diepi
.Biola di atas mengimpor jQuery, tetapi ini untuk menangani UI. The
epi
Fungsi tidak memiliki dependensi perpustakaan.Kode ini menangani jejak CCW hanya dengan membalik sumbu Y. Ini agak tidak tepat karena poligon 2 dimulai pada posisi terbalik-Y selama jejak CCW, tetapi tidak ada yang mengatakan rutinitas harus elegan. ;)
sumber
nt = ~~(t*(r_>rC?r_:rC)+1)
untuknt = ~~(t*(r_>rC?r_:rC)/10+1)
dan harus mempercepat hal-hal sedikit.