ड्रॉइंग 3 डी नेट - प्लेटोनिक सॉलिड्स


14

यह अधिक कठिन ड्राइंग 3 डी नेट का एक मूल संस्करण है - आर्किमिडियन ठोस

मेरे पास 3 डी नेट के लिए कमजोरी है जो जब कट आउट और मुड़ा हुआ होता है तो आप कागज या कार्ड से 3 डी आकार बनाने की अनुमति देते हैं। कार्य सरल है, सबसे छोटा कार्यक्रम लिखो जो आप 5 प्लैटोनिक ठोस के लिए जाल खींच सकते हैं। आउटपुट आपके चयन (png, jpg, आदि) के किसी भी समझदार प्रारूप में एक छवि फ़ाइल होनी चाहिए।

सभी पांच आकृतियों का वर्णन http://en.wikipedia.org/wiki/Platonic_solid पर किया गया है । उनका जाल इस तरह दिखता है ( http://www.newscientist.com/gallery/unfolding-the-earth/2 से लिया गया )।

यहाँ छवि विवरण दर्ज करें

इनपुट: 1 से 5 तक का एक पूर्णांक। मान लें कि उनके पास मौजूद पक्षों की संख्या के क्रम में आकृतियों को क्रमांकित किया गया है। तो, 1 एक tetrahedron और 5 icosahedron होगा।

आउटपुट: उस आकृति के लिए नेट वाली एक छवि फ़ाइल। बस आंतरिक रेखाओं सहित रूपरेखा ठीक है। इसे रंगों से भरने की कोई आवश्यकता नहीं है

आप किसी भी प्रोग्रामिंग भाषा का उपयोग कर सकते हैं जिसे आप पसंद करते हैं और साथ ही साथ किसी भी पुस्तकालय को जो इस प्रतियोगिता के लिए विशेष रूप से नहीं बनाया गया था। दोनों को स्वतंत्र रूप से उपलब्ध होना चाहिए (दोनों इंद्रियों में) ऑनलाइन।

मैं ठीक एक सप्ताह के समय में पात्रों की सबसे छोटी संख्या के साथ उत्तर स्वीकार करूंगा।

विजेता। केवल एक प्रवेशी लेकिन यह अद्भुत था। विजेता है ... Raufio कोड गोल्फ के लिए मेरा पसंदीदा टुकड़ा क्या है।

जवाबों:


8

पायथन, 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ऑपरेटर्स के साथ एक आदिम इंटरप्रेटर लागू किया जो आकृतियों के कोण पर कछुए के कर्सर को घुमाता है। एक समय में, यह केवल एक कोण बनाता है। मैंने स्ट्रिंग्स को पुन: उपयोग करके स्ट्रिंग्स को संकुचित कर दिया (इस तरह के प्यूसीडो-सबरूटीन्स की तरह), इसके अलावा, मैंने यह देखने के लिए जांच नहीं की कि क्या मैं सबसे अच्छा पथ का उपयोग कर रहा हूं। यह एक पोस्टस्क्रिप्ट फ़ाइल के लिए आउटपुट करता है।

अन-गोल्फ कोड की थोड़ी व्याख्या:

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
]

यह सूची कोण और आंदोलन अनुक्रम रखती है। ऑक्टोहेड्रन के साथ पुन: उपयोग करने के लिए टेट्राहेड्रॉन को बचाया गया था।

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 के बीच) लेने से शुरू होता है, और इसे एक सूचकांक में परिवर्तित करता है जो नेटलिस्ट में आकृति स्ट्रिंग को इंगित करता है। ये सेटअप पूरे नेट को दिखाने के लिए कछुआ है। यदि कार्य केवल उन्हें आकर्षित करने के लिए किया गया था, तो इन्हें छोड़ा जा सकता है, लेकिन चूंकि हमें एक चित्र आउटपुट की आवश्यकता होती है।

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

लूप के लिए कमांड अनुक्रम स्ट्रिंग में कमांड्स लेता है और उन्हें निष्पादित करता है, इसलिए "fl" जैसी स्ट्रिंग के लिए, यह "फॉरवर्ड (एंगल)" निष्पादित करता है; लेफ्ट (एंगल); " नए बनाए गए स्थानीय कार्यों को कॉल करके। अंतिम पंक्ति 'ओ' नामक एक फ़ाइल को आउटपुट करती है जो कछुए फ़ंक्शन का उपयोग करके पोस्टस्क्रिप्ट प्रारूप प्रारूप में है।

चलाने के लिए :

इसे एक फ़ाइल में कॉपी करें और इसे वहां से चलाएं। जब आप इसे चलाते हैं, तो यह 1 और 5 के बीच एक नंबर इनपुट की प्रतीक्षा करेगा (मैं इसे सिर्फ इसलिए बदल देता हूं ताकि यह कछुए को स्थापित करने से पहले पूछता है)। जब आप एक नंबर इनपुट करते हैं, तो एक विंडो पॉप अप करती है और नेट खींचती है। यदि आप चाहते हैं कि यह तेजी से आगे बढ़े तो आप t.speed(200)पहले जोड़ सकते हैं setup

आप इसे दुभाषिया में कॉपी-पेस्ट कर सकते हैं, लेकिन जब raw_input()इसे कहा जाता है तो आप "t.setup(.9,.9)"संख्या के बजाय अगले स्ट्रिंग का उपभोग करते हैं । इसलिए यदि आप ऐसा करते हैं raw_input(), तो कॉपी पेस्ट करें, बाकी की कॉपी पेस्ट की तुलना में एक नंबर इनपुट करें। इसे संपूर्ण रूप में चलाने का इरादा है। या आप इसे किसी फ़ंक्शन में कॉपी कर सकते हैं और कॉल कर सकते हैं।

यहाँ यह आउटपुट (पोस्टस्क्रिप्ट से परिवर्तित) हैं:

नोट: विंडो में इन की स्थिति बदल गई है, लेकिन उनका समग्र आकार समान है।

चतुर्पाश्वीय घनक्षेत्र octahedron द्वादशफ़लक विंशतिफलक

यह कोड गोल्फ के लिए थोड़ा क्रूर बल है, लेकिन मैं आकृतियों के बीच एक सुसंगत पैटर्न खोजने की कोशिश कर थक गया।


बहुत करीब। डोडेकेहेड्रॉन निश्चित रूप से अधिक मुश्किल है।
felipa

@Raufio यह बहुत अच्छा है। क्या एक त्रिकोण (या वर्ग या पेंटागन) को परिभाषित करना संभव नहीं है और फिर बस इसके बारे में घुमा / घुमाएं? या यह प्रभावी रूप से आपने क्या किया है?
felipa

प्रभावी रूप से, हाँ, यही मैंने किया, लेकिन बड़े आकार के साथ। उदाहरण के लिए, इकोसाहेड्रॉन को दो त्रिभुजों को खींचकर, एक के ऊपर एक, और 5 बार आगे की ओर खींचा जाता है, फिर एक नए स्थान पर रीसेट करते हुए, हीरे को फिर से खींचते हुए फिर से 5 बार दोहराते हुए। dवह तार है जो दो त्रिकोण करता है, तो वह है(d+'f')*5+setupPosition+(d+'b')*5
रऊफियो

@Raufio गोल्फ कोड मेरे लिए काम नहीं करता है। यह एक विंडो खोलता है जो ज्यादातर खाली है। अगर मैं उसके बाद रिटर्न प्रेस करता हूं तो मुझे p = (ord (raw_input ()) - 49) * 2 TypeError: ord () एक चरित्र की उम्मीद है, लेकिन स्ट्रिंग की लंबाई 0 मिली
felipa

1
@felipa setupनेट को होल्ड करने के लिए कछुए की खिड़की को काफी बड़ा बनाता है। एक ही बात के साथ goto, यह 'कछुए' को -200, 150 पर ले clearजाता है goto। द्वारा बनाई गई रेखा को साफ करता है । ड्राइंग स्थापित करने के लिए उनकी बस आज्ञा है। p=(ord(raw_input())-49)*25 के माध्यम से 1 नंबर लेता है, जो आप चाहते हैं कि किस आकार के अनुरूप है।
रफियो

6

मेथेमेटिका

प्रतियोगिता से बाहर, एक स्वतंत्र भाषा नहीं (जब तक कि एक नि: शुल्क परीक्षण मुक्त के रूप में मायने नहीं रखता)

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

उपयोग:

f /@ Range@5

गणितज्ञ ग्राफिक्स


1
गणितज्ञ निश्चित रूप से किसी भी मायने में स्वतंत्र नहीं है। हालांकि बहुत अच्छा जवाब।
felipa

@felipa यह रास्पबेरी पाई पर बीयर की तरह मुफ्त है।
श्रक्स

आप जानते हैं, कि नि: शुल्क कंप्यूटर, रास्पबेरी पाई पर
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 5csस्क्रीन को साफ़ करने और कछुए को उत्तर की ओर इंगित करने से पहले किया जाना चाहिए।

qp3 तर्कों के साथ मुख्य फ़ंक्शन को कॉल करता है। इसके लिए वाक्यविन्यास बहुत फूला हुआ है, इसलिए अपने पिछले स्कोर को हराने के लिए मुझे बाइट्स को कहीं और से शेव करना पड़ा।

p3 तर्कों के नए संस्करण । इसकी कोई आवश्यकता नहीं है xऔर yक्योंकि हम केवल एक जाल की साजिश करते हैं, लेकिन dसबयूनिट के बीच की पिच बनी हुई है। s अभी भी बहुभुज प्रति पक्षों की संख्या है, और nअब दो अलग-अलग चीजों के लिए एन्कोड करता है> n/8प्लॉट किए जाने वाले सबयूनिट्स की संख्या है, और n*45एक कोण है जिसके माध्यम से घुमाव के लिए प्राकृतिक मॉड 360 का लाभ लेना शुरू करने से पहले कछुए को चालू करना होगा। )

बेहतर लूपिंग sदाएं हाथ के रोटेशन के साथ ड्राइंग लाइनें और s+2एक ही लूप में बाएं हाथ के रोटेशन के साथ लाइनों को पूरा करता है ।

मेरी पहली पोस्ट के समय की तुलना में कैरमेन दुभाषिया गायब व्हाट्सएप का कम सहिष्णु लगता है, लेकिन कोड 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 बहुभुजों का एक उप-भाग बन जाता है, जिसे सभी नेट बनाने के लिए लंबवत रूप से अनुवादित किया जा सकता है (ऑक्टाहेड्रोन को छोड़कर, जो इकोसैहेड्रन और टेट्राहेड्रॉन के ड्राइंग पर सवारी को रोक देता है)। सबयूनिट 1 टेट्राहेड्रोन नेट, 1/5 इकोसैड्रोन नेट, 1/3 डोडेकाहेड्रोन नेट और 2/3 क्यूब नेट (दो सबयूनिट खींचे जाते हैं, मध्य दो भागों के साथ अतिव्यापी होते हैं।)।

अघोषित कोड

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

@phase हाहा, धन्यवाद, मैंने वास्तव htमें छवि के लिए इसे छिपाने के लिए एक करने पर विचार किया । मुझे खुशी है कि मैंने नहीं किया!
लेवल रिवर सेंट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.