Tọa độ đầu ra của các đỉnh của một khối. Sau đó, xuất ra một danh sách mười hai hình tam giác sẽ bao phủ khối lập phương, mỗi hình tam giác là một danh sách gồm ba chỉ số đỉnh, được định hướng nhất quán. Đầu ra phải là một chuỗi ASCII gồm các số thập phân riêng biệt. Golf này không có đầu vào. Người chiến thắng là ít ký tự nhất, trong đó bộ ký tự là Unicode.
Ví dụ, hãy xem xét một khối 1x1x1 bị dồn vào góc 0,0,0. Tám đỉnh của khối có thể được mô tả bằng các tọa độ xyz sau trên lưới 3d Cartesian:
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)
Mỗi đỉnh có thể được cung cấp một chỉ mục: 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
Bây giờ hãy xem xét mặt trên, các đỉnh được lập chỉ mục từ 0 đến 3. Hai hình tam giác bao phủ có thể được mô tả bởi ba chỉ số mỗi:
[0,1,2] [2,3,0]
Dưới đây là hình ảnh của khuôn mặt trên cùng này, nhìn từ phía trên khối lập phương:
3_____2
| /|
| / |
| / |
| / |
0_____1
Và đây là một cái nhìn từ một góc độ.
3____2
/ __-/|
0/_`__1 |
| | /6
|____|/
4 5
Lưu ý hướng, hoặc 'quanh co' của cả hai hình tam giác này là 'ngược chiều kim đồng hồ' khi nhìn từ 'bên ngoài' khối lập phương trực tiếp nhìn vào mặt trong câu hỏi (hãy tưởng tượng truy cập từng đỉnh như được liệt kê, nó đi ngược chiều kim đồng hồ). Bây giờ hãy tưởng tượng điều này được thực hiện cho tất cả sáu mặt của khối lập phương.
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]
Bạn có thể xuất bất kỳ kích thước nào của khối lập phương ở bất kỳ tọa độ nào. Bạn có thể đánh số và sắp xếp các tọa độ đỉnh theo cách bạn muốn. Các chỉ số có thể là 0 dựa hoặc 1 dựa. Hướng của tam giác có thể theo chiều kim đồng hồ hoặc ngược chiều kim đồng hồ khi nhìn từ bên ngoài khối lập phương miễn là phù hợp với tất cả các tam giác.
Đầu ra có thể được định dạng theo bất kỳ cách nào bạn muốn, miễn là mỗi số thập phân ASCII được phân tách bằng ít nhất một ký tự ASCII không phải là số. Ví dụ, ví dụ trên cũng có thể là đầu ra như sau:
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
Môn golf này được lấy cảm hứng từ nhiều hệ thống và định dạng đồ họa 3d khác nhau, bao gồm OpenGL, OBJ, OFF, AMF, CGAL, v.v. Môn golf này tương tự như môn đánh gôn bởi Sở thích của Calvin có tên là Output a Face on Numbered Cube , sự khác biệt lớn mà bạn cần để tự xuất các tọa độ xyz của các đỉnh và các chỉ số tam giác đầu ra. Cảm ơn vì đã đọc.
Theo cảm hứng của mỗi người dùng ở đây là chương trình xác thực "người trợ giúp" trong python2 (không chơi gôn) sẽ in 'ok' hoặc 'không ok' cho dữ liệu đầu ra thử nghiệm trong các biến vertstr và idxstr. Nó không hoạt động hoàn hảo ... nhưng nó có thể bắt được một số lỗi.
Chỉnh sửa: sửa lỗi chính tả trong ví dụ và lỗi trong mã xác nhận.
#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' lớp Vector: def __init __ (tự, v): self.x, self.y, self.z = v [0], v [1], v [2] def __add __ (tự, v): trả về Vector ([self.x + vx, self.y + vy, self.z + vz]) def __sub __ (tự, v): trả về Vector ([self.xv.x, self.yv.y, self.zv.z]) def __str __ (tự): return str (self.x) + ',' + str (self.y) + ',' + str (self.z) def chéo (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 trả về Vector ([x, y, z]) # http://mathforum.org/l Library / drmath / view / 55343.html & http://sympy.org cuộn dây 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 trở lại d định mức def (v1, v2, v3): va = v2-v1 vb = v3-v2 vc = v1-v3 n1 = chéo (va, vb) n2 = chéo (vb, vc) n3 = chéo (vc, va) trả về [n1, n2, n3] def triplify (str): số, ba lần = [], [] cho num trong str.split (''): nums + = [int (num)] cho i trong phạm vi (0, len (nums), 3): bộ ba + = [[nums [i], nums [i + 1], nums [i + 2]]] ba lần trở về verts = triplify (vertstr) chỉ số = triplify (idxstr) nsum = Vector ([0,0,0]) gió = 0 xs, ys, zs = [], [], [] cho v trong câu: xs + = [v [0]] ys + = [v [1]] zs + = [v [2]] #print xs, ys, zs, len (xs) centre = Vector ([float (sum (xs)) / len (xs), float (sum (ys)) / len (ys), float (sum (zs)) / len (zs)]) cho tam giác trong các chỉ số: v1 = Vector (động từ [tam giác [0]]) v2 = Vector (động từ [tam giác [1]]) v3 = Vector (động từ [tam giác [2]]) định mức = định mức (v1, v2, v3) in v1, v2, v3, định mức [0], định mức [1], định mức [2] cho n trong định mức: nsum + = n w = quanh co (v1, v2, v3, trung tâm) in 'quanh co', w nếu w <0: Windsum- = 1 elif w> 0: Windsum + = 1 if abs (Windsum) == 12: in 'quanh co ok' khác: in 'quanh co không ok' if (nsum.x == 0 và nsum.y == 0 và nsum.z == 0): in 'tổng bình thường ok' khác: in 'tổng bình thường không ok'