输出立方体顶点的坐标。然后,输出将覆盖该多维数据集的十二个三角形的列表,每个三角形是三个顶点索引(一致定向)的列表。输出必须是不同十进制数字的ASCII字符串。该高尔夫没有输入。优胜者是最少的字符,其中的字符集是Unicode。
例如,考虑一个1x1x1立方体,角为0,0,0。多维数据集的八个顶点可以通过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,1,2] [2,3,0]
这是从立方体上方看的这张顶面的图片:
3_____2
| /|
| / |
| / |
| / |
0_____1
这是一个角度的视图。
3____2
/ __-/|
0/_`__1 |
| | /6
|____|/
4 5
请注意,当从立方体的“外部”直接看待讨论的面时,这两个三角形的方向或“缠绕”是“逆时针”(想象访问列出的每个顶点,逆时针旋转)。现在,想象对多维数据集的所有六个面都执行此操作。
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十进制数字都至少由一个非数字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
该高尔夫的灵感来自各种3d图形系统和格式,包括OpenGL,OBJ,OFF,AMF,CGAL等。该高尔夫类似于Calvin's Hobbies的名为“在数字立方体上输出一个面孔”的高尔夫,这是您需要的大差异自己输出顶点的xyz坐标并输出三角形索引。谢谢阅读。
每个用户的灵感都来自python2(非高尔夫)中的“帮助程序”验证程序,该程序将在变量vertstr和idxstr中为测试输出数据打印“ ok”或“ not ok”。它不能完美运行...但是会捕获一些错误。
编辑:修复示例中的错字和验证代码中的错误。
#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 0 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' 类向量: def __init __(self,v): self.x,self.y,self.z = v [0],v [1],v [2] def __add __(self,v): 返回向量([self.x + vx,self.y + vy,self.z + vz]) def __sub __(self,v): 返回向量([self.xv.x,self.yv.y,self.zv.z]) def __str __(): 返回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法线(v1,v2,v3): va = v2-v1 vb = v3-v2 vc = v1-v3 n1 =交叉(va,vb) n2 =交叉(vb,vc) n3 =跨(vc,va) 返回[n1,n2,n3] def triplify(str): nums,triples = [],[] 对于str.split('')中的num:nums + = [int(num)] 对于范围(0,len(nums),3)中的i: 三元组+ = [[nums [i],nums [i + 1],nums [i + 2]]] 返回三元组 顶点= Triplify(顶点) 指数=三倍化(idxstr) nsum =向量([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 =向量(verts [triangle [0]]) v2 =向量(verts [triangle [1]]) v3 =向量(verts [triangle [2]]) 规范=法线(v1,v2,v3) 打印v1,v2,v3,规范[0],规范[1],规范[2] 对于n的规范: nsum + = n w =绕组(v1,v2,v3,中心) 打印'winding',w 如果w <0:windsum- = 1 小数w> 0:windsum + = 1 如果abs(windsum)== 12:打印'winding ok' 否则:打印“绕线不正常” if(nsum.x == 0且nsum.y == 0且nsum.z == 0):打印'normal sum ok' 否则:打印“正常金额不正确”