Bir küpün köşelerinin çıktı koordinatları. Daha sonra, küpü kaplayacak on iki üçgenden oluşan bir liste çıkın, her üçgen sürekli olarak yönlendirilmiş üç köşe indeksinin bir listesidir. Çıktı, farklı ondalık sayıdan oluşan bir ASCII dizesi olmalıdır. Bu golfün girişi yok. Kazanan, karakter kümesinin Unicode olduğu en az karakterdir.
Örneğin, 0,0,0 ile köşeli 1x1x1 küpü düşünün. Küpün sekiz köşesi, 3d Kartezyen ızgarada aşağıdaki xyz koordinatları ile açıklanabilir:
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)
Her tepe noktasına bir dizin verilebilir: 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
Şimdi üst yüzü düşünün, tepe noktaları sıfırdan üçe endekslendi. İki kaplama üçgeni her biri üç endeks ile tanımlanabilir:
[0,1,2] [2,3,0]
İşte bu üst yüzün, küpün üstünden bakıldığında bir resmi:
3_____2
| /|
| / |
| / |
| / |
0_____1
Ve işte bir açıdan bakış açısı.
3____2
/ __-/|
0/_`__1 |
| | /6
|____|/
4 5
Bu üçgenin her ikisinin de oryantasyonuna veya 'sargısına' dikkat edin, doğrudan söz konusu yüze bakarak küpün 'dışından' bakıldığında (saat yönünün tersine gittiğini hayal edin). Şimdi bunun küpün altı tarafı için yapıldığını hayal edin.
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]
Herhangi bir koordinatta bulunan herhangi bir boyutta küp çıktısı alabilirsiniz. Tepe koordinatlarını istediğiniz gibi numaralandırabilir ve sipariş edebilirsiniz. Endeksler 0 tabanlı veya 1 tabanlı olabilir. Üçgenin yönü, tüm üçgenler için tutarlı olduğu sürece küpün dışından bakıldığında saat yönünde veya saat yönünün tersine olabilir.
Her ASCII ondalık sayısı en az bir sayısal olmayan ASCII karakteriyle ayrıldığı sürece çıktı istediğiniz şekilde biçimlendirilebilir. Örneğin, yukarıdaki örnek aşağıdaki gibi de çıkarılabilir:
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
Bu golf OpenGL, OBJ, KAPALI, AMF, CGAL vb Bu golf adlı Calvin'in Hobiler tarafından golf benzer dahil olmak üzere çeşitli 3d grafik sistemleri ve biçimleri esinlenerek bir Numaralı Cube üzerinde Yüz Çıktı , büyük fark İhtiyacınız olan köşelerin xyz koordinatlarını kendiniz ve üçgen indekslerini çıktılamak için. Okuduğunuz için teşekkürler.
Buradaki kullanıcı ilhamı, python2'de (golf dışı), vertstr ve idxstr değişkenlerindeki test çıktısı verileri için 'tamam' veya 'tamam değil' yazdıracak bir "yardımcı" doğrulama programıdır. Mükemmel çalışmıyor ... ama bazı hataları yakalayabilir.
Düzenleme: örnekte sabit yazım hatası ve doğrulama kodundaki hatalar.
#vertstr = '0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 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'
sınıf vektörü:
def __init __ (öz, v):
self.x, self.y, self.z = T [0], T [1], T [2]
def __add __ (öz, v):
dönüş Vektörü ([self.x + vx, self.y + vy, self.z + vz])
def __sub __ (öz, v):
dönüş Vektörü ([self.xv.x, self.yv.y, self.zv.z])
def __str __ (öz):
dönüş str (self.x) + ',' + str (self.y) + ',' + str (self.z)
def çapraz (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
Dönüş Vektörü ([x, y, z])
# http://mathforum.org/library/drmath/view/55343.html & http://sympy.org
def sargı (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
dönüş d
def normalleri (v1, v2, v3):
va = v2-v1
vb = v3-v2
vc = v1-v3
n1 = çapraz (va, vb)
n2 = çapraz (vb, vc)
n3 = çapraz (vc, va)
dönüş [n1, n2, n3]
def triplify (str):
nums, üç katına = [], []
str.split ('') içindeki num için: nums + = [int (num)]
(0, len (sayı), 3) aralığında i için:
üçlü + = [[sayı [i], sayı [i + 1], sayı [i + 2]]]
dönüş üçlü
verts = triplify (vertstr)
endeksler = üçlü artış (idxstr)
nsum = Vektör ([0,0,0])
windsum = 0
xs, ys, ZS = [], [], []
v cinsinden v için:
xs + = [h [0]]
ys + = [h [1]]
zs + = [h [2]]
#print xs, ys, zs, len (xs)
merkez = Vektör ([şamandıra (toplamı (xs)) / len (xs), şamandıra (toplamı (ys)) / len (ys), şamandıra (toplamı (ZS)) / len (ZS)])
endekslerde üçgen için:
v1 = Vektör (veriller [üçgen [0]])
v2 = Vektör (veriller [üçgen [1]])
v3 = Vektör (veriller [üçgen [2]])
normlar = normaller (v1, v2, v3)
baskı v1, v2, v3, normlar [0], normlar [1], normlar [2]
normlardaki n için:
nsum + = n
w = sargı (v1, v2, v3, merkez)
'sargı' yazdır, w
w <0 ise: rüzgâr- = 1
elif w> 0: rüzgar + 1
abs (windsum) == 12 ise: 'sargı tamam' yazdırın
aksi: 'sarma tamam değil' yazdırın
if (nsum.x == 0 ve nsum.y == 0 ve nsum.z == 0): 'normal toplam tamam' yazdır
aksi: 'normal toplam uygun değil' yazdır