Regelmäßige Polygramme

16

Ausgehend von der Anzahl der Eckpunkte n ≥ 3und der "Schrittgröße" 1 ≤ m < n/2 (die den Abstand zwischen zwei verbundenen Eckpunkten angibt) wird eine grafische Darstellung des entsprechenden regulären Polygramms ausgegeben . Wenn das Polygramm aus mehreren geschlossenen Schleifen besteht, muss jede Schleife in einer anderen Linienfarbe gerendert werden. (Wenn dies verwirrend klingt, sollten die folgenden Beispiele hoffentlich Abhilfe schaffen.)

Regeln

Jede vernünftige Lösung des Problems wird diese Regeln wahrscheinlich automatisch erfüllen - sie sind nur dazu da, die Parameter der Ausgabe einzuschränken, um Antworten wie "Dieser schwarze Block ist völlig ein Polygramm, aber Sie können es nicht sehen, weil Ich habe die Linienbreite auf über 9000 eingestellt. "

  • Sie können das Polygramm entweder in eine Datei rendern (die auf eine Disc oder in den Standardausgabestream geschrieben werden kann) oder auf dem Bildschirm anzeigen.
  • Sie können entweder Vektor- oder Rastergrafiken verwenden. Wenn die Ausgabe gerastert wird, muss das Bild hat Abmessungen von 400x400 Pixeln oder mehr und die Polygram des Radius (der Abstand von der Mitte zu jedem Scheitelpunkt) zwischen 35% und 50% der Seitenlänge sein muss.
  • Das Seitenverhältnis des Polygramms muss 1 sein (damit seine Scheitelpunkte auf einem richtigen Kreis liegen) - die Leinwand des Bildes kann rechteckig sein.
  • Die Linien des Polygramms dürfen nicht dicker als 5% des Radius sein (und natürlich müssen sie eine Dicke ungleich Null haben, um sichtbar zu sein).
  • Sie können Achsen oder einen Rahmen zusätzlich zum Polygramm rendern, aber sonst nichts.
  • Sie können eine beliebige (durchgezogene) Hintergrundfarbe auswählen.
  • Für Polygramme, die aus mehreren geschlossenen Schleifen bestehen, müssen Sie mindestens 6 visuell unterschiedliche Farben unterstützen, die sich alle vom Hintergrund unterscheiden müssen. (Graustufen sind in Ordnung, vorausgesetzt, die Schattierungen sind im gesamten Spektrum ausreichend verteilt.) Ihr Code muss noch für mehr als 6 Schleifen funktionieren, die Farben müssen jedoch nicht für zusätzliche Schleifen unterscheidbar sein (dh Sie können diese auch wiederverwenden) Farben aus vorherigen Loops an diesem Punkt).

Dies ist Codegolf, daher gewinnt die kürzeste Antwort (in Bytes).

Beispiele

Hier sind alle Ausgaben bis n = 16(wo die Spalte entspricht nund die Zeile bis m):

Bildbeschreibung hier eingeben Klicken Sie für eine größere Version.

Als Beispiele für größere nsind hier (n, m) = (29, 11)und (30, 12):

Bildbeschreibung hier eingebenBildbeschreibung hier eingeben

Martin Ender
quelle
Was ist mit Anti-Aliasing und so? (Da es sich um abgewinkelte Linien handelt)
Optimierer
1
@Optimizer Ich werde keinen Anti-Aliasing-Algorithmus vorschreiben. Die Linien können ausgerichtet oder geglättet sein, solange sie deutlich sichtbar sind. Verwenden Sie Ihr bestes Urteilsvermögen.
Martin Ender

Antworten:

5

MATLAB, 85 81

Die Funktion zeigt ein Diagramm auf dem Bildschirm an.

function f(n,m)
hold all
axis equal
for k=1:gcd(m,n)
plot(i.^(4*(k:m:n^2)/n))
end

Ergebnis für n = 30, m = 12: f (30,12)

Feersum
quelle
Ich bin mir nicht sicher, ob dies funktioniert. Wenn ich es richtig gemacht habe, wird dieses Bild für 30, 12 ausgegeben . Siehe: bit.ly/1GFZni7
durron597
@ durron597 Es funktioniert tatsächlich in Matlab, aber die Funktion ist nicht sofort wiederverwendbar, da die Fäden hold allzum nächsten Plot über dem ersten gezogen werden ... Ich weiß nicht, ob wir einen Konsens über die Wiederverwendbarkeit von Funktionen haben ehrlich.
Martin Ender
@ MartinBüttner Es sollte hold onsowieso sein , ein Byte zu speichern; Wenn Sie vier Bytes hinzufügen, wird es wiederverwendbar ( clf\n)
durron597
Es stellt sich heraus, dass wir einen Konsens haben, und ich habe die Frage vor ein paar Monaten sogar selbst gestellt und beantwortet. oO Also von diesem Meta-Post wäre dies ungültig, ohne etwas zu veröffentlichen hold.
Martin Ender
@ Martinbüttner Wenn du hold allzu wechselt clf\nhold on, behebt das das Problem?
Durron597
3

CJam, 114

"P2"N400:ASAN6N0aA*aA*q~:M;:K{:CK,f{M*+K%P*2*K/_[mc)\ms)]199f*}_+2ew{~1$.-Af/A,\ff*\f.+{:mo~_3$=@C6%)tt}/}/}/Sf*N*

Das Bild wird im ASCII-PGM-Format ausgegeben.

Sie können es online ausprobieren , aber die Ausgabe ist ziemlich lang. Sie können 400und 199zu kleineren Zahlen ändern , um die Bildgröße zu verringern.

CJam kennt keine Bilder, Zeichnungen, Linien oder Formen. Daher habe ich das Bild in einer quadratischen Matrix Pixel für Pixel generiert (eine Zahl, die einen Grauton für jedes Pixel darstellt).

So sieht das Ergebnis aus 30 12:

Polygramm

aditsu
quelle
1

Mathematica, 70 Bytes

ListPolarPlot[Table[{2Pi(i+j#2)/#,1},{i,GCD@##},{j,#+1}],Joined->1>0]&

Nun ... das ist meine Referenzimplementierung, die beide Einsendungen bisher übertrifft. Ich bin nicht darauf bedacht, meine eigene Herausforderung zu gewinnen, also hoffe ich, dass jemand dies schafft.

Die Ausgabe entspricht den Plots in der Challenge selbst, außer dass ich die Achsen hier nicht entferne:

Bildbeschreibung hier eingeben

Martin Ender
quelle