Graph Florets einer Blume


31

Schauen Sie sich diese Kamillenblüte an:

Schön, nicht wahr? Was ist, wenn ich dir sage, dass dies nicht wirklich eine Blume ist?

Viele Blumen (einschließlich Sonnenblumen, Kamille, Gänseblümchen und andere) bestehen tatsächlich aus vielen sehr kleinen Blüten (die schwarzen Punkte auf Sonnenblumen) auf einem Blütenkopf. Diese Miniatur - Blumen genannt Röschen , und sie sind in einer ganz besonderen Art und Weise angeordnet sind .

Grundsätzlich ist die Position des n-ten Blütchens auf einem Blütenkopf (in Polarkoordinaten):

Dabei ist c = 1 (Beachten Sie, dass 137,508 Grad = goldener Winkel. Sie müssen nicht genau diese Genauigkeit verwenden.)

Dies führt dazu, dass die Blütchen in einer Spirale namens Fermat-Spirale geformt werden. Die Positionierung der Blütchen hängt auch mit Fibonnaci-Zahlen zusammen, aber das ist eine Geschichte für ein anderes Mal.

Also, hier ist die Herausforderung. Berechnen Sie mit einer Ganzzahl n als Eingabe die Positionen der ersten n Florets und zeichnen Sie sie auf . Dies ist eine , daher möchte ich, dass Sie die Punkte entweder in einem Fenster anzeigen oder als Daten in einem gängigen Bildformat an STDOUT oder in einer Datei ausgeben. Davon abgesehen sollte diese Herausforderung ziemlich einfach sein. Es ist , also gewinnt der kürzeste Code. VIEL GLÜCK UND VIEL SPASS!

Hier ist ein Beispielbild, wie eine Ausgabe aussehen könnte:


Dürfen wir die Spirale auf den Kopf stellen?
Lirtosiast

1
FWIW viele Früchte zeigen dieses Muster, wie die Ananas, Agauje und Tannenzapfen. Dies sollte nicht überraschen, da sich Früchte aus Blüten entwickeln. Interessanterweise weisen auch einige Kaktuskörper dieses Muster auf. Mein Favorit ist der fraktale Romanesco-Brokkoli: en.wikipedia.org/wiki/Romanesco_broccoli#/media/…
user151841

1
Das ist cool! Ich habe Romanesco-Brokkoli schon einmal gesehen. Ich finde es wirklich cool, wie sie dieses fraktale Muster haben. Vielleicht könnte ich das herausfordern ...
ein Spaghetto

Antworten:


21

TI-BASIC, 34 Bytes

Für die Taschenrechner der Serie TI-83 + / 84 +.

Input N
2πe^(-2sinh⁻¹(.5→θstep
AnsN→θmax
"√(θ→r₁
Polar                      ;Displays polar mode graphs to graph screen
Dot                        ;Prevents lines from connecting points
DispGraph                  ;Displays graph screen

Dies betrachtet den Punkt am Ursprung als den 0. Punkt.

Dank des Ein-Byte- sinh⁻¹(Tokens 2πe^(-2sinh⁻¹(.5ist dies ein kurzer Weg, um den goldenen Winkel im Bogenmaß zu erhalten. Dies ergibt sich aus der Tatsache, dass e^(sinh⁻¹(.5es sich um den goldenen Schnitt handelt.

Hier sind Screenshots für N = 50.

(Ja, das ist ein 96x64-Monochrom-Display auf einem TI-84 +. Die neueren Farbrechner haben ein Auflösungs-Upgrade, aber immer noch nur 3,7% der Pixel eines iPhones.)

Ohne Koordinaten angezeigt

Drücken Sie TRACE, um die einzelnen Punkte zu durchlaufen.

Mit Koordinaten


5
TI-BASIC ist eine natürliche Wahl für Polarkoordinaten.
Conor O'Brien

Wie haben Sie die Anzahl der Bytes ermittelt? Sieht nach weit mehr als 34 aus. Ein vorprogrammierter Schlüssel, wie er zu sein sinh⁻¹scheint (wenn ich Ihre Erklärung verstehe), würde als mehr als ein Byte zählen.
DavidC

@DavidCarraher TI-BASIC ist tokenisiert . Alle diese Token sind jeweils ein Byte im Speicher des Rechners.
Lirtosiast

1
Sie können die Anzahl der Bytes in einem Programm bestimmen, indem Sie Mem (2nd -> +) -> 7 aufrufen. Sie sehen dann eine Liste aller Programme auf Ihrem Rechner und die Anzahl der Bytes, die sie aufnehmen. Beachten Sie, dass alle TI-BASIC-Programme einen 9-Byte-Header + die Anzahl der Bytes im Namen haben. Subtrahieren Sie diese, um die richtige Byteanzahl zu erhalten.
ein Spaghetto

Syntaxfehler am -2sinh ^ -1
username.ak

15

Python 2, 85 82 81 Bytes

from pylab import*
for i in arange(0,input(),2.39996):polar(i,sqrt(i),'o')
show()

Verkürzt um ein Byte durch Marinus.

Verwenden Sie den goldenen Winkel im Bogenmaß. Die Bytelänge ist die gleiche, wenn ich stattdessen 137.508 verwendet habe, sieht aber irgendwie nicht so gut aus. Erzeugt eine Polarkurve mit pylab. Unten ist angegeben, wann 300 (für die ältere Version) die Eingabe ist und 7000 (für die neuere Version) die Eingabe ist. Kann den Winkel auf 2,4 runden, um die Anzahl der Bytes auf 77 zu verringern.

Ältere Version bei Eingabe von 300

Neuere Version bei Eingabe von 7000

Hier ist eine längere Version, die durch Entfernen des Gitters und der Achse ein klareres Erscheinungsbild ergibt:

from pylab import *
def florets(n):
    for i in arange(0, n, 2.39996):polar(i, sqrt(i), 'o')
    grid(0)#turn off grid
    xticks([])#turn off angle axis
    yticks([])#turn off radius axis
    show()

Der Grund für die unterschiedlichen Farben liegt darin, dass jeder Punkt separat gezeichnet und als eigener Datensatz behandelt wird. Wenn die Winkel und Radien als Listen übergeben würden, würden sie als eine Menge behandelt und von einer Farbe sein.


1
Ich denke, das ist die mit Abstand schönste Antwort. Es ist sehr cool, die klaren Spiralmuster in der Mitte zu sehen.
El'endia Starman

Sie können ein Byte speichern, indem Sie eine normale forSchleife anstelle eines Listenverständnisses verwenden. Es müsste auf einer eigenen Linie sein, aber ;und \nsind gleich lang, also ist das egal. Dh: from pylab import*- for i in arange(0,input(),2.39996):polar(i,sqrt(i),'o')-show()
Marinus

@marinus aber dann ist es kein supercooler one liner mehr! Aber danke, ich habe es hinzugefügt.
Status

14

Blitz 2D / 3D , 102 Bytes

(Die allererste Blitz 2D / 3D Antwort auf dieser Seite!)

Graphics 180,180
Origin 90,90
n=Input()
For i=1To n
t#=i*137.508
r#=Sqr(t)
Plot r*Cos(t),r*Sin(t)
Next

Eine Eingabe von 50füllt das Fenster. (Ja, ich könnte zwei Bytes abschneiden Graphics 99,99, aber das ist optisch nicht so interessant oder nützlich.)

50 Blütchen

Schönere Version (und schöner beendet):

Graphics 400,400
Origin 200,200

n=Input("How many florets? ")

For i = 1 To n
    t# = i * 137.508
    r# = Sqr(t)

    Oval r*Cos(t)-3,r*Sin(t)-3,7,7,1
Next

WaitKey
End

Beispiel 200 Blütchen


hey, ordentlich! Ich wusste nicht über Blitz, bevor ich das las.
Timothy Groote

Wow, vor 15 Jahren war Blitz3D meine erste Sprache: D ...
seufz

Grad als Standard? "Interessant" ...
Lirtosiast

1
@noncom: Es war die erste Sprache, in der ich wirklich bedeutende Programme gemacht habe. Vor acht Jahren. Es ist immer noch eine meiner beiden besten Sprachen (die andere ist Python).
El'endia Starman

1
@noncom, Es war auch meine erste Sprache. Ich frage mich, wie ich es jetzt professionell nutzen würde.
James Webster

12

Mathematica, 43 42 Bytes

ListPolarPlot@Array[(2.39996#)^{1,.5}&,#]&

Dies ist eine unbenannte Funktion, die ein ganzzahliges Argument verwendet, z

Bildbeschreibung hier eingeben
Der Screenshot verwendet eine ältere Version, aber die Ausgabe sieht gleich aus.

Mathematica verfügt über eine integrierte Funktion GoldenAnglefür noch genauere Ergebnisse, die jedoch länger dauert als 2.39996.


GoldenAngle! Ist es eine neue Funktion in Mathematica 10.2?
alephalpha

@alephalpha Yep.
Martin Ender

11

MATLAB, 42 Bytes

t=2.39996*(1:input(''));polar(t,t.^.5,'.')

Ruft die eingegebene Nummer ab und erstellt einen Bereich von 1 bis zu dieser Nummer.

Multipliziert den Bereich mit dem goldenen Winkel im Bogenmaß (der verwendete Wert liegt näher am wahren Wert als 137,508 Grad bis 6 sf).

Zeichnen Sie dann einfach Theta vs. R in einem Polarkoordinatendiagramm mit Punkten. Hier gezeigt mit 2000 Punkten

Polar

Ein etwas hübscher aussehendes Diagramm (keine Gitterlinien) wäre dieser Code:

t=2.39996*(1:input(''));[x,y]=pol2cart(t,t.^.5);plot(x,y,'.');axis equal

Dies geht jedoch zu Lasten von 31 Bytes. Auch hier ist es mit 2000 Punkten gezeigt

Handlung


Ich mag die polarLösung, ich habe sie noch nie benutzt. Ich denke, Sie können zwei Bytes sparen, indem t.^.5Sie statt sqrt(t)!
Fehler

@flawr Danke. Zwei Bytes in der Tat gespeichert.
Tom Carpenter

8

R, 58 55 54 Bytes

x=2.39996*1:scan();plotrix::radial.plot(x^.5,x,rp="s")

Dazu muss das plotrixPaket installiert werden, es muss jedoch nicht importiert werden, da wir explizit auf den Namespace verweisen.

Ungolfed:

# Read a number of STDIN
n <- scan()

x <- 2.39996*(1:n)

# The rp.type = "s" option specifies that we want to plot points rather
# than lines (the default)
plotrix::radial.plot(lengths = sqrt(x), radial.pos = x, rp.type = "s")

Beispielausgabe für n = 1500:

Bildbeschreibung hier eingeben

3 Bytes gespart dank Plannapus!


8

R, 55 54 Bytes

t=1:scan()*2.39996;r=t^.5;plot(r*cos(t),r*sin(t),as=1)

Hier ist das Ergebnis für n = 1000:

Bildbeschreibung hier eingeben

Bearbeiten: Dank @AlexA 1 Byte mit teilweiser Übereinstimmung der Argumente ( asanstelle von asp) gespeichert.!


6

R, 48 47 Bytes

Ich denke, das ist ausreichend anders als die anderen R-Lösungen bisher. Dieser verwendet komplexe Vektoren, um die Koordinaten zu konstruieren. Die Quadrate von t und t werden in die Modul- und Argumentparameter eingefügt, und die XY-Werte werden aus dem Real und dem Imaginären abgeleitet. Vielen Dank an @AlexA. für das Byte.

plot(complex(,,,t^.5,t<-1:scan()*2.39996),as=1)

Bildbeschreibung hier eingeben


1
Es ist nicht nur anders, es ist auch kürzer! +1.
El'endia Starman

Sie können ein Byte durch teilweisen Abgleich von Funktionsparametern speichern: askann anstelle von verwendet werden asp.
Alex A.

@AlexA. Danke Alex, ich vergesse immer wieder, diese zu testen :)
MickyT

3

HTML + JavaScript 179

<canvas id=C></canvas><script>n=1500,C.width=C.height=400,T=C.getContext('2d');for(n=prompt(M=Math);n--;)r=M.sqrt(t=n*2.4)*9,T.fillRect(M.cos(t)*r+200,M.sin(t)*r+200,2,2)</script>


2

Jolf, 25 Bytes

yG@@KyoΜzXDyOUH*Hm°yT'.}

Bildbeschreibung hier eingeben

(Ausgabe für n = 5000)

Probieren Sie es online aus. (Beachten Sie, dass die resultierende Spirale klein ist)

Nicht konkurrierend, da Jolf nach dieser Herausforderung geschaffen wurde. Dies sind 25 Byte, wenn es mit ISO-8859-7 codiert ist, und es enthält eines, das nicht gedruckt werden kann (hier ist ein Hexdump):

0000000: 7947 4096 404b 796f cc7a 5844 794f 5548  yG@.@Kyo.zXDyOUH
0000010: 2a48 6db0 7954 272e 7d                   *Hm.yT'.}

Erläuterung

yG@@KyoΜzXDyOUH*Hm°yT'.}
yG@@K                      goto (150,75) (center of the canvas)
     yo                    set current location as the origin
       MzX                 map over range 1...input
          D                start of function
           yO              goto polar coordinates ....
             UH            radius: square root of argument
               *Hm°        angle: argument times golden angle
                   yT'.    draw a dot there
                       }

2
Gut. Ich denke, ich muss mich jetzt trotz der seltsamen Kodierung um Jolf kümmern.
Lirtosiast

1

Python 2, 74 Bytes

from pylab import*
i=arange(1,input(),2.39996)
polar(i,sqrt(i),'o')
show()

1

MATL , 20 Bytes (nicht konkurrierend)

Als nicht konkurrierend markiert, da die Sprache die Herausforderung nachträglich angibt

:2.4*tX^wJ*Ze*'.'&XG

Probieren Sie es bei MATL Online!

Der goldene Winkel 137.708deg = pi*(3-sqrt(5))rad = 2.39996...rad wird als 2.4rad angenähert .

In der folgenden Version ( 25 Byte ) wird der exakte Wert bis zur doubleGleitkommagenauigkeit verwendet:

:YPI5X^-**tX^wJ*Ze*'.'&XG

Probieren Sie es bei MATL Online!


1

Tcl / Tk, 114

grid [canvas .c]
proc P n {time {incr i
.c cr o [lmap h {cos sin cos sin} {expr sqrt($i*2.4)*$h\($i*2.4)+99}]} $n}

Anwendungsbeispiel:

P 1024

und gibt das Fenster aus

Bildbeschreibung hier eingeben

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.