วาด Dodecahedron ดาวคริสต์มาส / Stellated


10

ดาวกระดาษเป็นเรื่องใหญ่ในครอบครัวของฉันในวันคริสต์มาสดังนั้นฉันจึงคิดว่าอันที่จริงแล้วมันจะเท่ห์

ด้านล่างเป็นภาพของdodecahedron ปกติ (จากhttps://en.wikipedia.org/wiki/Dodecahedronประกอบกับผู้เขียนกล่าวถึงที่นั่น)

ป้อนคำอธิบายรูปภาพที่นี่

กระบวนการstellation (วิกิพีเดีย) เมื่อนำไปใช้กับรูปทรงหลายเหลี่ยมเกี่ยวข้องกับการขยายใบหน้าจนกว่าพวกเขาจะข้ามใบหน้าอื่น ๆ ดังนั้นเริ่มต้นด้วย dodecahedron ปกติเราได้รับรูปร่างดังต่อไปนี้:

Dodecahedron ขนาดเล็ก Stodated, Great Dodecahedron และ Great Stodated Dodecahedron

ภาพจากhttp://jwilson.coe.uga.edu/emat6680fa07/thrash/asn1/stellations.html

ป้อนคำอธิบายรูปภาพที่นี่

นี่เป็นสามStellations ที่เป็นไปได้ของ dodecahedron (Wolfram) พวกมันก่อให้เกิดความก้าวหน้าตามธรรมชาติจากทรงสิบสองเหลี่ยมไปจนถึงทรงสิบสองเหลี่ยมขนาดเล็กที่มีรูปร่างเหมือนดวงดาวรูปร่างคล้ายดาวขนาดใหญ่และรูปทรงสิบสองรูปที่ยิ่งใหญ่เมื่อเราขยายใบหน้าออกไปไกล

งาน

โปรแกรมหรือฟังก์ชั่นของคุณควรแสดงหรือส่งออกไปยังหนึ่งไฟล์ภาพของรูปทรงหลายเหลี่ยมต่อไปนี้: เฟปกติขนาดเล็ก stellated ออฟเฟนบา, Great เฟหรือยิ่งใหญ่ stellated Dodecahedron

ชุดสีควรเป็นภาพที่สองด้านบน ใบหน้าตรงข้ามทั้งหกคู่แต่ละคู่ต้องเป็นหนึ่งในหกสีแดง, เหลือง, เขียว, ฟ้า, น้ำเงินและม่วงแดง คุณอาจใช้สีเริ่มต้นกับชื่อเหล่านี้ในภาษาของคุณหรือเอกสารประกอบของมันหรือใช้สี FF0000, FFFF00, 00FF00, 00FFFF, 0000FF และ FF00FF (คุณสามารถลดสีเหล่านี้ลงได้โดยลดความเข้มลงเหลือ 75% ถ้าต้องการ เช่นโดยการลดค่า F's เป็น C)

โปรดทราบว่าเรากำหนด "ใบหน้า" ว่าเป็นพื้นที่ทั้งหมดในระนาบเดียวกัน ดังนั้นในภาพด้านบนใบหน้าด้านหน้าจึงเป็นสีเหลือง (และด้านหลังขนานกันก็จะเป็นสีเหลืองด้วย)

พื้นหลังควรเป็นสีดำเทาหรือขาว ขอบอาจถูกละเว้น แต่ควรเป็นสีดำหากวาด

กฎระเบียบ

รูปทรงหลายเหลี่ยมที่แสดงต้องมีความกว้างระหว่าง 500 ถึง 1,000 พิกเซล (ความกว้างถูกกำหนดเป็นระยะทางสูงสุดระหว่างจุดยอดที่แสดงสองจุดใด ๆ )

รูปทรงหลายเหลี่ยมที่แสดงจะต้องอยู่ในการฉายภาพมุมมอง (มุมมองอย่างน้อย 5 ความกว้างจากรูปทรงหลายเหลี่ยม) หรือการฉายภาพแบบออโธกราฟฟิค

รูปทรงหลายเหลี่ยมต้องแสดงได้จากทุกมุม (ไม่สามารถเลือกมุมที่เป็นไปได้ง่ายที่สุดและสร้างรูปร่างแบบ hardcoded 2D) ผู้ใช้สามารถระบุมุมได้ด้วยวิธีใดวิธีหนึ่งต่อไปนี้:

  1. อินพุตของสามมุมที่สอดคล้องกับการหมุนสามครั้งจาก stdin หรือเป็นฟังก์ชันหรือพารามิเตอร์บรรทัดคำสั่ง สิ่งเหล่านี้อาจเป็นมุมออยเลอร์ (โดยที่การหมุนครั้งแรกและครั้งสุดท้ายอยู่ในแกนเดียวกัน) หรือมุม Tait-Bryan (ที่มีการหมุนหนึ่งรอบในแต่ละรอบแกน x, y และ z) https://en.wikipedia.org/ wiki / Euler_angles (พูดง่าย ๆ ทุกสิ่งที่ผ่านไปตราบใดที่การหมุนแต่ละครั้งเกี่ยวกับแกน x, y, หรือ z และการหมุนต่อเนื่องกันเป็นเรื่องเกี่ยวกับแกนตั้งฉาก)

  2. สิ่งอำนวยความสะดวกสำหรับผู้ใช้ในการหมุนรูปทรงหลายเหลี่ยมในขั้นตอนไม่เกิน 10 องศาเกี่ยวกับแกน x และ y และรีเฟรชจอแสดงผลจำนวนครั้งใด ๆ โดยพลการ (สมมติว่าแกน z ตั้งฉากกับหน้าจอ)

รูปทรงหลายเหลี่ยมจะต้องมั่นคงไม่ใช่โครงลวด

ไม่อนุญาตให้สร้างบิวอินสำหรับวาดรูปทรงหลายเหลี่ยม (ฉันกำลังดูคุณ Mathematica!)

เกณฑ์การให้คะแนน

นี่คือ codegolf รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

โบนัส

ทวีคูณคะแนนของคุณ 0.5 ถ้าคุณไม่ได้ใช้ builtins สำหรับการวาดภาพ 3 มิติ

ทวีคูณคะแนนของคุณ 0.7 หากคุณสามารถแสดงทั้งสาม stellations ของ dodecahedron เลือกได้โดยผู้ใช้โดยจำนวนเต็ม 1-3 ที่ป้อนจาก stdin หรือตามฟังก์ชั่นหรือพารามิเตอร์ commandline

ถ้าคุณไปโบนัสทั้งสองคะแนนของคุณจะถูกคูณด้วย 0.5 * 0.7 = 0.35

ข้อมูลที่เป็นประโยชน์ (แหล่งที่มาดังต่อไปนี้)

https://en.wikipedia.org/wiki/Regular_dodecahedron

https://en.wikipedia.org/wiki/Regular_icosahedron

dodecahedron มี 20 จุดยอด 8 ของพวกเขาในรูปแบบจุดยอดของก้อนกับพิกัดคาร์ทีเซียน (x, y, z) ดังต่อไปนี้:

(± 1, ± 1, ± 1)

ส่วนที่เหลืออีก 12 มีดังนี้ (พีคืออัตราส่วนทองคำ)

(0, ± 1 / φ, ±φ)

(± 1 / φ, ±φ, 0)

(±φ, 0, ± 1 / φ)

ลำเรือนูนของเดกคาเฮดตรอนขนาดเล็กและเดกคาเฮดตรอนขนาดใหญ่นั้นเห็นได้ชัดว่าเป็นทรงสิบสองเหลี่ยมปกติ จุดยอดนอกอธิบายถึงรูปทรงครึ่งวงกลม

ตามที่วิกิพีเดียมี 12 จุดยอดของ icosahedron สามารถอธิบายได้ในลักษณะเดียวกันกับพีชคณิตพีชคณิต (0, ± 1, ±φ) จุดยอดด้านนอกของ dodecaheron ขนาดเล็กและ dodechahedron ยอดเยี่ยม (ในระดับเดียวกับ dodecahedron ด้านบน) ก่อตัวเป็น icosahedron ที่มีขนาดใหญ่ขึ้นซึ่งพิกัดของจุดยอดนั้นเป็นวงจรเรียงสับเปลี่ยนของ

มุมระหว่างใบหน้าสำหรับ dodecahedron และ icosahedron คือ 2 arctan (phi) และ arccos (- ((5) / 3) ตามลำดับ

สำหรับเคล็ดลับเกี่ยวกับการหมุนดูที่https://en.wikipedia.org/wiki/Rotation_matrix

แก้ไข: โดยไม่ได้ตั้งใจฉันอนุญาตโดเดกคาเฮดรอนประจำและไม่สามารถถอนได้ในตอนนี้ โบนัส x0.7 สำหรับการวาดรูปทรงโพลีเฮดราทั้งสามตัวยังคงอยู่ ในวันปีใหม่ฉันจะออก 100 รางวัลสำหรับคำตอบที่สามารถแสดงรูปทรงโพลีสี่ส่วนใหญ่โดยใช้รหัสที่สั้นที่สุดเป็นตัวแบ่งไทม์


@ LegionMammal978 builtins สำหรับการวาดรูปทรงหลายเหลี่ยม (เช่นdodecahedron) จะไม่ได้รับอนุญาต บางภาษามีสิ่งอำนวยความสะดวกสำหรับการสร้างแบบจำลอง 3 triangle[[a,b,c],[p,q,r],[x,y,z]]มิติที่มีคำสั่งเช่น ภาษาเหล่านี้โดยทั่วไปมี builtins สำหรับการหมุนและการแสดงแบบจำลองการดูแลโดยอัตโนมัติไม่แสดงใบหน้าที่ซ่อนอยู่ ฯลฯ โซลูชั่นเช่นนี้ได้รับอนุญาต แต่จะไม่ดึงดูดโบนัส จุดประสงค์ของโบนัสคืออนุญาตให้ภาษาที่ไม่มีสิ่งอำนวยความสะดวกเหล่านี้สามารถแข่งขันได้และยังสามารถดึงดูดโซลูชันที่น่าสนใจมากขึ้น
เลเวลริเวอร์

@ LegionMammal978 ฮ่า ๆ ฉันรู้ว่า Mathematica จะเป็นภาษาที่ทำให้เกิดปัญหา Polyhedrondataไม่อนุญาตเนื่องจากเห็นได้ชัดว่าเป็น builtin สำหรับวาดรูปทรงหลายเหลี่ยม หากคำตอบของคุณไม่ได้ใช้ builtins สำหรับการวาดรูปหลายเหลี่ยมและสอดคล้องกับกฎอื่น ๆ ก็เป็นที่ยอมรับ ประเด็นของคุณน่าจะเป็นเพราะความจริงที่ว่าคุณต้องปรับสีใบหน้าให้ถูกต้องPolyhedrondataจะไม่ช่วยคุณได้มากนักดังนั้นในทางปฏิบัติมันอาจเป็นข้อ จำกัด โดยพลการ ฉันยอมรับในขอบเขต แต่มันก็ยุติธรรมสำหรับทุกคนถ้าฉันหลีกเลี่ยงการเปลี่ยนแปลงกฎหลังจากโพสต์
เลเวลริเวอร์

คำตอบ:


3

Python 2.7, 949 ไบต์

นี่คือวิธีแก้ปัญหาสำหรับการวางแผนสิบสองเหลี่ยมปกติโดยใช้ matplotlib คร่าวๆคร่าวๆของโค้ดที่ไม่ได้เขียน (ไม่ได้แสดงไว้ที่นี่) มีการอธิบายไว้ด้านล่าง:

  • ทำให้จุดยอดสร้างขอบ (ขึ้นอยู่กับ 3 เพื่อนบ้านที่ใกล้ที่สุดโมดูล scipy.spatial.KDtree)
  • ทำให้ใบหน้าเป็นไปตามกราฟรอบที่มีความยาว 5 (โมดูลเครือข่าย x)
  • จัดทำ facenormals (และเลือกผู้ที่หันหน้าไปทางด้านนอกตามปกติคือ numpy.cross)
  • สร้างสีตามบรรทัดฐานของใบหน้า
  • พล็อตโดยใช้ matplotlib
import itertools as it
import numpy as np
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
import matplotlib.pyplot as plt
v=[p for p in it.product((-1,1),(-1,1),(-1,1))]
g=.5+.5*5**.5
v.extend([p for p in it.product((0,),(-1/g,1/g),(-g,g))])
v.extend([p for p in it.product((-1/g,1/g),(-g,g),(0,))])
v.extend([p for p in it.product((-g,g),(0,),(-1/g,1/g))])
v=np.array(v)
g=[[12,14,5,9,1],[12,1,17,16,0],[12,0,8,4,14],[4,18,19,5,14],[4,8,10,6,18],[5,19,7,11,9],[7,15,13,3,11],[7,19,18,6,15],[6,10,2,13,15],[13,2,16,17,3],[3,17,1,9,11],[16,2,10,8,0]]
a=[2,1,0,3,4,5,0,1,2,3,4,5]
fig = plt.figure()
ax = fig.add_subplot((111),aspect='equal',projection='3d')
ax.set_xlim3d(-2, 2)
ax.set_ylim3d(-2, 2)
ax.set_zlim3d(-2, 2)
for f in range(12):
 c=Poly3DCollection([[tuple(y) for y in v[g[f],:]]], linewidths=1, alpha=1)
 c.set_facecolor([(0,0,1),(0,1,0),(0,1,1),(1,0,0),(1,0,1),(1,1,0)][a[f]])
 ax.add_collection3d(c)
ax.auto_scale_xyz
plt.show()

ป้อนคำอธิบายรูปภาพที่นี่


3

Ruby, 784 ไบต์ * 0.5 * 0.7 = 274.4

คำตอบของฉันเองจึงไม่มีสิทธิ์รับเงินรางวัลของฉัน

มีสิทธิ์ได้รับทั้งโบนัสที่ไม่ใช่ 3D ภายในและโบนัสวาดรูปดาวทั้งหมด

->t,n{o=[]
g=->a{a.reduce(:+)/5}
f=->u,v,w,m{x=u.dup;y=v.dup;z=w.dup
15.times{|i|k,l=("i".to_c**(n[i/5]/90.0)).rect
j=i%5
x[j],y[j],z[j]=y[j],x[j]*k+z[j]*l,z[j]*k-x[j]*l}
p=g[x];q=g[y];r=g[z]
a=[0,1,-i=0.382,-1][t]*e=r<=>0
b=[j=1+i,0,j,j][t]*e
c=[-i*j,-i,1,i][t]*e
d=[j*j,j,0,0][t]*e
5.times{|i|o<<"<path id=\"#{"%9.0f"%(z[i]*a+r*b+(z[i-2]+z[i-3])*c+2*r*d+999)}\"
d=\"M#{(x[i]*a+p*b)} #{(y[i]*a+q*b)}L#{(x[i-2]*c+p*d)} #{(y[i-2]*c+q*d)}L#{(x[i-3]*c+p*d)} #{(y[i-3]*c+q*d)}\"
fill=\"##{m}\"/>"}}
a=233
b=377
z=[0,a,b,a,0]
y=[a,b,0,-b,-a]
x=[b,0,-a,0,b]
w=[-b,0,a,0,-b]
f[x,y,z,'F0F']
f[w,y,z,'0F0']
f[y,z,x,'00F']
f[y,z,w,'FF0']
f[z,x,y,'F00']
f[z,w,y,'0FF']
s=File.open("p.svg","w")
s.puts'<svg xmlns="http://www.w3.org/2000/svg" viewBox="-450 -450 900 900">',o.sort,'</svg>'
s.close}

อินพุตเป็นพารามิเตอร์ฟังก์ชัน

จำนวนเต็ม 0..3 ที่สอดคล้องกับ dodecahedron ปกติ, dodecahedron ที่มีขนาดเล็ก, dodecahedron ที่มี stellated ที่ดี

อาร์เรย์ของจำนวนเต็มสามจำนวนที่สอดคล้องกับองศาการหมุนของแกน x, y และ x (อีกครั้ง) (มุมออยเลอร์ที่เหมาะสมช่วยให้สามารถหมุนได้ทุกครั้ง)

ส่ง ออกไฟล์p.svgที่สามารถแสดงในเว็บเบราว์เซอร์

คำอธิบาย

อาร์เรย์ x, y, z ที่ด้านล่างของรหัสประกอบด้วยพิกัดของจุดนอกของหน้าเดียวของ dodecahedron ที่มีขนาดเล็ก สิ่งนี้สามารถถูกจารึกไว้ใน icosahedron ซึ่งมี 12 vertices ที่ถูกกำหนดโดยพีชคณิตการเปลี่ยนรูปแบบของ (+/- 377, + / - 233, + / - 0) โปรดทราบว่า 377 และ 233 เป็นหมายเลขฟีโบนักชีต่อเนื่องดังนั้น 377/233 จึงเป็นอัตราส่วนที่ดีเยี่ยมสำหรับอัตราส่วนทองคำ

อาร์เรย์เพิ่มเติมที่มีพิกัด x คูณด้วย -1 เท่ากับการสะท้อนกลับในระนาบ x ฟังก์ชัน f เรียกว่า 6 ครั้งหนึ่งครั้งสำหรับแต่ละสีโดยมีการเรียงสับเปลี่ยนแบบวนรอบที่แตกต่างกันของ x, y, z และ w, y, z

การหมุนทั้งสามจะถูกส่งเป็นพารามิเตอร์ใน n [] ใช้บาปและ cos include Mathในทับทิมก็เป็นสิ่งจำเป็นที่ต้องทำ เพื่อหลีกเลี่ยงสิ่งนี้โคไซน์และไซน์ของมุมจะได้รับโดยการเพิ่มสแควร์รูทของ -1 "i"เป็นกำลังของ (มุมเป็นองศา / 90) ชิ้นส่วนจริงและจินตภาพของจำนวนนี้ถูกเก็บไว้ใน k (โคไซน์) และ l ( ไซน์)

ก่อนการหมุนจะมีการแลกเปลี่ยนค่า x และ y จากนั้นการคูณเมทริกซ์จะถูกนำไปใช้กับค่า y และ z เพื่อให้การหมุนเกี่ยวกับแกน x การแลกเปลี่ยนค่าช่วยให้การหมุนเวียนสามรอบเป็นแบบวนซ้ำ

จนถึงตอนนี้เรามีคะแนนเดียวเท่านั้น เพื่อให้ได้ส่วนที่เหลือเราต้องหาศูนย์กลางของรูปห้าเหลี่ยม / ดาว สิ่งนี้ทำได้โดยการหาค่าเฉลี่ยของพิกัดของ 5 ยอดซึ่งถูกเก็บไว้ใน p, q, r

ดังที่ได้กล่าวไว้ก่อนหน้านี้มีการเรียกใช้ฟังก์ชันหนึ่งครั้งต่อสีเท่านั้น เครื่องหมายของ r (ค่าเฉลี่ยของพิกัด z และดังนั้นพิกัดของใบหน้า) จึงถูกทดสอบ หากเป็นบวกใบหน้าจะเป็นด้านหน้าและมองเห็นได้ หากมันเป็นลบใบหน้าจะเป็นใบหน้าด้านหลัง มันมองไม่เห็นและเราไม่มีฟังก์ชั่นการโทรสำหรับใบหน้าตรงกันข้าม ดังนั้นทั้งสามพิกัดจะต้องกลับด้าน สัญลักษณ์ของ r จะถูกเก็บไว้ใน e เพื่ออำนวยความสะดวกนี้

ใบหน้าถูกสร้างขึ้นจาก 5 สามเหลี่ยมซึ่งมีจุดยอดเป็นเส้นตรงของจุดยอดนอกของรูปทรงสิบสองเหลี่ยมที่มีขนาดเล็กและศูนย์กลางของใบหน้า ในกรณีของ dodecahedron ขนาดเล็กสำหรับเคล็ดลับของรูปสามเหลี่ยมเราตั้งค่า a = 1 และ b = 0 (ส่วนที่ 1 จาก x, y, z และ 0 จาก p, q, r) สำหรับจุดยอดฐาน 2 ของรูปสามเหลี่ยมเราตั้งค่า c = -0.382 (อัตราส่วน 1 / อัตราส่วนทองคำ ^ 2 จาก x, y, z) และ d = 1.382 (ส่วนสนับสนุนจาก p, q, r.) เหตุผลของการสนับสนุนเชิงลบคือ ว่าจุดยอดฐานของรูปสามเหลี่ยมถูกกำหนดในรูปแบบของเคล็ดลับของฝ่ายตรงข้ามซึ่งอยู่บนฝั่งตรงข้ามของใบหน้า พิกัดที่ได้รับจะถูกคูณด้วย e ตามความจำเป็น

อาร์เรย์ที่ไม่มีชื่อสี่ตัวที่ค่าถูกกำหนดให้a,b,c,dมีค่าที่ต้องการสำหรับ dodecahedron ปกติ, dodecahedron ที่มีขนาดเล็ก, dodecahedron ที่มีขนาดใหญ่, dodecahedron ที่ดีและ dodecahedron ที่ยิ่งใหญ่ที่เลือกไว้ตามตัวแปรtโปรดทราบว่าสำหรับ dodecahedron ที่มีขนาดเล็กและ dodecahedron ที่ดี d = 1 ความสัมพันธ์ a + b = c + d นำไปใช้กับรูปร่างอื่น ๆ แต่มีการนำสเกลอื่นมาใช้

บรรทัดของรหัส svg ถูกสร้างขึ้นสำหรับแต่ละสามเหลี่ยม สิ่งนี้มี ID ที่ได้มาจากผลรวมของพิกัด z ของจุดยอด 3 จุดของรูปสามเหลี่ยมรายละเอียดของจุดยอดของพิกัดสามจุดของรูปสามเหลี่ยมและสี โปรดทราบว่าเราดูแกน z ลงในการฉายภาพแบบออโทกราฟ ดังนั้น 2D x = 3D x และ 2D y = 3D y เพิ่มบรรทัดเข้าไปh.

ในที่สุดหลังจากการเรียกฟังก์ชั่นทั้งหมดเสร็จสิ้น h จะถูกจัดเรียงเพื่อให้รูปสามเหลี่ยมที่มีค่าสูงสุด z (ด้านหน้า) ถูกพล็อตสุดท้ายและสิ่งทั้งหมดจะถูกบันทึกเป็นไฟล์ svg พร้อมกับส่วนหัวและข้อความท้ายกระดาษที่เหมาะสม

Ungolfed ในโปรแกรมทดสอบ

h=->t,n{                                              #t=type of polygon,n=angles of rotation
o=[]                                                  #array for output
g=->a{a.reduce(:+)/5}                                 #auxiliary function for finding average of 5 points

f=->u,v,w,m{x=u.dup;y=v.dup;z=w.dup                   #function to take 5 points u,v,w and plot one face (5 triangles) of the output in colour m 

  15.times{|i|                                        #for each of 3 rotation angle and 5 points
    k,l=("i".to_c**(n[i/5]/90.0)).rect                #calculate the cos and sine of the angle, by raising sqrt(-1)="i" to a power
    j=i%5                                             #for each of the 5 points
    x[j],y[j],z[j]=y[j],x[j]*k+z[j]*l,z[j]*k-x[j]*l}  #swap x and y, then perform maxtrix rotation on (new) y and z.

  p=g[x];q=g[y];r=g[z]                                #find centre p,q,r of the face whose 5 points (in the case of small stellated dodecahedron) are in x,y,z

  e=r<=>0                                             #if r is positive, face is front. if negative, face is back, so we need to transform it to opposite face.
  a=[0,              1,    -0.382,    -1][t]*e        #contribution of 5 points x,y,z to triangle tip vertex coordinates
  b=[1.382,          0,     1.382,     1.382][t]*e    #contribution of centre p,q,r to triangle tip vertex coordinates
  c=[-0.528,        -0.382, 1,         0.382][t]*e    #contribution of 5 points x,y,z to coordinates of each triangle base vertex 
  d=[1.901,          1.382, 0,         0][t]*e        #contribution of centre p,q,r to coordinates of each triangle base vertex

  5.times{|i|
  o<<"<path id=\"#{"%9.0f"%(z[i]*a+r*b+(z[i-2]+z[i-3])*c+2*r*d+999)}\"
d=\"M#{(x[i]*a+p*b)} #{(y[i]*a+q*b)}L#{(x[i-2]*c+p*d)} #{(y[i-2]*c+q*d)}L#{(x[i-3]*c+p*d)} #{(y[i-3]*c+q*d)}\"
fill=\"##{m}\"/>"}                                    #write svg code for this triangle 
}

  a=233                                               #a,b =coordinate standard values 
  b=377
  z=[0,a,b,a,0]                                       #z coordinates for one face of stellated dodecahedron 
  y=[a,b,0,-b,-a]                                     #y coordinates
  x=[b,0,-a,0,b]                                      #x coordinates
  w=[-b,0,a,0,-b]                                     #alternate  x coordinates

  f[x,y,z,'F0F']                                      #call f
  f[w,y,z,'0F0']                                      #to plot
  f[y,z,x,'00F']                                      #each
  f[y,z,w,'FF0']                                      #face
  f[z,x,y,'F00']                                      #in
  f[z,w,y,'0FF']                                      #turn

  s=File.open("p.svg","w")                            #sort output in o, plot front triangles last
  s.puts'<svg xmlns="http://www.w3.org/2000/svg" viewBox="-450 -450 900 900">',o.sort,'</svg>'
  s.close                                             #add header and footer, and save as svg
}

t=gets.to_i
n=[]
3.times{n<<gets.to_i}
h[t,n]

เอาท์พุต

สำหรับ dodecahedron stellated ขนาดเล็ก (จะเพิ่มรูปภาพของรูปหลายเหลี่ยมอื่น ๆ ในไม่ช้า)

ตำแหน่งบ้าน 1,0,0,0

ป้อนคำอธิบายรูปภาพที่นี่

1,30,0,0 หมุนลง 30 องศา

ป้อนคำอธิบายรูปภาพที่นี่

1,0,30,0 หมุนไปทางขวา 30 องศา (หมายเหตุ: สำหรับมุมมองด้านข้างที่สมบูรณ์แบบการหมุนจะatan(1/golden ratio)= 31.7 องศาดังนั้นเรายังสามารถเห็นเศษไม้สีฟ้าเล็ก ๆ )

ป้อนคำอธิบายรูปภาพที่นี่

1,0,20,0 หมุนไปทางขวา 20 องศา

ป้อนคำอธิบายรูปภาพที่นี่

1,60,10, -63 หมุนลงไปทางขวาและขึ้น (ตัวอย่างของการวางแนวเป็นไปได้ด้วยการหมุน 3 ครั้ง)

ป้อนคำอธิบายรูปภาพที่นี่

0.030 dodecahedron ปกติ

ป้อนคำอธิบายรูปภาพที่นี่

2,0,20,0 dodecahedron ที่ดี

ป้อนคำอธิบายรูปภาพที่นี่

3,45,45,45 dodecahedron ยอดเยี่ยม ป้อนคำอธิบายรูปภาพที่นี่


3

Mathematica, 426 424 ไบต์

Graphics3D[{Red,Yellow,Green,Cyan,Blue,Magenta}~Riffle~(a=Partition)[Polygon/@Uncompress@"1:eJxtkjEKwkAURNeoySYgeAVP4QFsrcTGTiyUBcEith7A2wgKgpVH8/vgs2TYZmAyw9/5k784XDbHVwihnxisU39N9SiEdI8GO/uWHpXBtjFAgJ7HToFl5WabEdJ+anCqDb6dU9RP65NR59EnI0CZDAWYjFmomBmPCn3/hVVwc9s4xYd66wYqFJVvhMz75vWlHIkhG2HBDJ1V3kYps7z7jG6GomIu/QUJKTGkdtlX2pDM8m6pydyzHIOElBhyG6V9cxulzPldaVJ6lpuUkKUTzWcm+0obkrn0f3OT0rMc0jDkD37nlUo="~a~3~a~5,2],Boxed->1<0]

ใช้ในตัวGraphics3Dเพื่อแสดงรูปร่าง ไบต์ส่วนใหญ่ถูกใช้โดยตำแหน่งจุดสุดยอดที่บีบอัดอย่างไรก็ตามซึ่งถูกPartitionเอ็ดเป็นรูปแบบที่สามารถใช้งานPolygonได้ สุดท้าย:

โปรดทราบว่ารูปร่างนี้สามารถหมุนได้ด้วยการคลิกและลาก


OMG ฉันจะลบ dodecahedron ปกติ! เท่าที่ฉันสามารถบอกได้ (ฉันไม่รู้หรือมี Mathematica) สิ่งนี้สอดคล้องกับกฎดังนั้น +1
เลเวลริเวอร์

@ สตีฟเวอร์ริลล์ฉันไม่คิดว่ามันจะเปลี่ยนขนาดมากเกินไป แต่ฉันไม่ต้องการเขียนมันใหม่ตั้งแต่ต้น
LegionMammal978

คำตอบของคุณยังคงถูกต้องฉันจะไม่เปลี่ยนกฎมันจะเป็นรูปแบบที่ไม่ดี อย่างไรก็ตามนอกเหนือจากโบนัส 0.7 สำหรับโพลีดราสามดาวที่ฉันได้รับรางวัลสำหรับคำตอบที่สามารถสร้างโพลีเฮดราได้มากที่สุดสี่แบบ หากคุณตัดสินใจที่จะอัปเดตคำตอบของคุณฉันคิดว่าคุณอาจบันทึกจำนวนมากได้ด้วยการสร้างพิกัดแบบอัลกอริธึม (ดูหัวข้อข้อมูลที่เป็นประโยชน์ของคำถาม)
Level River St

@ สตีฟเวอร์ริลล์ฉันต้องการ แต่แน่นอนว่าจุดสุดยอดเกี่ยวข้องกับรากของควอร์ติคและฉันไม่สามารถหารูปแบบได้
LegionMammal978
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.