Koordinat keluaran dari simpul kubus. Kemudian, buatlah daftar dua belas segitiga yang akan menutupi kubus, setiap segitiga menjadi daftar tiga indeks-simpul, yang berorientasi secara konsisten. Output harus berupa string ASCII dengan angka desimal yang berbeda. Golf ini tidak memiliki input. Pemenang adalah karakter paling sedikit, di mana set karakter adalah Unicode.
Sebagai contoh, pertimbangkan kubus 1x1x1 terpojok pada 0,0,0. Delapan simpul kubus dapat dijelaskan oleh koordinat xyz berikut pada kisi Cartesian 3d:
x y z = (0,0,1) (1,0,1) (1,1,1) (0,1,1) (0,0,0) (1,0,0) (1,1,0) (0,1,0)
Setiap simpul dapat diberi indeks: x y z->index: 0 0 1->0, 1 0 1->1, 1 1 1->2, 0 1 1->3, 0 0 0->4, 1 0 0->5, 1 1 0->6, 0 1 0->7
Sekarang perhatikan wajah teratas, verteks diindeks nol ke tiga. Dua segitiga penutup dapat dijelaskan oleh tiga indeks masing-masing:
[0,1,2] [2,3,0]
Ini adalah gambar wajah atas ini, dilihat dari atas kubus:
3_____2
| /|
| / |
| / |
| / |
0_____1
Dan ini adalah pemandangan dari sudut pandang.
3____2
/ __-/|
0/_`__1 |
| | /6
|____|/
4 5
Perhatikan orientasi, atau 'belitan', dari kedua segitiga ini adalah 'berlawanan arah jarum jam' bila dilihat dari 'luar' kubus yang langsung melihat wajah yang dipermasalahkan (bayangkan mengunjungi setiap simpul sebagaimana tercantum, ia berlawanan arah jarum jam). Sekarang bayangkan ini dilakukan untuk semua enam sisi kubus.
vertices: (0,0,1) (1,0,1) (1,1,1) (0,1,1) (0,0,0) (1,0,0) (1,1,0) (0,1,0)
triangles as indices: [0,1,2], [2,3,0], [6,5,4], [4,7,6],
[5,2,1], [2,5,6], [0,3,4], [4,3,7], [2,6,3], [3,6,7], [0,4,1], [1,4,5]
Anda dapat menampilkan berbagai ukuran kubus yang terletak di koordinat apa pun. Anda dapat memberi nomor dan memesan koordinat titik sesuai keinginan Anda. Indeks dapat berbasis 0 atau berbasis 1. Orientasi segitiga bisa searah jarum jam atau berlawanan arah jarum jam jika dilihat dari luar kubus selama itu konsisten untuk semua segitiga.
Output dapat diformat sesuai keinginan Anda, selama setiap angka desimal ASCII dipisahkan oleh setidaknya satu karakter ASCII non-numerik. Sebagai contoh, contoh di atas juga bisa berupa output sebagai berikut:
0 0 1 1 0 1 1 1 1 0 1 1 0 0 0 1 0 0 1 1 0 0 1 0
0 1 2 2 3 0 6 5 4 4 7 6 5 2 1 2 5 6 0 3 4 4 3 7 2 6 3 3 6 7 0 4 1 1 4 5
Golf ini terinspirasi oleh berbagai sistem dan format grafik 3d, termasuk OpenGL, OBJ, OFF, AMF, CGAL, dll. Golf ini mirip dengan golf oleh Hobi Calvin bernama Output a Face on a Numbered Cube , perbedaan besar yang Anda butuhkan untuk menghasilkan koordinat xyz dari simpul sendiri dan indeks output segitiga. Terima kasih sudah membaca.
Per inspirasi pengguna di sini adalah program validasi "pembantu" dalam python2 (non-golfy) yang akan mencetak 'ok' atau 'tidak ok' untuk data keluaran uji dalam variabel vertstr dan idxstr. Itu tidak berfungsi dengan baik ... tetapi dapat menangkap beberapa kesalahan.
Edit: contoh kesalahan tetap dan bug dalam kode validasi.
#vertstr = '0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 0 0 1 1 1'
#idxstr = '1 2 0 2 1 3 7 5 6 4 6 5 2 4 0 4 2 6 7 3 5 1 5 3 4 1 0 1 4 5 7 6 3 2 3 6'
vertstr = '0 0 1 1 0 1 1 1 1 0 1 1 0 0 0 1 0 0 1 1 0 0 1 0'
idxstr = '0 1 2 2 3 0 6 5 4 4 7 6 5 2 1 2 5 6 0 3 4 4 3 7 2 6 3 3 6 7 0 4 1 1 4 5'
vektor kelas:
def __init __ (mandiri, v):
self.x, self.y, self.z = v [0], v [1], v [2]
def __add __ (self, v):
return Vector ([self.x + vx, self.y + vy, self.z + vz])
def __sub __ (mandiri, v):
return Vector ([self.xv.x, self.yv.y, self.zv.z])
def __str __ (mandiri):
return str (self.x) + ',' + str (self.y) + ',' + str (self.z)
lintas silang (v1, v2):
x = v1.y * v2.z-v2.y * v1.z
z = v1.x * v2.y-v2.x * v1.y
y = v1.z * v2.x-v2.z * v1.x
return Vector ([x, y, z])
# http://mathforum.org/library/drmath/view/55343.html & http://sympy.org
def berliku (v1, v2, v3, obs):
x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4 = v1.x, v1.y, v1.z, v2.x, v2.y, v2.z, v3. x, v3.y, v3.z, obs.x, obs.y, obs.z
d = x1 * (y2 * z3 - y2 * z4 - y3 * z2 + y3 * z4 + y4 * z2 - y4 * z3)
d = d + y1 * (- x2 * z3 + x2 * z4 + x3 * z2 - x3 * z4 - x4 * z2 + x4 * z3)
d = d + z1 * (x2 * y3 - x2 * y4 - x3 * y2 + x3 * y4 + x4 * y2 - x4 * y3)
d = d - x2 * y3 * z4 + x2 * y4 * z3 + x3 * y2 * z4 - x3 * y4 * z2 - x4 * y2 * z3 + x4 * y3 * z2
kembali d
normals def (v1, v2, v3):
va = v2-v1
vb = v3-v2
vc = v1-v3
n1 = silang (va, vb)
n2 = silang (vb, vc)
n3 = silang (vc, va)
return [n1, n2, n3]
def triplify (str):
nums, tiga kali lipat = [], []
untuk num di str.split (''): nums + = [int (num)]
untuk saya dalam kisaran (0, len (nums), 3):
tiga kali lipat + = [[num [i], num [i + 1], num [i + 2]]]
tiga kali lipat kembali
verts = triplify (vertstr)
indeks = triplify (idxstr)
nsum = Vektor ([0,0,0])
windsum = 0
xs, ys, zs = [], [], []
untuk v in verts:
xs + = [v [0]]
ys + = [v [1]]
zs + = [v [2]]
# print xs, ys, zs, len (xs)
center = Vektor ([float (jumlah (xs)) / len (xs), float (jumlah (ys)) / len (ys), float (jumlah (zs)) / len (zs)])
untuk segitiga dalam indeks:
v1 = Vektor (verts [segitiga [0]])
v2 = Vektor (verts [segitiga [1]])
v3 = Vektor (verts [segitiga [2]])
norma = normal (v1, v2, v3)
cetak v1, v2, v3, norma [0], norma [1], norma [2]
untuk n dalam norma:
nsum + = n
w = belitan (v1, v2, v3, tengah)
cetak 'berliku', w
jika w <0: windsum- = 1
elif w> 0: windsum + = 1
if abs (windsum) == 12: print 'winding ok'
lain: cetak 'berliku tidak ok'
if (nsum.x == 0 dan nsum.y == 0 dan nsum.z == 0): cetak 'jumlah normal ok'
lain: cetak 'jumlah normal bukan ok'