在盒子里画一个螺旋


13

螺旋

这种几何螺旋看起来很复杂,但是绘制起来却相当简单。采取以下框:

框

在框的角和逆时针在下一个角上方的某个设置距离之间绘制一条直线。

1线

向内继续此模式,始终与下一行的拐角保持该设定距离。这里还有几行。

线

如您所见,随着图案的继续,螺旋线接近中心,绘制的框开始旋转。请注意,无论角度如何,距离都​​保持恒定。

挑战

灵感(也要感谢向我介绍这个概念的出色人<3)

给定从1到25的数字(可能是分数)输入,将图像写入使用此模式的磁盘或在屏幕上显示输出,其中距每个角的距离是盒子的一个初始边的距离除以输入。向内继续图案,直到与指定拐角的距离大于下一个边的长度。

规则

  • 您可能不使用内置函数来进行这种螺旋式创建,但可以使用图像处理内置函数。
  • 如果写入磁盘,则必须以.jpg,.gif,.tiff,.pbm,.ppm和.png中的任何一种格式输出图像。
  • 初始边长必须至少为500像素。
  • 初始拐角可能是您选择的任意一个。
  • 与往常一样,不允许使用“标准漏洞”


对于这个螺旋线必须达到多少层,有最低限度吗?
LegionMammal978 '16

@ LegionMammal978我永远不会要求输入大于25的输入,我将添加它。
Addison Crump

包括.pbm或.ppm可能会帮助一些图形化程度较低的语言。
trichoplax

Answers:


12

鞋子(Ruby)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底线后面的空格是否必要?
Addison Crump

@CoolestVeto不幸的是。的*由复数转化形成为四个参数对于四个元件阵列转换line。标准语法是line(*(a[j-1].rect+a[j].rect))这样,因此删除括号并添加空格已经节省了一个字节。删除空格会使Ruby尝试乘以line括号的内容,这毫无意义,并导致抛出错误。这里有一些打高尔夫球的事情,不是那样。我稍后再研究。
水平河圣

我几乎可以肯定,您可以摆脱围绕的争论upto。另外,您是否尝试过删除('')after ask?我尚未测试过,但可能没有必要
Fund Monica的诉讼

3
100的输出很漂亮
Addison Crump

1
@CoolestVeto我发现n = 100有点令人不安;它跳了出来,对我来说所有的3D 我发布了n = 300,它总体上较暗,因此较为镇定。
Level River St

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提供了其他减小尺寸的方法。:-)


好的,我打了一些球,但是还有更多的可能性可以肯定,我编码过于面向对象,以致于字符最小化:-D
吸血鬼,

@AlexA。如果以后改进代码并使其更短,那么我可以简单地用较短的版本更新帖子吗?
吸血鬼

@BjörnKautler是的,太好了!:)我正在一些地方缩短时间。
Addison Crump

1
@BjörnKautler当然可以!
Alex A.

1
哇,我从未见过超过500个字节的答案。:O
Addison Crump

1

Groovy中,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,对我来说效果很好。
吸血鬼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.