Zeichne eine Spirale in eine Schachtel

13

Spiral-

Diese geometrische Spirale sieht kompliziert aus, ist aber ziemlich einfach zu zeichnen. nimm das folgende Kästchen:

Box

Zeichnen Sie eine gerade Linie zwischen der Ecke des Kästchens und einem festgelegten Abstand über der nächsten Ecke gegen den Uhrzeigersinn.

1 Zeile

Fahren Sie mit diesem Muster nach innen fort und halten Sie dabei immer den festgelegten Abstand von der Ecke der nächsten Zeile ein. Hier sind noch ein paar Zeilen.

moar lines

Wie Sie sehen, nähert sich die Spirale im weiteren Verlauf dem Zentrum, und die von Ihnen gezeichneten Kästchen beginnen sich zu drehen. Beachten Sie, dass der Abstand unabhängig vom Winkel konstant bleibt.

Die Herausforderung

Die Inspiration (und auch danke an die wundervolle Person, die mich mit diesem Konzept bekannt gemacht hat <3)

Bei einer numerischen (möglicherweise gebrochenen) Eingabe von 1 bis 25 schreiben Sie ein Bild auf eine Festplatte, die dieses Muster verwendet, oder zeigen Sie die Ausgabe auf dem Bildschirm an, wobei der Abstand von jeder Ecke der Abstand einer Anfangsseite des Felds geteilt durch die Eingabe ist . Fahren Sie mit dem Muster nach innen fort, bis der Abstand von der angegebenen Ecke länger als die Länge der nächsten Seite ist.

Regeln

  • Sie können für diese spiralförmige Erstellung möglicherweise keine integrierten Funktionen verwenden, aber Sie können integrierte Funktionen für die Bildverarbeitung verwenden.
  • Wenn Sie auf eine Festplatte schreiben, müssen Sie ein Bild in den Formaten JPG, GIF, TIFF, PBM, PPM und PNG ausgeben.
  • Die anfängliche Seitenlänge muss mindestens 500 Pixel betragen.
  • Die erste Ecke kann eine beliebige sein.
  • Die Standard-Regelungslücken sind wie immer unzulässig.
Addison Crump
quelle
4
Eng verwandt.
Martin Ender
Gibt es ein Minimum für wie viele Ebenen tief diese Spirale sein muss?
LegionMammal978
@ LegionMammal978 Ich würde niemals nach einer Eingabe fragen, die größer als 25 ist, das füge ich hinzu.
Addison Crump
Das Einschließen von .pbm oder .ppm kann einige der weniger grafischen Sprachen unterstützen.
Trichoplax
also related
Digitales Trauma

Antworten:

12

Schuhe (Ruby) 163 Bytes

Shoes ist ein Ruby-basiertes GUI-Toolkit.

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.

Ausgänge n = 4 und n = 25

Bildbeschreibung hier eingeben

Beachten Sie, dass die Form immer in einem Dreieck endet, das weiter zu einer Linie zusammenfällt. Das Ersetzen size-1mit sizehat keinen Einfluss auf das Erscheinungsbild der Ausgabe und würde 2 Bytes einsparen, aber ich habe es für die theoretische Richtigkeit belassen.

Ausgabe n = 300

Inspiriert von einem Kommentar von OP, sehen die höheren Zahlen großartig aus!

Bildbeschreibung hier eingeben

Level River St
quelle
Ist das folgende Leerzeichen linein der unteren Zeile erforderlich?
Addison Crump
@CoolestVeto leider ja. Das *wandelt das durch Umwandlung der komplexen Zahlen in vier Parameter gebildete Vier-Elemente-Array für line. Die Standardsyntax besagt, line(*(a[j-1].rect+a[j].rect))dass das Entfernen der Klammern und das Hinzufügen eines Leerzeichens bereits eine Einsparung von einem Byte bedeutet. Wenn Sie das Leerzeichen entfernen, versucht Ruby, linemit dem Inhalt der Klammern zu multiplizieren. Dies macht keinen Sinn und verursacht einen Fehler. Hier kann man Golf spielen, aber nicht so. Ich werde es später untersuchen.
Level River St
Ich bin mir fast sicher, dass du die Parens um den Streit loswerden kannst upto. Haben Sie auch versucht, das ('')After zu entfernen ask? Ich habe es nicht getestet, aber es kann unnötig sein
Fund Monica Klage
3
Die Ausgabe für 100 ist wunderschön .
Addison Crump
1
@ CoolestVeto Ich finde n = 100 ein wenig störend; es springt raus und geht alles in 3D auf mich. Ich habe n = 300 gepostet, was insgesamt dunkler und daher ruhiger ist.
Level River St
3

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

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

Dank CoolestVeto und ECS für weitere Möglichkeiten zur Größenreduzierung. :-)

Vampir
quelle
Ok, ich habe ein bisschen Golf gespielt, aber es gibt mehr Möglichkeiten, ich habe zu objektorientiert codiert, um charakterminimalistisch zu sein :-D
Vampire
@AlexA. Wenn ich später meinen Code verbessere und kürzer mache, kann ich dann einfach den Beitrag mit der kürzeren Version aktualisieren?
Vampir
@ BjörnKautler Yup, das ist gut! :) Ich arbeite gerade an einigen Stellen, um sie zu verkürzen.
Addison Crump
1
@ BjörnKautler Das kannst du bestimmt!
Alex A.
1
Wow, ich habe noch nie gesehen, dass mehr als 500 Bytes eine Antwort verworfen haben. : O
Addison Crump
1

Groovy, 412 411 403 398 Bytes

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
quelle
Ich habe Probleme, es mit groovigen 2.4.4 laufen zu lassen: 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
Mit 2.3.9 funktioniert es gut für mich.
Vampir