큐브 정점의 좌표를 출력합니다. 그런 다음 큐브를 덮을 12 개의 삼각형 목록을 출력합니다. 각 삼각형은 일관된 방향을 가진 3 개의 정점 색인 목록입니다. 출력은 고유 한 10 진수의 ASCII 문자열이어야합니다. 이 골프는 입력이 없습니다. 우승자는 문자 수가 유니 코드 인 가장 적은 문자입니다.
예를 들어, 0,0,0에 모서리가있는 1x1x1 큐브를 고려하십시오. 큐브의 8 개의 꼭짓점은 3 차원 데카르트 그리드에서 다음 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까지 색인됩니다. 두 개의 커버링 삼각형은 각각 세 개의 인덱스로 설명 될 수 있습니다.
[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 진수가 하나 이상의 숫자가 아닌 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 가 Numbered Cube에서 Output a Face 라는 골프와 유사 합니다. 꼭짓점의 xyz 좌표를 출력하고 삼각형 인덱스를 출력합니다. 읽어 주셔서 감사합니다.
사용자 당 영감은 vertstr 및 idxstr 변수의 테스트 출력 데이터에 대해 'ok'또는 'not ok'를 인쇄하는 python2 (non-golfy)의 "도우미"검증 프로그램입니다. 완벽하게 작동하지는 않지만 약간의 오류가 발생할 수 있습니다.
편집 : 예제의 오타 수정 및 유효성 검사 코드의 버그.
#vertstr = '00 1011 1011 101111 ' #idxstr = '1 2 1 3 7 5 6 4 6 5 2 4 4 6 6 3 3 5 1 5 3 1 15 5 5 6 6 2 3 6' vertstr = '0110111101010010' idxstr = '0112 34 5678 9 1 5 5 0 34 4 3 7 2 6 3 3 6 7 4 1 4 5' 클래스 벡터 : 데프 __init __ (self, v) : self.x, self.y, self.z = v [0], v [1], v [2] 데프 __add __ (self, v) : 벡터 반환 ([self.x + vx, self.y + vy, self.z + vz]) 데프 __sub __ (self, v) : 벡터 반환 ([self.xv.x, self.yv.y, self.zv.z]) 데프 __str__ (자체) : str (self.x) + ','+ str (self.y) + ','+ str (self.z) 반환 데프 크로스 (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 데프 와인딩 (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를 반환 데프 노멀 (v1, v2, v3) : va = v2-v1 vb = v3-v2 vc = v1-v3 n1 = 교차 (va, vb) n2 = 교차 (vb, vc) n3 = 교차 (vc, va) 반환 [n1, n2, n3] 데프 트립 플리 (str) : 숫자, 트리플 = [], [] str.split ( '')의 num : nums + = [int (num)] range (0, len (nums), 3)의 i의 경우 : 트리플 + = [[숫자 [i], 숫자 [i + 1], 숫자 [i + 2]]] 트리플을 반환 verts = 삼중 화 (vertstr) 지수 = triplify (idxstr) nsum = 벡터 ([0,0,0]) windsum = 0 xs, ys, zs = [], [], [] verts에서 v의 경우 : xs + = [v [0]] ys + = [v [1]] zs + = [v [2]] #print xs, ys, zs, len (xs) 중심 = 벡터 ([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, norms [0], norms [1], norms [2] 인쇄 규범에 따라 n : nsum + = n w = 권선 (v1, v2, v3, center) '와인딩'인쇄, w w <0 인 경우 : windsum- = 1 elif w> 0 : windsum + = 1 abs (windsum) == 12 인 경우 : 'winding ok'인쇄 else : 'winding not ok'인쇄 (nsum.x == 0 및 nsum.y == 0 및 nsum.z == 0) 인 경우 : '정상 합계 ok'인쇄 else : '정상 합계가 정상이 아닙니다'인쇄