立方体の頂点の座標を出力します。次に、立方体をカバーする12個の三角形のリストを出力します。各三角形は、一貫して方向付けられた3つの頂点インデックスのリストです。出力は、異なる10進数のASCII文字列でなければなりません。このゴルフには入力がありません。勝者は最も少ない文字で、文字セットはUnicodeです。
例として、0,0,0の角にある1x1x1の立方体を考えます。立方体の8つの頂点は、3Dデカルトグリッド上の次のxyz座標で記述できます。
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)
各頂点にはインデックスを与えることができます: 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
次に、上面を考慮します。頂点のインデックスは0〜3です。2つのカバーする三角形は、それぞれ3つのインデックスで表すことができます。
[0,1,2] [2,3,0]
キューブの上から見たこの上面の写真は次のとおりです。
3_____2
| /|
| / |
| / |
| / |
0_____1
そして、これはある角度からの眺めです。
3____2
/ __-/|
0/_`__1 |
| | /6
|____|/
4 5
問題の面を直接見ている立方体の「外側」から見ると、これらの三角形の両方の向き、つまり「巻き」が「反時計回り」であることに注意してください(リストされているように各頂点にアクセスすると、反時計回りになります)。これが立方体の6辺すべてに対して行われたと想像してください。
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]
任意の座標にある任意のサイズの立方体を出力できます。頂点座標には、必要に応じて番号を付けて順序を付けることができます。インデックスは0ベースまたは1ベースにすることができます。三角形の向きは、すべての三角形で一貫している限り、立方体の外側から見たときに時計回りまたは反時計回りのどちらでもかまいません。
各ASCII 10進数が少なくとも1つの非数値ASCII文字で区切られている限り、出力は任意にフォーマットできます。たとえば、上記の例は次のように出力することもできます。
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
このゴルフは、OpenGL、OBJ、OFF、AMF、CGALなどのさまざまな3Dグラフィックスシステムおよびフォーマットに触発されています。このゴルフは、番号付きキューブの出力面という名前のCalvin's Hobbiesのゴルフに似ていますが、大きな違いは必要です。頂点のxyz座標を自分で出力し、三角形のインデックスを出力します。読んでくれてありがとう。
ここでのユーザーごとのインスピレーションは、変数vertstrおよびidxstrのテスト出力データに対して「ok」または「not ok」を出力するpython2(ゴルフではない)の「ヘルパー」検証プログラムです。それは完全に動作しません...しかし、いくつかのエラーをキャッチすることができます。
編集:例の誤植と検証コードのバグを修正しました。
#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'
クラスVector:
def __init __(self、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 __(self、v):
return Vector([self.xv.x、self.yv.y、self.zv.z])
def __str __(self):
str(self.x)+ '、' + str(self.y)+ '、' + str(self.z)を返す
def cross(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
ベクトル([x、y、z])を返す
#http://mathforum.org/library/drmath/view/55343.html&http://sympy.org
def巻線(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
def normals(v1、v2、v3):
va = v2-v1
vb = v3-v2
vc = v1-v3
n1 = cross(va、vb)
n2 = cross(vb、vc)
n3 = cross(vc、va)
[n1、n2、n3]を返す
def triplify(str):
nums、triples = []、[]
str.split( '')のnumの場合:nums + = [int(num)]
for i in range(0、len(nums)、3):
トリプル+ = [[nums [i]、nums [i + 1]、nums [i + 2]]]
トリプルを返す
verts = triplify(vertstr)
インデックス= triplify(idxstr)
nsum = Vector([0,0,0])
windsum = 0
xs、ys、zs = []、[]、[]
頂点のvの場合:
xs + = [v [0]]
ys + = [v [1]]
zs + = [v [2]]
#print xs、ys、zs、len(xs)
center = Vector([float(sum(xs))/ len(xs)、float(sum(ys))/ len(ys)、float(sum(zs))/ len(zs)])
インデックスの三角形の場合:
v1 = Vector(verts [triangle [0]])
v2 = Vector(verts [triangle [1]])
v3 = Vector(verts [triangle [2]])
ノルム=法線(v1、v2、v3)
v1、v2、v3、norms [0]、norms [1]、norms [2]を出力します
ノルムのnの場合:
nsum + = n
w =巻線(v1、v2、v3、センター)
'winding'、wを印刷
w <0の場合:windsum- = 1
elif w> 0:windsum + = 1
if abs(windsum)== 12:print 'winding ok'
else: 'winding not ok'を出力する
if(nsum.x == 0 and nsum.y == 0 and nsum.z == 0): 'normal sum ok'を出力する
else:「通常の合計は大丈夫ではない」を出力する