Выходные координаты вершин куба. Затем выведите список из двенадцати треугольников, которые будут покрывать куб, причем каждый треугольник представляет собой список из трех индексов вершин, последовательно ориентированных. Выход должен быть строкой ASCII с различными десятичными числами. Этот гольф не имеет ввода. Победитель - это наименьшее количество символов, где набор символов - Unicode.
Для примера рассмотрим куб 1x1x1 с углом 0,0,0. Восемь вершин куба можно описать следующими координатами 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
Этот гольф вдохновлен различными системами и форматами трехмерной графики, включая OpenGL, OBJ, OFF, AMF, CGAL и т. Д. Этот гольф похож на гольф от хобби Calvin's по имени Вывести лицо на пронумерованном кубе , большая разница в том, что вам нужно вывести координаты xyz вершин самостоятельно и вывести индексы треугольника. Спасибо за чтение.
Вдохновением для пользователя здесь является «вспомогательная» программа проверки в python2 (не для гольфа), которая выведет «ok» или «not ok» для тестовых выходных данных в переменных vertstr и idxstr. Он не работает идеально ... но он может поймать некоторые ошибки.
Редактировать: исправлена опечатка в примере и ошибки в коде проверки.
#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' Вектор класса: 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 __ (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, х3, у3, г3, x4, y4, z4 = v1.x, v1.y, v1.z, v2.x, v2.y, v2.z, v3. х, 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 возврат г нормальные значения (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): НУМС, тройки = [], [] для num в str.split (''): nums + = [int (num)] для i в диапазоне (0, len (nums), 3): тройки + = [[nums [i], nums [i + 1], nums [i + 2]]] обратные тройки verts = triplify (vertstr) индексы = трижды (idxstr) nsum = Vector ([0,0,0]) windsum = 0 Xs, YS, ZS = [], [], [] для v в вертах: хз + = [v [0]] YS + = [v [1]] ZS + = [v [2]] # напечатайте xs, ys, zs, len (xs) центр Вектор = ([с плавающей точкой (сумма (XS)) / LEN (XS), поплавок (сумма (YS)) / LEN (YS), поплавок (сумма (ZS)) / LEN (ZS)]) для треугольника в индексах: v1 = вектор (verts [треугольник [0]]) v2 = вектор (verts [треугольник [1]]) v3 = Vector (verts [треугольник [2]]) нормы = нормальные (v1, v2, v3) print v1, v2, v3, нормы [0], нормы [1], нормы [2] в нормах: nsum + = n w = обмотка (v1, v2, v3, центр) печать "намотка", ш если w <0: windsum- = 1 elif w> 0: windsum + = 1 если abs (windsum) == 12: выведите «winding ok» еще: выведите «намотка не в порядке» if (nsum.x == 0 и nsum.y == 0 и nsum.z == 0): выведите 'normal sum ok' иначе: выведите «нормальная сумма не в порядке»