Vẽ một hình xoắn ốc trong một hộp


13

xoắn ốc

Hình xoắn ốc hình học này trông phức tạp, nhưng nó khá đơn giản để vẽ; lấy hộp sau:

cái hộp

Vẽ một đường thẳng giữa góc của hộp và một số khoảng cách đặt phía trên góc tiếp theo ngược chiều kim đồng hồ.

1 dòng

Tiếp tục mô hình này vào bên trong, luôn luôn đặt khoảng cách đó từ góc của dòng tiếp theo. Dưới đây là một vài dòng trong.

đường rên

Như bạn có thể thấy, khi mô hình tiếp tục, hình xoắn ốc tiến đến trung tâm và các hộp bạn vẽ bắt đầu xoay. Lưu ý rằng khoảng cách vẫn không đổi, bất kể góc độ.

Các thách thức

Cảm hứng (và cũng cảm ơn người tuyệt vời đã giới thiệu cho tôi khái niệm này <3)

Đưa ra một đầu vào số (có thể là phân số) từ 1 đến 25, ghi hình ảnh vào đĩa sử dụng mẫu này hoặc hiển thị đầu ra trên màn hình, trong đó khoảng cách từ mỗi góc là khoảng cách của một bên ban đầu của hộp chia cho đầu vào . Tiếp tục mẫu vào trong cho đến khi khoảng cách từ góc được chỉ định dài hơn chiều dài của cạnh bên.

Quy tắc

  • Bạn có thể không sử dụng các phần dựng sẵn cho việc tạo xoắn ốc này, nhưng bạn có thể sử dụng các phần tử xử lý hình ảnh.
  • Nếu bạn ghi vào đĩa, bạn phải xuất hình ảnh trong bất kỳ .jpg, .gif, .tiff, .pbm, .ppm và .png.
  • Độ dài cạnh ban đầu phải tối thiểu 500 pixel.
  • Góc ban đầu có thể là bất cứ điều gì bạn chọn.
  • Như mọi khi, các lỗ hổng tiêu chuẩn không được phép.


Có tối thiểu cho bao nhiêu cấp độ sâu xoắn ốc này phải không?
LegionMammal978

@ LegionMammal978 Tôi sẽ không bao giờ yêu cầu đầu vào lớn hơn 25, tôi sẽ thêm nó.
Addison Crump

Bao gồm .pbm hoặc .ppm có thể giúp một số ngôn ngữ đồ họa ít hơn.
trichoplax

Câu trả lời:


12

Giày (Ruby) 163 byte

Giày là một bộ công cụ GUI dựa trên 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)}}

Ung dung

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.

Đầu ra n = 4 và n = 25

nhập mô tả hình ảnh ở đây

Lưu ý rằng hình dạng luôn kết thúc trong một hình tam giác, thu gọn hơn nữa thành một dòng. Thay thế size-1bằng sizekhông có sự khác biệt với sự xuất hiện của đầu ra và sẽ tiết kiệm được 2 byte, nhưng tôi đã để nó cho đúng về mặt lý thuyết.

Đầu ra n = 300

Lấy cảm hứng từ một bình luận của OP, những con số cao hơn trông thật tuyệt!

nhập mô tả hình ảnh ở đây


Là không gian sau linetrong dòng dưới cùng cần thiết?
Addison Crump

@CoolestVeto tiếc là có. các *chuyển đổi mảng Bốn yếu tố hình thành bởi chuyển đổi của số phức thành bốn tham số cho line. Cú pháp chuẩn là line(*(a[j-1].rect+a[j].rect))loại bỏ các dấu ngoặc đơn và thêm một khoảng trắng đã tiết kiệm được một byte. Xóa không gian làm cho Ruby cố gắng nhân linevới nội dung của dấu ngoặc đơn, điều này không có ý nghĩa và khiến nó bị lỗi. Có một số golf được thực hiện ở đây, chỉ là không phải vậy. Tôi sẽ xem xét nó sau.
Cấp sông St

Tôi gần như chắc chắn rằng bạn có thể thoát khỏi các parens xung quanh đối số upto. Ngoài ra, bạn đã thử loại bỏ ('')sau ask? Tôi đã không kiểm tra nó, nhưng nó có thể không cần thiết
Vụ kiện của Quỹ Monica

3
Đầu ra cho 100 là đẹp .
Addison Crump

1
@CoolestVeto Tôi thấy n = 100 một chút đáng lo ngại; nó nhảy ra và đi tất cả 3D vào tôi. Tôi đã đăng n = 300, tổng thể tối hơn và do đó bình tĩnh hơn.
Cấp sông 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();}};}}

Cảm ơn CoolestVeto và ECS vì những cách khác để giảm kích thước. :-)


Ok, tôi đã đánh nó xuống một chút, nhưng có nhiều khả năng chắc chắn hơn, tôi đã mã hóa quá hướng đối tượng để tối giản hóa nhân vật :-D
Vampire

@AlexA. Nếu sau này tôi cải thiện mã của mình và làm cho nó ngắn hơn, thì tôi có thể cập nhật bài đăng với phiên bản ngắn hơn không?
Ma cà rồng

@ BjornKautler Yup, thật tốt! :) Tôi đang làm việc trên một vài nơi để rút ngắn ngay bây giờ.
Addison Crump

1
@ BjornKautler Bạn chắc chắn có thể!
Alex A.

1
Ồ, tôi chưa bao giờ thấy hơn 500 byte tặc lưỡi trả lời. : 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()}}

Tôi có vấn đề để làm cho nó chạy với 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)
ăn kiêng

Với 2.3.9, nó hoạt động tốt với tôi.
Ma cà rồng
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.