输出立方体顶点的坐标。然后,输出将覆盖该多维数据集的十二个三角形的列表,每个三角形是三个顶点索引(一致定向)的列表。输出必须是不同十进制数字的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'
否则:打印“正常金额不正确”