Gambar sebuah spiral dalam sebuah kotak

13

spiral

Spiral geometris ini terlihat rumit, tetapi cukup sederhana untuk menggambar; ambil kotak berikut:

kotak

Gambarlah garis lurus antara sudut kotak dan beberapa jarak yang ditetapkan di atas sudut berikutnya berlawanan arah jarum jam.

1 baris

Lanjutkan pola ini ke dalam, selalu tinggal yang mengatur jarak dari sudut baris berikutnya. Berikut beberapa baris lagi.

garis moar

Seperti yang Anda lihat, ketika polanya berlanjut, spiral mendekati pusat dan kotak-kotak yang Anda gambar mulai berputar. Perhatikan bahwa jarak tetap konstan, terlepas dari sudutnya.

Tantangan

Inspirasi (dan juga terima kasih kepada orang yang luar biasa yang memperkenalkan saya pada konsep ini <3)

Diberikan input numerik (mungkin fraksional) dari 1 hingga 25, tulis gambar ke disk yang menggunakan pola ini atau tampilkan output di layar, di mana jarak dari setiap sudut adalah jarak satu sisi awal kotak dibagi dengan input . Lanjutkan pola ke dalam sampai jarak dari sudut yang ditentukan lebih panjang dari panjang sisi berikutnya.

Aturan

  • Anda mungkin tidak menggunakan built-in untuk pembuatan spiral ini, tetapi Anda dapat menggunakan builtin pemrosesan gambar.
  • Jika Anda menulis ke disk, Anda harus menampilkan gambar dalam format .jpg, .gif, .tiff, .pbm, .ppm, dan .png.
  • Panjang sisi awal harus minimal 500 piksel.
  • Sudut awal mungkin adalah yang Anda pilih.
  • Seperti biasa, Celah Standar tidak diizinkan.
Addison Crump
sumber
4
Erat terkait.
Martin Ender
Apakah ada minimum untuk berapa level dalam spiral ini harus?
LegionMammal978
@ LegionMammal978 Saya tidak akan pernah meminta input yang lebih besar dari 25, saya akan menambahkannya.
Addison Crump
Termasuk .pbm atau .ppm mungkin membantu beberapa bahasa yang kurang grafis.
trichoplax
juga terkait
Digital Trauma

Jawaban:

12

Sepatu (Ruby) 163 byte

Shoes adalah toolkit GUI berbasis ruby.

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

Tidak disatukan

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.

Output n = 4 dan n = 25

masukkan deskripsi gambar di sini

Perhatikan bahwa bentuk selalu berakhir dengan segitiga, yang runtuh lebih jauh ke garis. Menggantisize-1 dengan sizetidak ada bedanya dengan penampilan output dan akan menghemat 2 byte, tapi saya meninggalkannya untuk kebenaran teoretis.

Output n = 300

Terinspirasi oleh komentar oleh OP, angka yang lebih tinggi memang terlihat hebat!

masukkan deskripsi gambar di sini

Level River St
sumber
Apakah ruang yang mengikuti linegaris bawah diperlukan?
Addison Crump
@CoolestVeto sayangnya ya. yang *mengubah susunan empat elemen yang dibentuk oleh konversi bilangan kompleks menjadi empat parameter untuk line. Sintaks standarnya adalah line(*(a[j-1].rect+a[j].rect))menghilangkan tanda kurung dan menambahkan spasi sudah menghemat satu byte. Menghapus ruang membuat Ruby mencoba mengalikan linedengan isi tanda kurung, yang tidak masuk akal dan menyebabkannya membuang kesalahan. Ada beberapa golf yang harus dilakukan di sini, hanya saja tidak. Saya akan memeriksanya nanti.
Level River St
Saya hampir yakin Anda dapat menyingkirkan parens di sekitar argumen upto. Juga, sudahkah Anda mencoba menghapus ('')setelahnya ask? Saya belum mengujinya, tetapi mungkin tidak perlu
Gugatan Dana Monica
3
Output untuk 100 indah .
Addison Crump
1
@CoolestVeto Saya menemukan n = 100 sedikit mengganggu; itu melompat keluar dan pergi semua 3D pada saya. Saya telah memposting n = 300 yang secara keseluruhan lebih gelap dan karenanya lebih tenang.
Level River St
3

Java, 1056 1005 985 948 522 508 507 504 502 501 493 492 488 474 465 458 byte

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();}};}}

Terima kasih kepada CoolestVeto dan ECS untuk cara lain mengurangi ukuran. :-)

Vampir
sumber
Ok, saya pindahkan sedikit ke bawah, tapi pasti ada lebih banyak, saya kode terlalu berorientasi objek untuk menjadi karakter-minimalis :-D
Vampire
@AlexA. Jika nanti saya memperbaiki kode saya dan membuatnya lebih pendek, dapatkah saya memperbarui posting dengan versi yang lebih pendek?
Vampir
@ BjörnKautler Yup, itu bagus! :) Saya sedang mengerjakan beberapa tempat untuk dipersingkat sekarang.
Addison Crump
1
@ BjörnKautler Anda pasti bisa!
Alex A.
1
Wow, saya belum pernah melihat lebih dari 500 byte membuang jawaban. : O
Addison Crump
1

Groovy, 412 411 403 398 byte

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()}}
Vampir
sumber
Saya memiliki masalah untuk membuatnya berjalan dengan 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
Dengan 2.3.9 berfungsi dengan baik untuk saya.
Vampir