Spiralpolygone

8

Geben Sie hier die Bildbeschreibung ein

Zeichnen Sie eine Reihe verbundener Polygone wie das oben gezeigte.

Was das obige Bild jedoch nicht zeigt, ist die Spirale, die durch aufeinanderfolgende Scheitelpunkte gebildet wird:

Geben Sie hier die Bildbeschreibung ein

Die Einschränkung besteht darin, dass nur 1 Spirale markiert ist. Sie sollten alle Spiralen markieren. Dies kann durch Drehen jeder oben gezeigten Spirale erfolgen, so dass an jedem Scheitelpunkt des größten Polygons eine Spirale beginnt.

Die Spiralen sollten alle eine Farbe haben, während der Rest des Bildes eine andere.

Das innerste Polygon sollte vollständig die Farbe der Spirale haben.

Regeln

  • Sie erhalten die Argumente {n, s, p, a} in einer Funktion oder einem Programm
  • n = Iterationen nach innen (Anzahl der Polygone)
  • s = Seiten des (regulären) Polygons (Sie können n> = 3 annehmen)
  • p = (der lineare Abstand von einem Scheitelpunkt des Polygons A zu seinem entsprechenden "inneren" Scheitelpunkt gegen den Uhrzeigersinn) / (die Gesamtlänge der Seite von A). Für das Diagramm wäre p also ungefähr 1/3, da jedes innere Polygon auf ungefähr 1/3 des Weges durch diese Seite auf die Seite des größeren Polygons trifft.
  • a = der Radius (umschreibend) des äußeren Polygons

Die Grenze eines der Werte von n, s, p oder a basiert auf dem, was ein Mensch als diese Art von Zeichnung wahrnehmen kann. (zB keine schattierten Kreise) sowie gesunder Menschenverstand (s> = 3, n> = 1)

Viel Spaß beim Golfen! Das kürzeste Programm gewinnt.

Stretch Maniac
quelle
1
Ist der Parameter pim Winkel oder im Abstand zwischen zwei Eckpunkten linear?
TheSpanishInquisition
Entschuldigen Sie die Verwirrung, hoffentlich klären die Änderungen die Dinge.
Stretch Maniac
Sie sollten eine andere Farbe als die anderen Linien einfärben. Jede Seite hat also zwei Farben - eine, die p durchläuft, und der Rest eine andere Farbe.
Stretch Maniac
@ MartinBüttner Ich denke, er meint, dass alle Spiralen (der Teil aller Seiten im Uhrzeigersinn) eine hervorgehobene Farbe (wie Rot) und der Rest der Seite die Grundfarbe des Vordergrunds (wie Schwarz) haben sollte. Dies würde srote Spiralen gegen den Uhrzeigersinn ergeben . Was jedoch bleibt, wären schwarze Spiralen im s Uhrzeigersinn ! StretchManiac, das ist eine gute Frage, aber wir brauchen wirklich ein Beispielbild, um zu sehen, was Sie meinen. Upvoting und Closevoting.
Level River St
Openvoting, obwohl es hilfreich wäre zu bestätigen, ob das innerste Polygon gefüllt werden sollte (ich verstehe, dass es nicht gefüllt werden sollte)
Level River St

Antworten:

13

Mathematica, 218 206 Bytes

{n,s,p,a}=Input[];t=0;Graphics[(c=Array[a{Cos[u=t+2Pi#/s],Sin@u}&,s+1];m=(f=p#2+(1-p)#&)@@c;a=Norm@m;t=ArcTan@@m;k=#;{Line@{#,x=f@##},If[k<n,Red],Line@{x,#2}}&@@@Thread@{c,RotateLeft@c})&~Array~n,Axes->1>0]

Erwartet die Eingabe als Array, wie in der Frage definiert, z {20, 7, 0.5, 100}.

Geben Sie hier die Bildbeschreibung ein

oder {20, 5, 0.333, 100}

Geben Sie hier die Bildbeschreibung ein

Diese Bilder verwenden immer noch Rot und Grau aus einer früheren Version, aber die neue Version verwendet Schwarz für die Spiralen gegen den Uhrzeigersinn und Rot für den Rest.

Ich habe eine Achse eingefügt, da sonst der aParameter bei einer Vektorgrafik bedeutungslos ist. Ich habe auch pals lineare Interpolation in der Position interpretiert , nicht im Winkel.

Ungolfed:

{n, s, p, a} = Input[];
t = 0;
Graphics[
 (
    c = Array[a {Cos[u = t + 2 Pi #/s], Sin@u} &, s + 1];
    m = (f = p #2 + (1 - p) # &) @@ c;
    a = Norm@m;
    t = ArcTan @@ m;
    k = #;
    {Line@{#, x = f@##}, If[k < n, Red], Line@{x, #2}} & @@@ 
     Thread@{c, RotateLeft@c}
    ) &~Array~n
 ,
 Axes -> 1 > 0]
Martin Ender
quelle