พิกัดเอาต์พุตของจุดยอดของลูกบาศก์ จากนั้นออกรายการสามเหลี่ยม 12 อันที่จะครอบคลุมลูกบาศก์แต่ละสามเหลี่ยมเป็นรายการจุดยอดสามดัชนี เอาต์พุตต้องเป็นสตริง ASCII ของตัวเลขทศนิยมที่แตกต่างกัน กอล์ฟนี้ไม่มีอินพุท ผู้ชนะคือตัวละครที่น้อยที่สุดโดยที่ชุดอักขระคือ Unicode
ตัวอย่างเช่นพิจารณาลูกบาศก์ 1x1x1 ที่มุมเป็น 0,0,0 แปดจุดยอดของลูกบาศก์สามารถอธิบายได้โดยพิกัด xyz ต่อไปนี้บนตารางคาร์ทีเซียน 3d:
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
กอล์ฟนี้ได้รับแรงบันดาลใจจากระบบกราฟิก 3 มิติและรูปแบบต่าง ๆ รวมถึง OpenGL, OBJ, OFF, AMF, CGAL และอื่น ๆ กอล์ฟนี้คล้ายกับกอล์ฟโดยงานอดิเรกของ Calvin ที่ชื่อว่าOutput a Face on a Numbered Cubeซึ่งแตกต่างอย่างมาก เพื่อส่งออกพิกัด xyz ของจุดยอดด้วยตนเองและดัชนีสามเหลี่ยมออก ขอบคุณที่อ่าน.
ต่อแรงบันดาลใจของผู้ใช้ที่นี่คือโปรแกรมตรวจสอบ "ผู้ช่วย" ใน python2 (ไม่ใช่กอล์ฟ) ที่จะพิมพ์ 'ok' หรือ 'ไม่ตกลง' สำหรับทดสอบข้อมูลผลลัพธ์ในตัวแปร vertstr และ idxstr มันไม่ทำงานอย่างสมบูรณ์แบบ ... แต่มันสามารถจับข้อผิดพลาดบางอย่าง
แก้ไข: พิมพ์ผิดในตัวอย่างและข้อบกพร่องในรหัสตรวจสอบ
#vertstr = '0 0 0 0 0 1 1 1 0 0 1 1 1 0 0 1 1 1 1 1 0 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 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 7 7 6 6 3 3 6 7 0 4 1 1 4 5' คลาสเวกเตอร์: def __init __ (ตัวเอง, v): self.x, self.y, self.z v = [0], โวลต์ [1], โวลต์ [2] def __ เพิ่ม __ (self, v): return เวกเตอร์ ([self.x + vx, self.y + vy, self.z + vz]) def __sub __ (ตัวเอง, v): ส่งคืนเวกเตอร์ ([self.xv.x, self.yv.y, self.zv.z]) def __str __ (ตัวเอง): return 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 winding (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 normals (v1, v2, v3): va = v2-v1 vb = v3-v2 vc = v1-v3 n1 = cross (va, vb) n2 = cross (vb, vc) n3 = cross (vc, va) ส่งคืน [n1, n2, n3] def เพิ่มเป็นสามเท่า (str): nums อเนกประสงค์ = [] [] สำหรับ num ใน str.split (''): nums + = [int (num)] สำหรับฉันอยู่ในช่วง (0, len (จำนวน), 3): triples + = [[nums [i], nums [i + 1], nums [i + 2]] กลับอเนกประสงค์ verts = เพิ่มเป็นสามเท่า (vertstr) ดัชนี = triplify (idxstr) nsum = เวกเตอร์ ([0,0,0]) windsum = 0 XS, ys, ZS = [] [] [] สำหรับ v ใน verts: XS + = [วี [0]] ys + = [วี [1]] ZS + = [วี [2]] #print xs, ys, zs, len (xs) ศูนย์ = เวกเตอร์ ([ลอย (ผลรวม (XS)) / len (XS) ลอย (ผลรวม (ys)) / len (ys) ลอย (ผลรวม (ZS)) / len (ZS)]) สำหรับสามเหลี่ยมในดัชนี: v1 = เวกเตอร์ (verts [สามเหลี่ยม [0]]) v2 = เวกเตอร์ (verts [สามเหลี่ยม [1]]) v3 = เวกเตอร์ (verts [สามเหลี่ยม [2]]) norms = normals (v1, v2, v3) พิมพ์ v1, v2, v3, บรรทัดฐาน [0], บรรทัดฐาน [1], บรรทัดฐาน [2] สำหรับ n ในบรรทัดฐาน: nsum + = n w = ไขลาน (v1, v2, v3, กึ่งกลาง) พิมพ์ 'winding', w ถ้า w <0: windsum- = 1 elif w> 0: windsum + = 1 ถ้า abs (windsum) == 12: พิมพ์ 'winding ok' อื่น ๆ : พิมพ์ 'ม้วนไม่ได้' if (nsum.x == 0 และ nsum.y == 0 และ nsum.z == 0): พิมพ์ 'sum sum ปกติ' อื่น ๆ : พิมพ์ 'ผลรวมปกติไม่ตกลง'