3Dネットの描画-プラトンの立体


14

これは、3Dネットの描画がかなり難しいベーシックバージョンです-アルキメデスの立体

3Dネットには弱点があり、切り取って折り畳むと、紙やカードから3D形状を作成できます。タスクは簡単です。5つのプラトンの立体のネットを描く最短のプログラムを書いてください。出力は、任意の適切な形式(png、jpgなど)の画像ファイルである必要があります。

5つの形状はすべて、http://en.wikipedia.org/wiki/Platonic_solidで説明されています。彼らのネットはこのように見えます(http://www.newscientist.com/gallery/unfolding-the-earth/2から取得)。

ここに画像の説明を入力してください

入力: 1〜5の整数。形状には、辺の数の順に番号が付けられていると仮定します。したがって、1は四面体、5は二十面体になります。

出力:その形状のネットを含む画像ファイル。内部線を含むアウトラインだけで問題ありません。色で塗りつぶす必要はありません

好きなプログラミング言語と、このコンペティション用に特別に作成されていないライブラリを使用できます。ただし、どちらもオンラインで(両方の意味で)自由に利用できる必要があります。

正確に1週間以内に最小文字数の回答を受け入れます。

勝者。参加者は1人だけですが、素晴らしかったです。勝者は...私が今までで一番好きなコードゴルフの作品である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図形の角度でタートルカーソルを動かす演算子としてプリミティブインタープリターを実装しました。一度に、1つの角度だけ回転します。文字列(擬似サブルーチンのような)を再利用して文字列を圧縮しましたが、それ以外は、最適なパスを使用しているかどうかを確認しませんでした。ポストスクリプトファイルに出力します。

ゴルフされていないコードの簡単な説明:

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

組み込みのturtleモジュールをインポートし、文字列を短縮するマクロを定義します。turtleモジュールはコマンドを使用して「亀」を画面上で動かします(すなわち、forward(100)、left(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

これは私が気に入っている部分です。1文字のローカル関数を作成するため、定義済みの文字列を使用して呼び出しを短縮および自動化できます。

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")

forループは、コマンドシーケンス文字列内のコマンドを受け取って実行するため、「fl」などの文字列の場合、「forward(angle); left(angle);」を実行します 新しく作成されたローカル関数を呼び出します。最後の行は、タートル関数を使用したポストスクリプト形式の「o」というファイルを出力します。

実行するには

それをファイルにコピーして、そこから実行します。実行すると、1から5の間の数値入力を待機します(タートルを設定する前に尋ねるように変更しました)。数字を入力すると、ウィンドウがポップアップしてネットを描画します。速くしたい場合は、t.speed(200)前に追加できますsetup

インタプリタにコピーアンドペーストできますが、raw_input()呼び出されると"t.setup(.9,.9)"、数値ではなく入力した次の文字列を消費します。したがって、これを行う場合はraw_input()、残りの部分をコピーして貼り付けるよりも、数値を入力するまでコピーします。全体として実行することを目的としています。または、関数にコピーして呼び出すこともできます。

出力は次のとおりです(ポストスクリプトから変換):

注:ウィンドウ内のこれらの位置は変更されていますが、全体的な形状は同じです。

四面体 立方体 八面体 十二面体 二十面体

コードゴルフでは少し強引ですが、形の間で一貫したパターンを見つけようとするのにうんざりしました。


とても近い。正十二面体は間違いなくよりトリッキーです。
フェリパ

@Raufioとてもいいです。三角形(または正方形または五角形)を定義し、それを回転/移動することはできませんか?それとも効果的にあなたがやったことですか?
フェリパ

事実上、はい、それは私がやったことですが、より大きな形をしています。たとえば、正二十面体は、2つの三角形を重ねて描画し、5回前進し、新しい位置にリセットして、ダイヤモンドを再び後退させて5回繰り返すことで描画されます。dは2つの三角形を行う文字列であるため、そうです(d+'f')*5+setupPosition+(d+'b')*5
-Raufio

@Raufioゴルフのコードは私には機能しません。ほとんど空白のウィンドウが開きます。Iを押しリターンI GET P =場合(ORD(raw_input()) - 49)* 2はTypeError:ORD()文字を期待しますが、長さ0の文字列が見つかりました
felipa

1
@felipa setupは、タートルウィンドウを、ネットを保持するのに十分な大きさにします。と同じことでgoto、「タートル」を-200、150に移動cleargotoます。描画を設定するためのコマンドだけ。p=(ord(raw_input())-49)*2必要な形状に対応する1〜5の数字を取ります。
ラウフィオ

6

Mathematica

自由な言語ではなく、非競争(無料試用版無料と見なされない限り)

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

使用法:

f /@ Range@5

Mathematicaグラフィックス


1
Mathematicaはどちらの意味でも完全に無料ではありません。しかし、とてもいい答えです。
フェリパ

@felipaは、Raspberry Piのビールのように無料です。
shrx

その無料のコンピューターでは、ラズベリーパイ
アンダーグラウンド

6

Python 2(cairoを使用)-239

from cairo import*
s=PSSurface(None,99,99)
g=Context(s)
g.move_to(30,20)
a=str([34,456,3455,568788,3454445555][input()-1])
f=6.28
for c in a+a[::-1]:exec'g.rel_line_to(8,0);g.rotate(f/int(a[0]));'*int(c);f=-f
g.stroke()
s.write_to_png('o')

結果:

結果


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

これを読み返すと、元のバージョンが仕様通りに書かれていなかった(数値引数を取り、1つの図形を描いた)のではなく、他の回答によって解釈された(すべての図形を描いた)ことがわかります。新しいバージョンはこれを修正します。例として呼び出されることを期待していますq 5cs画面をクリアして亀を北に向ける前に行う必要があります。

qp3つの引数でメイン関数を呼び出します。この構文はかなり肥大化しているので、以前のスコアに勝つために、バイトを他の場所で削る必要がありました。

の新しいバージョンpは3つの引数を取ります。ネットを1つしかプロットしないためx、その必要はありませんyd、サブユニット間のピッチはそのままです。s は、ポリゴンごとの辺の数でありn、2つの異なるものをエンコードするようになりました> n/8は、プロットするサブユニットの数でn*45あり、開始前にタートルを回転させる角度です(自然なmod 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の12面体ネット、2/3のキューブネットを形成します(2つのサブユニットが描かれ、中央の2つの正方形が重なります)。

未ゴルフコード

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 haha​​、ありがとう、私は実際にht画像のためにそれを隠すことを検討しました。しなかったことがうれしいです!
レベルリバーセント
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.