Menggambar jaring 3d - padatan Platonis

14

Ini adalah versi dasar dari Menggambar 3d 3d yang agak lebih sulit - Archimedean solids .

Saya memiliki kelemahan untuk jaring 3d yang ketika dipotong dan dilipat memungkinkan Anda untuk membuat bentuk 3d dari kertas atau kartu. Tugasnya sederhana, tulislah program terpendek yang dapat Anda ambil jaring untuk 5 padatan Platonis. Outputnya harus berupa file gambar dalam format apa pun yang Anda pilih (png, jpg, dll.).

Kelima bentuk dijelaskan di http://en.wikipedia.org/wiki/Platonic_solid . Jaring mereka terlihat seperti ini (diambil dari http://www.newscientist.com/gallery/unfolding-the-earth/2 ).

masukkan deskripsi gambar di sini

Input: Integer dari 1 hingga 5. Asumsikan bentuk diberi nomor sesuai jumlah sisi yang dimilikinya. Jadi, 1 akan menjadi tetrahedron dan 5 icosahedron.

Keluaran: File gambar berisi jaring untuk bentuk itu. Hanya garis besar termasuk garis internal adalah OK. Tidak perlu mengisinya dengan warna

Anda dapat menggunakan bahasa pemrograman apa pun yang Anda suka serta perpustakaan apa pun yang tidak dibuat khusus untuk kompetisi ini. Keduanya harus tersedia secara bebas namun (dalam kedua pengertian) online.

Saya akan menerima jawabannya dengan jumlah karakter terkecil dalam waktu tepat satu minggu.

Pemenang. Hanya satu peserta tapi itu luar biasa. Pemenangnya adalah ... Raufio untuk apa kode golf favorit saya.

felipa
sumber

Jawaban:

8

Python, 456 429 381

import turtle as t
L="fl"
R="fr"
d=L*3+R*3
b=(d+R)*3
a=[b,120,L*3+"fflflffflflfrflflfffl"+R*4+"flf",90,b+"ffrfrflffrffrfrfrflflf",120,(R*5+L*5+R+L)*5+"rrfr"+L*5+R*2+L*2+R*4+"f",72,(d+"f")*5+"rfl"+((d+"b")*5)[:-1],120]
l=t.lt
f=t.fd
b=t.bk
r=t.rt
p=input()*2-2 
t.setup(.9,.9)
t.goto(-200,150)
t.clear()
for c in a[p]:exec c+"(a[p+1])"
t.getscreen().getcanvas().postscript(file="o")

Saya menerapkan penerjemah primitif dengan l r f bsebagai operator yang menggerakkan kursor penyu di sudut bentuk. Pada satu waktu, ternyata hanya satu sudut. Saya mengompresi string dengan menggunakan kembali string (semacam psuedo-subroutines), selain itu, saya tidak memeriksa untuk melihat apakah saya menggunakan jalur terbaik. Ini output ke file postscript.

Sedikit penjelasan tentang kode yang tidak di-golf:

import turtle as t
Left="fl"
Right="fr"
diamond= Left*3 + Right*3
tetrahedron=(d+R)*3 #used to be b

Impor modul penyu bawaan dan tentukan makro yang memperpendek string. Modul kura-kura menggunakan perintah untuk memindahkan 'kura-kura' di sekitar layar (yaitu maju (100), kiri (90))

netList=[
   #tetrahedron
   tetrahedron,120,
   #cube
   Left*3+"fflflffflflfrflflfffl"+Right*4+"flf",90,
   #octohedron, builds off the tetrahedron
   tetrahedron+"ffrfrflffrffrfrfrflflf",120,
   #dodecahedron
   (Right*5 + Left*5 + Right + Left)*5
    +"rrfr"+
    Left*5 + Right*2 + Left*2 + Right*4 + "f",72,
   #icosahedron
   (diamond+"f")*5 +"rfl"+((diamond+"b")*5)[:-1],120
]

Daftar ini berisi sudut dan urutan gerakan. Tetrahedron diselamatkan untuk digunakan kembali dengan oktahedren.

l=t.left
f=t.forward
b=t.back
r=t.right

Ini adalah bagian yang saya suka, itu membuat fungsi lokal karakter tunggal sehingga panggilan dapat dipersingkat dan otomatis melalui string yang telah ditentukan.

input=int(raw_input())*2-2 
t.setup(.9,.9)
t.goto(-200,150)
t.clear()

Ini dimulai dengan mengambil input (antara 1 dan 5), dan mengubahnya menjadi indeks yang menunjuk ke string bentuk di netList. Penyetelan penyetelan ini menunjukkan seluruh jaring. Ini bisa ditinggalkan jika tugas itu hanya untuk menggambar mereka, tetapi karena kita membutuhkan output gambar mereka diperlukan.

for command in netList[input]:
    exec command+"(netList[input+1])"
t.getscreen().getcanvas().postscript(file="o")

For loop mengambil perintah dalam string urutan perintah dan mengeksekusinya, jadi untuk string seperti "fl", ini mengeksekusi "maju (sudut); kiri (sudut);" dengan memanggil fungsi lokal yang baru dibuat. baris terakhir menampilkan file yang disebut 'o' yang dalam format format postscript menggunakan fungsi penyu.

Untuk berlari :

Salin ke file dan jalankan dari sana. Ketika Anda menjalankannya, ia akan menunggu input angka antara 1 dan 5 (saya baru saja mengubahnya sehingga ia meminta sebelum menyiapkan kura-kura). Saat Anda memasukkan angka, sebuah jendela muncul dan menarik jaring. jika Anda ingin lebih cepat, Anda dapat menambahkan t.speed(200)sebelumnya setup.

Anda dapat menyalin-menempelkannya ke dalam juru bahasa, tetapi ketika raw_input()dipanggil, ia akan menggunakan string yang Anda masukan berikutnya"t.setup(.9,.9)" sebagai ganti nomor. Jadi, jika Anda melakukan ini, salin hingga raw_input(), masukkan nomor, lalu salin tempel sisanya. Ini dimaksudkan untuk dijalankan secara keseluruhan. Atau Anda bisa menyalinnya ke suatu fungsi dan menyebutnya.

Ini adalah outputnya (dikonversi dari postscript):

Catatan: posisi ini di jendela telah berubah, tetapi bentuk keseluruhannya sama.

segi empat kubus segi delapan pigura berduabelas segi icosahedron

Ini sedikit kekuatan kasar untuk golf kode, tapi saya bosan mencoba menemukan pola yang konsisten antara bentuk.

Raufio
sumber
Sangat dekat. Dodecahedron jelas lebih rumit.
felipa
@Raufio Sangat bagus. Apakah tidak mungkin untuk mendefinisikan segitiga (atau persegi atau pentagon) dan kemudian hanya memutar / memindahkannya? Atau apakah itu efektif yang telah Anda lakukan?
felipa
Secara efektif, ya itulah yang saya lakukan, tetapi dengan bentuk yang lebih besar. Misalnya, icosahedron ditarik dengan menggambar dua segitiga, satu di atas yang lain, dan bergerak maju 5 kali, lalu mengatur ulang di lokasi baru, menggambar berlian lagi bergerak mundur lalu ulangi 5 kali. dadalah string yang melakukan dua segitiga, jadi(d+'f')*5+setupPosition+(d+'b')*5
Raufio
@Raufio Kode golf tidak berfungsi untuk saya. Ini membuka jendela yang sebagian besar kosong. Jika saya kemudian tekan kembali saya mendapatkan p = (ord (raw_input ()) - 49) * 2 TypeError: ord () mengharapkan karakter, tetapi untai panjang 0 ditemukan
felipa
1
@felipa setupmembuat jendela kura-kura menjadi cukup besar untuk menahan jaring. Hal yang sama dengan gotoitu, memindahkan 'kura-kura' ke -200, 150. clearmembersihkan garis yang dibuat oleh goto. Hanya perintah mereka untuk mengatur gambar. p=(ord(raw_input())-49)*2mengambil angka, 1 hingga 5, sesuai dengan bentuk apa yang Anda inginkan.
Raufio
6

Mathematica

Keluar dari kompetisi, bukan bahasa gratis (kecuali uji coba gratis dianggap gratis)

f[n_] := PolyhedronData[ Sort[PolyhedronData["Platonic", {"FaceCount","StandardName"}]][[n,2]],
                                                                                       "NetImage"]

Pemakaian:

f /@ Range@5

Grafik Mathematica

Belisarius
sumber
1
Mathematica jelas tidak gratis dalam arti baik. Jawaban yang sangat bagus.
felipa
@felipa gratis seperti bir di Raspberry Pi.
shrx
Anda tahu, di komputer gratis itu, pi raspberry
undergroundmonorail
6

Python 2 (dengan cairo) - 239

from cairo import*
s=PSSurface(None,99,99)
g=Context(s)
g.move_to(30,20)
a=str([34,456,3455,568788,3454445555][input()-1])
f=6.28
for c in a+a[::-1]:exec'g.rel_line_to(8,0);g.rotate(f/int(a[0]));'*int(c);f=-f
g.stroke()
s.write_to_png('o')

Hasil:

hasil

aditsu berhenti karena SE adalah JAHAT
sumber
3

Logo, 199 byte

TO p:d:n:s
rt :n*45 for[i 1 :n/8][pu setxy :d*:i 0 pd repeat 2[for[k 1 :s*2+2][fd 40 rt (360-720*(:k>:s))/:s] rt 720/:s]]END
TO q:j
apply "p item :j [[70 9 3][56 23 4][70 16 3][105 26 5][40 42 3]]END

Membaca ini kembali saya melihat versi asli saya tidak sesuai dengan spesifikasi seperti yang tertulis (mengambil argumen numerik dan menggambar satu bentuk) tetapi lebih seperti ditafsirkan oleh beberapa jawaban lain (menggambar semua bentuk.) Versi baru memperbaikinya. Diharapkan akan dipanggil sebagai contoh q 5.csharus dilakukan sebelumnya untuk membersihkan layar dan mengarahkan kura-kura utara.

qmemanggil fungsi utama pdengan 3 argumen. Sintaksnya sangat membengkak, jadi untuk mengalahkan skor saya sebelumnya, saya harus memotong byte di tempat lain.

versi baru dari pmembutuhkan 3 argumen. Tidak perlu untuk xdan ykarena kami hanya merencanakan satu jaring, tetapi dnada antara subunit tetap. s masih jumlah sisi per poligon, dan nsekarang dikodekan untuk dua hal berbeda> n/8adalah jumlah subunit yang akan diplot, dan n*45merupakan sudut di mana kura-kura harus diputar sebelum mulai (mengambil keuntungan dari mod 360 alami untuk rotasi. )

Perulangan yang ditingkatkan menghasilkan sgaris gambar dengan rotasi tangan kanan dan s+2garis dengan rotasi kiri dalam satu loop tunggal.

juru bahasa calormen tampaknya kurang toleran terhadap ruang kosong yang hilang sekarang daripada pada saat posting pertama saya, tetapi kode tersebut berjalan dengan baik di http://turtleacademy.com/playground/en

Logo, 200 byte

TO p:x:y:d:n:s
for[i 1:n][pu setxy:x:y-:d*:i if:i<>6[pd]repeat 2[repeat:s[fd 40 rt 360/:s]repeat:s+2[fd 40 lt 360/:s]rt 720/:s]]END
p 0 200 40 7 3
p 70 0 80 2 3
p -200 200 105 3 5
rt 45
p 90 90 56 2 4

Penerjemah di http://www.calormen.com/jslogo/# Diasumsikan kura-kura menunjuk ke Utara sebelum program dijalankan. Gunakan csperintah untuk menghapus layar, arahkan kura-kura ke utara, dan letakkan di tempat asal di tengah layar.

masukkan deskripsi gambar di sini

Unit dasar dari semua jaring di atas adalah sepasang poligon dari belakang ke belakang. Ini diatur dalam 2 baris terhuyung-huyung, membuat subunit 4 poligon yang dapat diterjemahkan secara vertikal untuk membuat semua jaring (kecuali octahedron, yang menumpang pada gambar icosahedron dan tetrahedron). Subunit membentuk 1 jaring tetrahedron, 1/5 dari jaring icosahedron, 1/3 dari jaring dodecahedron dan 2/3 dari jaring kubus (dua subunit ditarik, dengan dua kotak tengah tumpang tindih.)

Kode tidak dikunci

TO p :x :y :d :n :s                 ;x,y=starting point d=negative vertical offset for each iteration n=#of iterations s=# of sides on polygon
  for[i 1 :n][                      ;iterate n times 
    pu                              ;pen up
    setxy :x :y- :d* :i             ;move pen to start of iteration
    if :i<>6[pd]                    ;pen down (supressed for i=6 to enable part of octahedron to be drawn with icosahedron)
    repeat 2[                       ;draw lower row of 2 polygons, then upper row of 2 polygons
      repeat :s[fd 40 rt 360/ :s]   ;starting at lower left of polygon facing up, draw righthand polygon
      repeat :s+2[fd 40 lt 360/ :s] ;starting at lower right of polygon facing up, draw lefthand polygon, duplicating last two sides
      rt 720/ :s                    ;return turtle to upwards facing in order to draw second row
    ]
  ]
END
cs
p 0 200 40 7 3                      ;draw icosahedron and left side of octahedron (6th iteration is suppressed)
p 70 0 80 2 3                       ;draw right side of octahedron, and tetrahedron
p -200 200 105 3 5                  ;draw dodecahedron
rt 45                               ;turn turtle in preparation for drawing cube
p 90 90 56 2 4                      ;draw cube
Level River St
sumber
@phase haha, terima kasih, saya sebenarnya mempertimbangkan htuntuk menyembunyikannya untuk gambar. Saya senang saya tidak melakukannya!
Level River St