3 ডি নেট আঁকুন - প্লাটোনিক সলিডস


14

এটি বরং আরও কঠিন অঙ্কন 3 ডি নেট - আর্কিমেডিয়ান সলিউডগুলির মূল সংস্করণ ।

আমার কাছে 3 ডি নেটগুলির জন্য দুর্বলতা রয়েছে যা কাটা এবং ভাঁজ করার সময় আপনাকে কাগজ বা কার্ডের বাইরে 3 ডি আকার তৈরি করতে দেয়। কাজটি সহজ, আপনি সবচেয়ে সংক্ষিপ্ততম প্রোগ্রামটি লিখুন যা 5 টি প্লোটোনিক সলিউডের জন্য জাল আঁকতে পারে। আউটপুটটি আপনার নির্বাচনের (পিএনজি, জেপিজি, ইত্যাদি) কোনও বুদ্ধিমান বিন্যাসে একটি চিত্র ফাইল হওয়া উচিত।

পাঁচটি আকারই http://en.wikedia.org/wiki/Platonic_solid এ বর্ণিত । তাদের জালগুলি দেখতে দেখতে এটির মতো ( http://www.Nnewscientist.com/gallery/unfolding-theearear/2 থেকে নেওয়া )।

এখানে চিত্র বর্ণনা লিখুন

ইনপুট: 1 থেকে 5 অবধি একটি পূর্ণসংখ্যা ধরুন যে আকারগুলি তাদের পাশের সংখ্যার সাথে সংখ্যা অনুসারে সংখ্যায়িত করা হয়েছে। সুতরাং, 1 টি টেটেরাহেড্রন এবং 5 টি আইকোশেড্রন হবে।

আউটপুট: একটি আকৃতির ফাইল যা সেই আকৃতির নেট থাকে। অভ্যন্তরীণ লাইনগুলি সহ কেবল রূপরেখা ঠিক আছে। এটি রঙ দিয়ে পূরণ করার প্রয়োজন নেই

আপনি নিজের পছন্দমতো প্রোগ্রামিং ভাষার পাশাপাশি যে কোনও লাইব্রেরি বিশেষত এই প্রতিযোগিতার জন্য তৈরি করেননি। উভয়ই অনলাইনে (উভয় অর্থে) অবাধে উপলব্ধ হওয়া উচিত।

আমি ঠিক এক সপ্তাহের সময়ের মধ্যে স্বল্পতম অক্ষরের সাথে উত্তরটি গ্রহণ করব।

বিজয়ী। শুধুমাত্র একটি প্রবেশকারী কিন্তু এটি দুর্দান্ত ছিল। বিজয়ী হ'ল ... আমার প্রিয় কোড গল্ফের টুকরার জন্য রউফিও।

উত্তর:


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" এর মতো স্ট্রিংয়ের জন্য এটি "ফরোয়ার্ড (কোণ); বাম (কোণ) কার্যকর করে;" সদ্য নির্মিত স্থানীয় ফাংশনগুলিকে কল করে। শেষ লাইনটি 'o' নামে একটি ফাইল আউটপুট করে যা টার্কেল ফাংশনটি ব্যবহার করে পোস্টস্ক্রিপ্ট ফর্ম্যাট ফর্ম্যাটে রয়েছে।

চালানোর জন্য :

এটিকে একটি ফাইলে অনুলিপি করুন এবং সেখান থেকে চালান। আপনি যখন এটি চালান, এটি 1 এবং 5 এর মধ্যে সংখ্যার ইনপুটটির জন্য অপেক্ষা করবে (আমি কেবল এটি পরিবর্তন করেছি যাতে এটি কচ্ছপ স্থাপনের আগে জিজ্ঞাসা করে)। আপনি কোনও সংখ্যার ইনপুট করার সময় একটি উইন্ডো পপ আপ করে নেট আঁকবে। আপনি যদি এটি দ্রুত যেতে চান তবে আপনি t.speed(200)আগে যুক্ত করতে পারেন setup

আপনি এটি দোভাষীতে অনুলিপি করতে পারেন, তবে যখন raw_input()এটি ডাকা হয় পরবর্তী স্ট্রিংটি "t.setup(.9,.9)"কোনও সংখ্যার পরিবর্তে আপনি ইনপুট গ্রহণ করেন mes সুতরাং আপনি যদি এটি করেন তবে অবধি অনুলিপি raw_input()করুন, কোনও সংখ্যা ইনপুট করুন, বাকীটি অনুলিপি করুন paste এটি সামগ্রিকভাবে চালানোর উদ্দেশ্যে করা হয়েছে। অথবা আপনি এটি কোনও ফাংশনে অনুলিপি করে কল করতে পারেন।

এটির ফলাফলগুলি এখানে রয়েছে (পোস্টস্ক্রিপ্ট থেকে রূপান্তরিত):

দ্রষ্টব্য: উইন্ডোতে এগুলির অবস্থান পরিবর্তন হয়েছে, তবে তাদের সামগ্রিক আকারটি একই।

চতুস্তলক ঘনক্ষেত্র অষ্টতলক দ্বাদশতলক icosahedron

কোড গল্ফের জন্য এটি কিছুটা নিদারুণ শক্তি, তবে আমি আকারগুলির মধ্যে একটি ধারাবাহিক প্যাটার্ন খোঁজার চেষ্টা করে ক্লান্ত হয়ে পড়েছিলাম।


খুব কাছে. ডোডেকহেড্রন অবশ্যই আরও জটিল y
ফেলিপা

@ রাউফিও এটি খুব সুন্দর। ত্রিভুজটি (বা বর্গক্ষেত্র বা পঞ্চভূজ) সংজ্ঞায়িত করা এবং তারপরে কেবল এটিকে ঘোরানো / সরানো সম্ভব নয়? বা কার্যকরভাবে আপনি কি করেছেন?
ফেলিপা

কার্যকরভাবে, হ্যাঁ আমি যা করেছি তা কিন্তু বড় আকারের সাথে। উদাহরণস্বরূপ, আইকোস্যাড্রন দুটি ত্রিভুজ অঙ্কন করে অন্যটির উপরে একটি করে আঁকানো হয় এবং 5 বার এগিয়ে যায়, আবার একটি নতুন স্থানে পুনরায় সেট করে, হীরাটি আবার পেছনে টানা হয় এবং 5 বার পুনরাবৃত্তি করে। dসেই স্ট্রিং যা দুটি ত্রিভুজ করে, তাই এটি(d+'f')*5+setupPosition+(d+'b')*5
রউফিও

@ রাউফিও গল্ফ কোডটি আমার পক্ষে কাজ করে না। এটি একটি উইন্ডো খোলে যা বেশিরভাগ ফাঁকা। তারপরে আমি রিটার্ন টিপলে আমি পি = (অর্ড (কাঁচা_পিন্ড ()) - 49) * 2 টাইপ এরর: অর্ড () একটি অক্ষর আশা করেছি, তবে দৈর্ঘ্যের দৈর্ঘ্য 0 পাওয়া গেছে
ফেলিপা

1
@ ফিলিপা জালটি setupধরে রাখতে কচ্ছপের উইন্ডোটিকে যথেষ্ট বড় করে তোলে। সঙ্গে একই জিনিস goto, এটা -200 করতে 'কচ্ছপ' চলে 150. clearদ্বারা তৈরি লাইন মুছে ফেলা হবে goto। অঙ্কন স্থাপনের জন্য তাদের কেবল আদেশ commands p=(ord(raw_input())-49)*2আপনি যে আকারটি চান তা অনুসারে 1 থেকে 5 পর্যন্ত একটি সংখ্যা নেয়।
রউফিও

6

ম্যাথামেটিকাল

প্রতিযোগিতার বাইরে, একটি মুক্ত ভাষা নয় (যদি না কোনও বিনামূল্যে ট্রায়াল বিনামূল্যে গণনা করা হয়)

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

ব্যবহার:

f /@ Range@5

গণিত গ্রাফিক্স


1
গণিত যে কোনওভাবেই নিখরচায় নয়। তবে খুব সুন্দর উত্তর।
ফেলিপা

@ ফিলিপা এটি রাস্পবেরি পাইতে বিয়ারের মতো মুক্ত।
shx

আপনি কি জানেন যে এই ফ্রি কম্পিউটারে, রাস্পবেরি পাই
আন্ডারগ্রাউন্ডোমোরিয়েল


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 টি যুক্তি সহ প্রধান ফাংশন কল করে calls এর সিনট্যাক্সটি বেশ ফুলে উঠেছে, তাই আমার আগের স্কোরটি হারাতে আমাকে অন্য কোথাও বাইটগুলি শেভ করতে হয়েছিল।

নতুন সংস্করণে 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

@ ফেজ হাহা, ধন্যবাদ, আমি আসলে htচিত্রটির জন্য এটি আড়াল করার জন্য একটি করার কথা বিবেচনা করেছি । আমি খুশী আমি না!
স্তর নদী সেন্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.