La spirale de Cornu peut être calculée à l'aide de la méthode de Feynman pour les intégrales de chemin de propagation de la lumière. Nous allons approximer cette intégrale en utilisant la discrétisation suivante.
Considérons un miroir comme dans cette image, où se S
trouve la source de lumière et P
le point de collecte de la lumière. Nous supposons que la lumière rebondit dans un rayon droit de S
chaque point du miroir à un point P
. Nous divisons le miroir en N
segments, dans cet exemple 13, étiquetés A
en M
, de sorte que la longueur du trajet de la lumière soit égale à R=SN+NP
, où SN
est la distance entre le S
segment du miroir N
et similaire pour P
. ( On notera que dans l'image de la distance de points S
et P
le miroir a été raccourci d' un lot, à des fins visuelles. Le bloc Q
est relativement sans importance, et placé uniquement pour assurer la réflexion via le miroir, et d' éviter la lumière directe provenant S
deP
. )
Pour un nombre d'onde donné, k
le phaseur d'un rayon de lumière peut être calculé comme suit exp(i k R)
, où i
est l'unité imaginaire. Le tracé de tous ces phaseurs de bout en bout à partir du segment de miroir gauche mène à la spirale de Cornu. Pour 13 éléments et les valeurs décrites ci-dessous, cela donne:
Pour les grands N
segments de miroir, la spirale se rapproche de la "vraie" spirale de Cornu. Voir cette image en utilisant différentes valeurs pour N
:
Défi
Pour une donnée N
laisser x(n)
être les x du centre -Coordonner du n segment de miroir -ième ( n = 0,1,2,...,N
):
x(n) := n/N-0.5
Soit SN(n)
la distance du S = (-1/2, 1000)
n-ième segment de miroir:
SN(n) := sqrt((x(n)-(-1/2))^2 + 1000^2)
et pareillement
NP(n) := sqrt((x(n)-1/2)^2 + 1000^2)
Ainsi , la distance totale parcourue par le n ième rayon lumineux est
R(n) := SN(n) + NP(n)
Ensuite, nous définissons le phaseur (un nombre complexe) du rayon lumineux passant par le n- ème segment du miroir comme suit:
P(n) = exp(i * 1e6 * R(n))
Nous considérons maintenant les sommes cumulées (comme une approximation d'une intégrale)
C(n) = P(0)+P(1)+...+P(n)
Le but est maintenant de tracer une courbe linéaire par morceaux à travers les points (C(0), C(1), ..., C(n))
, où la partie imaginaire de C(n)
devrait être tracée par rapport à sa partie réelle.
L' entrée doit être le nombre d'éléments N
, avec un minimum de 100 et un maximum d'au moins 1 million d'éléments (plus est autorisé).
La sortie doit être un tracé ou une image de tout format d'au moins 400 × 400 pixels, ou utiliser des graphiques vectoriels. La couleur de la ligne, l'échelle des axes, etc. sont sans importance, tant que la forme est visible.
Puisqu'il s'agit de code-golf, le code le plus court en octets gagne.
Veuillez noter qu'il ne s'agit pas d'une spirale de Cornu, mais d'une approximation. L'intégrale initiale du trajet a été approximée à l'aide de l'approximation de Fresnel, et le miroir n'a pas de longueur infinie ni de nombre infini de segments, de même qu'il n'est pas normalisé par les amplitudes des rayons individuels.
n
départ1
, mais en accord avec Luis et flawr, qui étaient les seuls à répondre au moment du changement, je l'ai corrigé0
, ce qui rend le miroir symétrique et correspond au reste du défi. Excuses.