Нарисуйте спираль в коробке


13

спираль

Эта геометрическая спираль выглядит сложной, но ее довольно просто нарисовать; возьмите следующее поле:

коробка

Нарисуйте прямую линию между углом поля и некоторым заданным расстоянием над следующим углом против часовой стрелки.

1 строка

Продолжайте этот паттерн внутрь, всегда оставаясь на заданном расстоянии от угла следующей линии. Вот еще несколько строк.

морские линии

Как вы можете видеть, поскольку паттерн продолжается, спираль приближается к центру, и нарисованные прямоугольники начинают вращаться. Обратите внимание, что расстояние остается постоянным, независимо от угла.

Соревнование

Вдохновение (а также благодаря замечательному человеку, который познакомил меня с этой концепцией <3)

Учитывая числовой (возможно, дробный) ввод от 1 до 25, запишите изображение на диск, который использует этот шаблон, или отобразите вывод на экране, где расстояние от каждого угла - это расстояние от одной начальной стороны поля, деленное на ввод , Продолжайте рисунок внутрь, пока расстояние от указанного угла не станет длиннее следующей стороны.

правила

  • Вы не можете использовать встроенные модули для этого спирального создания, но вы можете использовать встроенные функции обработки изображений.
  • Если вы записываете на диск, вы должны вывести изображение в любом из .jpg, .gif, .tiff, .pbm, .ppm и .png.
  • Начальная длина стороны должна быть не менее 500 пикселей.
  • Начальный угол может быть любым, который вы выберете.
  • Как всегда, Стандартные лазейки запрещены.


Есть ли минимальный уровень глубины этой спирали?
LegionMammal978

@ LegionMammal978 Я бы никогда не попросил ввести значение больше 25, я добавлю это.
Эддисон Крамп

Включение .pbm или .ppm может помочь некоторым менее графическим языкам.
Трихоплакс

Ответы:


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

Ungolfed

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Нужно ли пробел в нижней строке?
Аддисон Крамп

@CoolestVeto, к сожалению, да. *преобразует массив четыре элемента , образованный путем преобразования комплексных чисел в четырех параметров line. Стандартный синтаксис состоит в том, line(*(a[j-1].rect+a[j].rect))что удаление скобок и добавление пробела уже экономит один байт. Удаление пробела заставляет Ruby пытаться умножить lineсодержимое круглых скобок, что не имеет смысла и вызывает ошибку. Здесь можно поиграть в гольф, но не так. Я посмотрю на это позже.
Уровень Река St

Я почти уверен, что вы можете избавиться от парней вокруг спора upto. Кроме того, вы пытались удалить ('')после ask? Я не проверял это, но это может быть ненужным
Фонд Моника Иск

3
Выход за 100 прекрасен .
Эддисон Крамп

1
@CoolestVeto я нахожу n = 100 немного тревожным; он выпрыгивает и уходит все 3D на меня. Я выложил n = 300, что в целом темнее и поэтому спокойнее.
Уровень Река St

3

Java, 1056 1005 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 Да, это хорошо! :) Я работаю над несколькими местами, чтобы сократить прямо сейчас.
Эддисон Крамп

1
@ BjörnKautler Вы, конечно, можете!
Алекс А.

1
Вау, я никогда не видел, чтобы ответом было более 500 байтов. : O
Эддисон Крамп

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 у меня нормально работает.
вампир
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.