Die Cornu-Spirale kann mit der Feynman-Methode für Pfadintegrale der Lichtausbreitung berechnet werden. Wir werden dieses Integral annähern die folgende Diskretisierung verwendet.
Betrachten Sie einen Spiegel wie in diesem Bild, wo S
sich die Lichtquelle befindet und P
wo wir Licht sammeln. Wir nehmen an, dass das Licht in einem geraden Strahl von S
jedem Punkt im Spiegel und dann zu jedem Punkt reflektiert wird P
. Wir unterteilen den Spiegel in N
Segmente, in diesem Beispiel 13 mit der Bezeichnung A
bis M
, so dass die Weglänge des Lichts R=SN+NP
, wo SN
ist der Abstand S
zum Spiegelsegment N
und ähnliches für P
. ( Beachten Sie, dass im Bild die Entfernung von Punkten S
und P
zum Spiegel aus visuellen Gründen stark verkürzt wurde. Der Block Q
ist eher irrelevant und dient nur dazu, die Reflexion über den Spiegel sicherzustellen und direktes Licht von S
bis zu vermeidenP
. )
Für eine gegebene Wellenzahl kann k
der Zeiger eines Lichtstrahls wie folgt berechnet werden exp(i k R)
: Wo i
ist die imaginäre Einheit? Wenn alle diese Zeiger von Kopf bis Schwanz vom linken Spiegelsegment nach rechts aufgetragen werden, entsteht die Cornu-Spirale. Für 13 - Elemente und die unten beschriebenen Werte gibt:
Bei großen N
, dh vielen Spiegelsegmenten nähert sich die Spirale der "wahren" Cornu-Spirale. Dieses Bild zeigt verschiedene Werte für N
:
Herausforderung
Für ein gegebenes N
sei x(n)
das x- Koordinatenzentrum des n- ten Spiegelsegments ( n = 0,1,2,...,N
):
x(n) := n/N-0.5
Lassen SN(n)
der Abstand der S = (-1/2, 1000)
an den n-ten Spiegelsegment:
SN(n) := sqrt((x(n)-(-1/2))^2 + 1000^2)
und ähnlich
NP(n) := sqrt((x(n)-1/2)^2 + 1000^2)
Die vom n- ten Lichtstrahl zurückgelegte Gesamtstrecke beträgt also
R(n) := SN(n) + NP(n)
Dann definieren wir den Zeiger (eine komplexe Zahl) des Lichtstrahls, der durch das n- te Spiegelsegment geht, als
P(n) = exp(i * 1e6 * R(n))
Wir betrachten nun die kumulativen Summen (als Annäherung an ein Integral)
C(n) = P(0)+P(1)+...+P(n)
Das Ziel ist nun, eine stückweise lineare Kurve durch die Punkte zu zeichnen (C(0), C(1), ..., C(n))
, an denen der Imaginärteil von C(n)
gegen seinen Realteil aufgetragen werden soll.
Die Eingabe sollte die Anzahl der Elemente sein N
, die ein Minimum von 100 und ein Maximum von mindestens 1 Million Elementen hat (mehr ist natürlich erlaubt).
Die Ausgabe sollte ein Plot oder ein Bild in einem beliebigen Format von mindestens 400 × 400 Pixel oder unter Verwendung von Vektorgrafiken sein. Die Farbe der Linie, der Achsenskala usw. ist unwichtig, solange die Form sichtbar ist.
Da dies Codegolf ist, gewinnt der kürzeste Code in Bytes.
Bitte beachten Sie, dass dies keine tatsächliche Cornu-Spirale ist, sondern eine Annäherung an diese. Das Anfangspfadintegral wurde unter Verwendung der Fresnel-Näherung angenähert, und der Spiegel hat sowohl keine unendliche Länge als auch keine unendliche Anzahl von Segmenten und wird auch nicht durch die Amplituden der einzelnen Strahlen normiert.
n
von1
, aber in Übereinstimmung mit Luis und Flawr, die zum Zeitpunkt des Wandels die einzigen Antwortenden waren, korrigierte ich es auf von0
, was den Spiegel symmetrisch macht und mit dem Rest der Herausforderung übereinstimmt. Entschuldigung.