箱にらせんを描く


13

螺旋

この幾何学的ならせんは複雑に見えますが、描くのはかなり簡単です。次のボックスを使用してください。

ボックス

ボックスの角と次の角の上の設定距離を反時計回りに直線で引きます。

1行

このパターンを内側に向けて、常に次の行の角から設定距離だけ離れたままにします。ここにさらにいくつかの行があります。

モアーライン

ご覧のとおり、パターンが継続すると、スパイラルが中心に近づき、描画するボックスが回転し始めます。角度に関係なく、距離は一定のままであることに注意してください。

チャレンジ

インスピレーション(また、このコンセプト<3を紹介してくれた素晴らしい人にも感謝します)

1から25までの数値(おそらく小数)入力が与えられたら、このパターンを使用するディスクに画像を書き込むか、画面に出力を表示します。各コーナーからの距離は、ボックスの最初の辺の距離を入力で割ったものです。指定したコーナーからの距離が次の辺の長さより長くなるまで、パターンを内側に向けて続けます。

ルール

  • このスパイラル作成にはビルトインを使用できませんが、画像処理ビルトインを使用できます。
  • ディスクに書き込む場合、.jpg、.gif、.tiff、.pbm、.ppm、および.pngのいずれかの画像を出力する必要があります。
  • 最初の辺の長さは少なくとも500ピクセルでなければなりません。
  • 最初のコーナーは、どちらを選択してもかまいません。
  • いつものように、標準の抜け穴は許可されていません。


このスパイラルの深さのレベルには最低値がありますか?
LegionMammal978

@ LegionMammal978 25を超える入力を要求することはありません。これを追加します。
アディソンクランプ

.pbmまたは.ppmを含めると、グラフィカルではない言語の一部に役立つ場合があります。
-trichoplax

回答:


12

(ルビー)163バイト

ShoesはルビーベースのGUIツールキットです。

Shoes.app{n=ask('').to_f
r=s=5E2
a=[0,s*i="i".to_c,s*i+s,s,0]
(q=a[-3]-a[-4]
r=q.abs/s*n
a<<a[-4]+q/r)while r>1
1.upto(a.size-1){|j|line *(a[j-1].rect+a[j].rect)}}

非ゴルフ

Shoes.app{ 
  n=ask('').to_f                 #Open a dialog box with no message, get n from user
  r=s=5E2                        #Initialize s to sidelength=500. r can be initialized to any vale, we use the same one for convenience.
  a=[0,s*i="i".to_c,s*i+s,s,0]   #intialize array a with 5 points needed to draw a square, in complex number format (first point=0 is duplicated.)

  (
    q=a[-3]-a[-4]                #find the vector from point plotted 4 before to the following point (plotted 3 before)
    r=q.abs/s*n                  #r is the scale factor
    a<<a[-4]+q/r                 #add a new point derived from a[-4] by moving toward a[-3] by a distance s/n 
  )while r>1                     #break loop when length of line is less than s/n

  1.upto(a.size-1){|j|           #for all points except 1st and last one
    line *(a[j-1].rect+a[j].rect)#take the two complex numbers correspondimg to the current and previous point,
  }                              #convert to 2-element arrays (rectangular coordinates
}                                #combine to make a 4-element array, use * to splat into 4 parameters, and draw using the line method.

出力n = 4およびn = 25

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

形状は常に三角形で終わり、さらに三角形に折り畳まれていることに注意してください。交換size-1sizeも、出力の外観に違いはなく、2バイト節約できますが、理論的な正確さのために残しておきます。

出力n = 300

OPのコメントに触発され、数字が大きいほど見栄えが良くなります。

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


line一番下の行に続くスペースは必要ですか?
アディソンクランプ

残念ながら@CoolestVetoはい。*以下のための4つのパラメータに複素数の変換によって形成される4つの要素の配列を変換しますline。標準の構文ではline(*(a[j-1].rect+a[j].rect))、括弧を削除してスペースを追加すると、すでに1バイトが節約されます。スペースを削除すると、Ruby lineは括弧の内容を乗算しようとしますが、これは意味がなく、エラーをスローします。ここではいくつかのゴルフが行われますが、そうではありません。後で調べます。
レベルリバーセント

への引数の周りの括弧を取り除くことができると確信していますupto。また、('')後を削除しようとしましたaskか?私はそれをテストしていませんが、それは不必要かもしれません
モニカの訴訟の基金

3
100の出力は美しいです。
アディソンクランプ

1
@CoolestVeto n = 100が少し気がかりです。それは飛び出し、私にすべての3Dを行きます。n = 300を投稿しました。これは全体的に暗いため、落ち着いています。
レベルリバーセント

3

Java、1056 1005 985 948 522 508 507 504 502 501 501 493 492 488 474 465 458バイト

import java.awt.*;interface G{static void main(String[]a){new Frame(){int s=499,o=s,e,i,x,y;{o/=new Float(a[0]);add(new Component(){public void paint(Graphics g){g.drawRect(0,0,s,s);int[]p={s,s,s,0,0,0,0,s};for(double d=s,t;d>o;t=o/d,i=e*2,x=(int)((1-t)*p[i]+t*p[(2+i)%8]+.5),y=(int)((1-t)*p[1+i]+t*p[(3+i)%8]+.5),g.drawLine(p[(6+i)%8],p[(7+i)%8],x,y),p[i]=x,p[1+i]=y,e=++e%4,i=e*2,x=p[(2+i)%8]-p[i],y=p[(3+i)%8]-p[1+i],d=Math.sqrt(x*x+y*y));}});show();}};}}

CoolestVetoとECSのおかげで、サイズを削減する他の方法があります。:-)


わかりました、少しゴルフをしましたが、もっと可能性があります。私はオブジェクト指向すぎて、文字が最小になりません
ヴァンパイア

@AlexA。後でコードを改善して短くした場合、短いバージョンで投稿を更新できますか?
ヴァンパイア

@BjörnKautlerうん、いいね!:)私は今、短縮するためにいくつかの場所に取り組んでいます。
アディソンクランプ

1
@BjörnKautler確かにできます!
アレックスA.

1
うわー、私は500バイト以上の回答を見たことがありません。:O
アディソンクランプ

1

グルービー、412の 411 403 398バイト

import java.awt.*
new Frame(){
def s=499,o=s/(args[0]as float),e=0,i,a,b,d,t
{add new Component(){void paint(Graphics g){g.drawRect 0,0,s,s
p=[s,s,s,0,0,0,0,s]
for(d=s;d>o;d=Math.sqrt(a*a+b*b)){t=o/d
i=e*2
a=(int)((1-t)*p[i]+t*p[(2+i)%8]+0.5)
b=(int)((1-t)*p[1+i]+t*p[(3+i)%8]+0.5)
g.drawLine p[(6+i)%8],p[(7+i)%8],a,b
p[i]=a
p[1+i]=b
e=++e%4
i=e*2
a=p[(2+i)%8]-p[i]
b=p[(3+i)%8]-p[1+i]}}}
show()}}

groovy 2.4.4で動作させるには問題があります: Caught: groovy.lang.MissingMethodException: No signature of method: static s.div() is applicable for argument types: (java.lang.Float) values: [25.0] Possible solutions: is(java.lang.Object), wait(), run(), run(), find(), any() groovy.lang.MissingMethodException: No signature of method: static s.div() is applicable for argument types: (java.lang.Float) values: [25.0] Possible solutions: is(java.lang.Object), wait(), run(), run(), find(), any() at s$1.<init>(s.groovy:3) at s.run(s.groovy:2)
-Dieter

2.3.9では、私にとっては問題なく動作します。
ヴァンパイア
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.