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.
la source
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.Réponses:
MATL ,
292625 octetsMerci à @Adriaan pour 3 octets de moins!
Voici un exemple avec entrée … parce que c'est aujourd'hui le premier anniversaire de MATL! (et 2016 est une année bissextile; merci à @MadPhysicist pour la correction).
365
366
Ou essayez-le dans MATL en ligne! (compilateur expérimental; actualisez la page si cela ne fonctionne pas).
Explication
la source
MATLAB,
88 8481 79 octetsMerci @LuisMendo pour -3 octets et @Adriaan pour -2 octets!
La fonction
g
est la fonction de distance que nous utilisons dansSN
etNP
, eth
effectue le reste du calcul plus le traçage.f
la fonction réelle que nous voulons et produit le vecteur dont nous avons besoin.Ceci est la sortie pour
N=1111
la source
GeoGebra , 107 octets
Chaque ligne est entrée séparément dans la barre de saisie. L'entrée est prise à partir d'une zone de saisie.
Voici un gif de l'exécution:
Comment ça marche
La saisie
1
et1E6
attribue implicitement les valeurs àa
etb
respectivement. Ensuite, laInputBox[a]
commande crée une zone de saisie et l’associe àa
.La
Sequence
commande interne effectue une itération sur les valeurs entières comprises entrek
de0
et cellesa
incluses. Pour chaque valeur dek
, la distance requise est calculée à l'aide de l'expression((k/a)^2+b)^.5+((k/a-1)^2+b)^.5)
. Ceci est ensuite multiplié pari*b
, oùi
est l'unité imaginaire, ete
est élevé au résultat. Cela donne une liste de nombres complexes.Après cela, l’extérieur
Sequence
effectue la sommation cumulative en itérant des valeurs entièresl
allant de de1
àa
inclus. Pour chaque valeur del
, les premiersl
éléments de la liste sont additionnés à l'aide de laSum
commande, produisant à nouveau une liste de nombres complexes.GeoGebra traite le nombre complexe
a + bi
comme le point(a, b)
. Par conséquent, les nombres complexes peuvent être tracés à l'aide de laPolyline
commande, qui associe tous les points de la liste des nombres complexes à des segments de droite.la source
R,
102 8280 octetsEdit: mis au rebut la fonction de calcul de la distance
Edit2: Remarqué une réponse presque identique par @Plannapus (eh bien)
Edit3: 2 octets enregistrés grâce à @Plannapus également
Pour
N=1000
nous obtenons:la source
x
:N=scan();x=1:N/N;plot(cumsum(exp((sqrt(x^2+1e6)+sqrt((x-1)^2+1e6))*1e6i)),t="l")
R,
868381 octetsMerci @JarkoDubbeldam pour les 3 octets supplémentaires.
Pour N = 1000:
la source
plot(cumsum(exp(1e6i*(sqrt(1e6+(0:(N<-scan())/N)^2)+sqrt(1e6+(0:N/N-1)^2)))),t="l")
économise quelques octetsMathematica 89 octets (87 caractères)
Usage:
les rendements
la source