상자에 나선 그리기


13

나선

이 기하학적 나선은 복잡해 보이지만 그림을 그리는 것은 매우 간단합니다. 다음 상자를 가져 가십시오.

상자

상자 모서리와 시계 반대 방향으로 다음 모서리 위의 일정 거리 사이에 직선을 그립니다.

1 줄

이 패턴을 안쪽으로 계속 유지하면서 항상 다음 선의 모서리에서 떨어진 거리를 유지하십시오. 몇 줄이 더 있습니다.

어금니 라인

보시다시피, 패턴이 계속됨에 따라 나선이 중심에 접근하고 그리는 상자가 회전하기 시작합니다. 각도에 관계없이 거리는 일정하게 유지됩니다.

도전

영감 (그리고이 개념을 소개 한 훌륭한 사람 덕분에 <3)

1에서 25까지의 숫자 (아마도 분수) 입력이 주어진 경우,이 패턴을 사용하는 디스크에 이미지를 쓰거나 화면에 출력을 표시하십시오. 각 모서리에서 거리는 상자의 첫 번째면의 거리를 입력으로 나눈 거리입니다. . 지정된 모서리로부터의 거리가 다음 변의 길이보다 길 때까지 패턴을 안쪽으로 계속 진행하십시오.

규칙

  • 이 나선형 작성에는 내장 기능을 사용할 수 없지만 이미지 처리 내장 기능을 사용할 수 있습니다.
  • 디스크에 쓰는 경우 이미지를 .jpg, .gif, .tiff, .pbm, .ppm 및 .png로 출력해야합니다.
  • 초기 측면 길이는 500 픽셀 이상이어야합니다.
  • 초기 구석은 어느 쪽을 선택 하든지 상관 없습니다.
  • 항상 그렇듯이 표준 허점 은 허용되지 않습니다.


이 나선의 수심에 대한 최소 레벨이 있습니까?
LegionMammal978

@ LegionMammal978 25보다 큰 입력을 요청하지 않을 것입니다. 추가하겠습니다.
Addison Crump

.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-1로하는 size출력의 모양에 차이가 없습니다 2 바이트를 절약 할 수 있지만 이론적 정확성에 왼쪽.

출력 n = 300

OP의 의견에서 영감을 받아 높은 숫자는 멋지게 보입니다!

여기에 이미지 설명을 입력하십시오


line결론에 나오는 공간이 필요합니까?
Addison Crump

@CoolestVeto 불행히도 예. 는 *복소수를에 대한 4 개의 매개 변수로 변환하여 형성된 4 개의 요소 배열을 변환합니다 line. 표준 구문은 line(*(a[j-1].rect+a[j].rect))괄호를 제거하고 공백을 추가하면 이미 1 바이트를 절약합니다. 공백을 제거하면 Ruby line가 괄호의 내용 을 곱하려고 시도 하므로 의미가 없으며 오류가 발생합니다. 여기서는 할 일이없는 골프가 있습니다. 나중에 살펴 보겠습니다.
Level River St

나는 당신이에 대한 논쟁 주위의 파렌을 제거 할 수 있다고 확신합니다 upto. 또한 ('')후를 제거하려고 ask했습니까? 나는 그것을 테스트하지 않은,하지만 불필요한 될 수있다
기금 모니카의 소송

3
100의 출력은 아름답습니다 .
Addison Crump

1
@CoolestVeto 나는 n = 100을 조금 혼란스럽게 느낀다. 그것은 밖으로 나와 모든 3D에 간다. 나는 n = 300을 게시했는데 전체적으로 어둡고 차분합니다.
Level River St

3

자바 1,056 1,005 985 948 522 508 507 504 502 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 덕분입니다. :-)


좋아, 나는 약간 아래로 골프를 쳤다. 그러나 확실히 더 가능성이있다. 나는 문자-최소화하기에는 너무 객체 지향적이다 :-D
Vampire

@AlexA. 나중에 코드를 개선하고 더 짧게 만들면 더 짧은 버전으로 게시물을 업데이트 할 수 있습니까?
뱀파이어

@ BjörnKautler Yup, 좋습니다! :) 현재 몇 곳에서 작업을 단축하고 있습니다.
Addison Crump

1
@ BjörnKautler 당신은 확실히 할 수 있습니다!
Alex A.

1
와우, 나는 500 바이트 이상이 답을 얻는 것을 보지 못했습니다. : O
Addison Crump

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.