พิกัดเอาต์พุตของจุดยอดของลูกบาศก์ จากนั้นออกรายการสามเหลี่ยม 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 ปกติ'
อื่น ๆ : พิมพ์ 'ผลรวมปกติไม่ตกลง'