การวาดอวน 3d - ของแข็งอย่างสงบ


14

นี่เป็นรุ่นพื้นฐานของการวาดอวน 3 มิติที่ค่อนข้างยากกว่า- ของแข็งอาร์คิมีดี

ฉันมีจุดอ่อนสำหรับมุ้ง 3 มิติซึ่งเมื่อตัดออกและพับให้คุณสร้างรูปทรง 3 มิติจากกระดาษหรือการ์ด งานนั้นง่ายเขียนโปรแกรมที่สั้นที่สุดที่คุณสามารถวาดอวนสำหรับ 5 Platonic solids เอาต์พุตควรเป็นไฟล์รูปภาพในรูปแบบที่เหมาะสมกับการเลือกของคุณ (png, jpg เป็นต้น)

ทั้งห้ารูปทรงจะมีคำอธิบายที่http://en.wikipedia.org/wiki/Platonic_solid อวนของพวกเขามีลักษณะเช่นนี้ (นำมาจากhttp://www.newscientist.com/gallery/unfolding-the-earth/2 )

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

อินพุต:จำนวนเต็มตั้งแต่ 1 ถึง 5 สมมติว่ารูปร่างมีหมายเลขตามลำดับของจำนวนด้านที่มี ดังนั้น 1 จะเป็นจัตุรมุขและ 5 ทรงกระบอก

เอาท์พุท:ไฟล์ภาพที่มีตาข่ายสำหรับรูปร่างนั้น เพียงแค่โครงร่างรวมถึงเส้นภายในก็โอเค ไม่จำเป็นต้องเติมสีด้วย

คุณสามารถใช้ภาษาการเขียนโปรแกรมใด ๆ ที่คุณชอบเช่นเดียวกับห้องสมุดใด ๆ ที่ไม่ได้ทำขึ้นเป็นพิเศษสำหรับการแข่งขันครั้งนี้ ทั้งสองควรพร้อมใช้งานได้อย่างอิสระ (ในความรู้สึกทั้งสอง) ออนไลน์

ฉันจะยอมรับคำตอบด้วยจำนวนตัวอักษรที่น้อยที่สุดในเวลาหนึ่งสัปดาห์

ผู้ชนะ มีผู้เข้าร่วมเพียงคนเดียว แต่ยอดเยี่ยมมาก ผู้ชนะคือ ... Raufio สำหรับชิ้นส่วนของรหัสกอล์ฟที่ฉันโปรดปราน

คำตอบ:


8

Python, 456 429 381

import turtle as t
L="fl"
R="fr"
d=L*3+R*3
b=(d+R)*3
a=[b,120,L*3+"fflflffflflfrflflfffl"+R*4+"flf",90,b+"ffrfrflffrffrfrfrflflf",120,(R*5+L*5+R+L)*5+"rrfr"+L*5+R*2+L*2+R*4+"f",72,(d+"f")*5+"rfl"+((d+"b")*5)[:-1],120]
l=t.lt
f=t.fd
b=t.bk
r=t.rt
p=input()*2-2 
t.setup(.9,.9)
t.goto(-200,150)
t.clear()
for c in a[p]:exec c+"(a[p+1])"
t.getscreen().getcanvas().postscript(file="o")

ฉันใช้ล่ามแบบดั้งเดิมพร้อมกับl r f bตัวดำเนินการที่เลื่อนเคอร์เซอร์เต่าไปรอบ ๆ ที่มุมของรูปร่าง ในคราวเดียวมันจะเปลี่ยนเพียงมุมเดียว ฉันบีบอัดสตริงโดยใช้สตริงซ้ำ (เช่นรูทีนย่อย psuedo) นอกจากนั้นฉันไม่ได้ตรวจสอบว่าฉันใช้เส้นทางที่ดีที่สุดหรือไม่ มันส่งออกไปยังไฟล์ Postscript

คำอธิบายเล็ก ๆ ของรหัสที่ไม่ตีกอล์ฟ:

import turtle as t
Left="fl"
Right="fr"
diamond= Left*3 + Right*3
tetrahedron=(d+R)*3 #used to be b

นำเข้าโมดูลเต่าในตัวและกำหนดมาโครที่ทำให้สตริงสั้นลง โมดูลเต่าใช้คำสั่งเพื่อย้าย 'เต่า' ไปทั่วหน้าจอ (เช่นไปข้างหน้า (100), ซ้าย (90))

netList=[
   #tetrahedron
   tetrahedron,120,
   #cube
   Left*3+"fflflffflflfrflflfffl"+Right*4+"flf",90,
   #octohedron, builds off the tetrahedron
   tetrahedron+"ffrfrflffrffrfrfrflflf",120,
   #dodecahedron
   (Right*5 + Left*5 + Right + Left)*5
    +"rrfr"+
    Left*5 + Right*2 + Left*2 + Right*4 + "f",72,
   #icosahedron
   (diamond+"f")*5 +"rfl"+((diamond+"b")*5)[:-1],120
]

รายการนี้เก็บมุมและลำดับการเคลื่อนไหว จัตุรมุขถูกบันทึกไว้เพื่อนำมาใช้ใหม่ด้วย octohedren

l=t.left
f=t.forward
b=t.back
r=t.right

นี่คือส่วนที่ฉันชอบมันทำให้ฟังก์ชั่นท้องถิ่นตัวละครเดียวเพื่อให้การโทรสามารถสั้นและอัตโนมัติผ่านสตริงที่กำหนดไว้ล่วงหน้า

input=int(raw_input())*2-2 
t.setup(.9,.9)
t.goto(-200,150)
t.clear()

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

for command in netList[input]:
    exec command+"(netList[input+1])"
t.getscreen().getcanvas().postscript(file="o")

ห่วงสำหรับใช้คำสั่งในสตริงคำสั่งและดำเนินการพวกเขาดังนั้นสำหรับสตริงเช่น "fl" นี้จะดำเนินการ "ไปข้างหน้า (มุม); ซ้าย (มุม);" โดยการเรียกฟังก์ชั่นท้องถิ่นที่สร้างขึ้นใหม่ บรรทัดสุดท้ายจะส่งไฟล์ที่เรียกว่า 'o' ซึ่งอยู่ในรูปแบบ postscript โดยใช้ฟังก์ชันเต่า

วิธีเรียกใช้ :

คัดลอกลงในไฟล์และเรียกใช้จากที่นั่น เมื่อคุณเรียกใช้มันจะรอการป้อนตัวเลขระหว่าง 1 ถึง 5 (ฉันเพิ่งเปลี่ยนเพื่อให้ถามก่อนตั้งค่าเต่า) เมื่อคุณป้อนตัวเลขหน้าต่างจะปรากฏขึ้นและดึงตาข่าย ถ้าคุณอยากให้มันเป็นไปได้เร็วขึ้นคุณสามารถเพิ่มก่อนt.speed(200)setup

คุณสามารถคัดลอกวางลงในล่าม แต่เมื่อraw_input()ถูกเรียกมันจะใช้สตริงถัดไปที่คุณป้อน"t.setup(.9,.9)"แทนตัวเลข ดังนั้นหากคุณทำสิ่งนี้ให้คัดลอกจนกระทั่งraw_input()ใส่หมายเลขแล้วคัดลอกวางที่เหลือ มันตั้งใจที่จะทำงานโดยรวม หรือคุณสามารถคัดลอกลงในฟังก์ชั่นและเรียกมัน

นี่คือผลลัพธ์ (แปลงจาก postscript):

หมายเหตุ: ตำแหน่งของสิ่งเหล่านี้ในหน้าต่างมีการเปลี่ยนแปลง แต่รูปร่างโดยรวมจะเหมือนกัน

จัตุรมุข ลูกบาศก์ รูปแปดด้าน เฟ ฮอว์คิง

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


ใกล้มาก. dodecahedron นั้นยากกว่ามาก
felipa

@Raufio มันดีมาก เป็นไปไม่ได้ที่จะกำหนดรูปสามเหลี่ยม (หรือสี่เหลี่ยมจัตุรัสหรือรูปห้าเหลี่ยม) แล้วหมุน / เคลื่อนย้ายไปมาหรือไม่? หรือว่ามีประสิทธิภาพสิ่งที่คุณทำ?
felipa

อย่างมีประสิทธิภาพใช่ว่าเป็นสิ่งที่ฉันทำ แต่มีรูปร่างที่ใหญ่กว่า ตัวอย่างเช่น icosahedron ถูกวาดโดยการวาดสามเหลี่ยมสองอันหนึ่งอันอยู่ด้านบนของอีกอันหนึ่งและเคลื่อนที่ไปข้างหน้า 5 ครั้งจากนั้นรีเซ็ตที่ตำแหน่งใหม่วาดรูปสี่เหลี่ยมขนมเปียกปูนอีกครั้งแล้วทำซ้ำ 5 ครั้ง dเป็นสตริงที่ทำรูปสามเหลี่ยมสองรูปดังนั้นมันจึงเป็น(d+'f')*5+setupPosition+(d+'b')*5
Raufio

@Raufio รหัส golfed ไม่ทำงานสำหรับฉัน จะเปิดหน้าต่างที่ว่างเปล่าเป็นส่วนใหญ่ ถ้าฉันกด return ฉันจะได้รับ p = (ord (raw_input ()) - 49) * 2 TypeError: ord () คาดว่าจะได้ตัวอักษร แต่พบว่าความยาวของสตริง 0
felipa

1
@felipa setupทำให้หน้าต่างเต่าใหญ่พอที่จะถือตาข่ายได้ สิ่งเดียวกันกับgotoมันย้าย 'เต่า' เพื่อ -200, 150 ล้างเส้นที่ทำโดยclear gotoเพียงคำสั่งของพวกเขาสำหรับการตั้งค่าการวาดภาพ p=(ord(raw_input())-49)*2ใช้ตัวเลข 1 ถึง 5 สอดคล้องกับรูปร่างที่คุณต้องการ
Raufio

6

มาติกา

ออกจากการแข่งขันไม่ใช่ภาษาฟรี (ยกเว้นกรณีทดลองใช้ฟรีนับเป็นฟรี)

f[n_] := PolyhedronData[ Sort[PolyhedronData["Platonic", {"FaceCount","StandardName"}]][[n,2]],
                                                                                       "NetImage"]

การใช้งาน:

f /@ Range@5

กราฟิกทางคณิตศาสตร์


1
Mathematica ไม่ได้ฟรีอย่างแน่นอนในแง่ใด คำตอบที่ดีมาก
felipa

@felipa ฟรีเช่นเดียวกับเบียร์ใน Raspberry Pi
ยัก

คุณรู้หรือไม่ว่าคอมพิวเตอร์ฟรีนั้น raspberry pi
undergroundmonorail


3

โลโก้ขนาด 199 ไบต์

TO p:d:n:s
rt :n*45 for[i 1 :n/8][pu setxy :d*:i 0 pd repeat 2[for[k 1 :s*2+2][fd 40 rt (360-720*(:k>:s))/:s] rt 720/:s]]END
TO q:j
apply "p item :j [[70 9 3][56 23 4][70 16 3][105 26 5][40 42 3]]END

การอ่านย้อนหลังนี้ฉันเห็นว่าเวอร์ชันดั้งเดิมของฉันไม่สอดคล้องกับข้อมูลจำเพาะที่เขียน (ใช้อาร์กิวเมนต์ตัวเลขและวาดรูปหนึ่ง) แต่ตีความตามคำตอบอื่น ๆ (วาดทุกรูปร่าง) เวอร์ชันใหม่แก้ไขสิ่งนี้ q 5โดยคาดว่าจะเรียกว่าเป็นเช่น csควรทำก่อนเพื่อล้างหน้าจอ

qเรียกฟังก์ชั่นหลักที่pมี 3 ข้อโต้แย้ง ไวยากรณ์สำหรับเรื่องนี้ค่อนข้างพองตัวดังนั้นเพื่อให้ได้คะแนนก่อนหน้านี้ของฉันฉันจึงต้องกำจัดไบต์ที่อื่น

เวอร์ชันใหม่pใช้เวลา 3 ข้อโต้แย้ง ไม่จำเป็นต้องมีxและyเพราะเราวางแผนเพียงหนึ่งตาข่าย แต่dระดับเสียงระหว่างหน่วยย่อยยังคงอยู่ s ยังคงมีจำนวนด้านต่อรูปหลายเหลี่ยมและnตอนนี้เข้ารหัสสองสิ่งที่แตกต่างกัน> n/8คือจำนวนหน่วยย่อยที่จะลงจุดและn*45เป็นมุมที่เต่าต้องหมุนก่อนที่จะเริ่มต้น (ใช้ประโยชน์จาก mod ธรรมชาติ 360 สำหรับการหมุน )

การวนซ้ำที่ดีขึ้นทำให้การวาดsเส้นด้วยการหมุนทางขวาและs+2เส้นที่มีการหมุนซ้ายและขวาในการวนซ้ำครั้งเดียว

ล่าม Calormen ดูเหมือนว่าจะไม่ยอมให้มีช่องว่างที่หายไปได้น้อยไปกว่าตอนที่โพสต์แรกของฉัน แต่โค้ดทำงานได้ดีบนhttp://turtleacademy.com/playground/en

โลโก้ 200 ไบต์

TO p:x:y:d:n:s
for[i 1:n][pu setxy:x:y-:d*:i if:i<>6[pd]repeat 2[repeat:s[fd 40 rt 360/:s]repeat:s+2[fd 40 lt 360/:s]rt 720/:s]]END
p 0 200 40 7 3
p 70 0 80 2 3
p -200 200 105 3 5
rt 45
p 90 90 56 2 4

ล่ามที่http://www.calormen.com/jslogo/#จะถือว่าเต่านั้นชี้ไปทางทิศเหนือก่อนที่โปรแกรมจะทำงาน ใช้csคำสั่งเพื่อล้างหน้าจอชี้เต่าทางทิศเหนือและวางไว้ที่จุดเริ่มต้นในใจกลางของหน้าจอ

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

หน่วยพื้นฐานของอวนข้างต้นทั้งหมดคือคู่ของรูปหลายเหลี่ยมกลับไปด้านหลัง สิ่งเหล่านี้จัดเรียงเป็นแถว 2 แถวทำให้หน่วยย่อยของรูปหลายเหลี่ยม 4 รูปที่สามารถแปลในแนวตั้งเพื่อสร้างอวนทั้งหมด (ยกเว้นรูปแปดด้านซึ่งมีอุปสรรคในการนั่งบนรูปวาดของ icosahedron และ tetrahedron) subunit ประกอบด้วย 1 tetrahedron net, 1/5 ของ icosahedron net, 1/3 ของ dodecahedron net และ 2/3 ของ cube cube (สอง subunits ถูกวาด, ที่มีสองช่องตรงกลางซ้อนกัน)

รหัสไม่ได้รับการตอบ

TO p :x :y :d :n :s                 ;x,y=starting point d=negative vertical offset for each iteration n=#of iterations s=# of sides on polygon
  for[i 1 :n][                      ;iterate n times 
    pu                              ;pen up
    setxy :x :y- :d* :i             ;move pen to start of iteration
    if :i<>6[pd]                    ;pen down (supressed for i=6 to enable part of octahedron to be drawn with icosahedron)
    repeat 2[                       ;draw lower row of 2 polygons, then upper row of 2 polygons
      repeat :s[fd 40 rt 360/ :s]   ;starting at lower left of polygon facing up, draw righthand polygon
      repeat :s+2[fd 40 lt 360/ :s] ;starting at lower right of polygon facing up, draw lefthand polygon, duplicating last two sides
      rt 720/ :s                    ;return turtle to upwards facing in order to draw second row
    ]
  ]
END
cs
p 0 200 40 7 3                      ;draw icosahedron and left side of octahedron (6th iteration is suppressed)
p 70 0 80 2 3                       ;draw right side of octahedron, and tetrahedron
p -200 200 105 3 5                  ;draw dodecahedron
rt 45                               ;turn turtle in preparation for drawing cube
p 90 90 56 2 4                      ;draw cube

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