La spirale di Cornu può essere calcolata usando il metodo di Feynman per gli integrali di percorso della propagazione della luce. Approssimeremo questo integrale usando la seguente discretizzazione.
Considera uno specchio come in questa immagine, dove si S
trova la fonte di luce e P
il punto in cui raccogliamo la luce. Partiamo dal presupposto che la luce rimbalza in un raggio dritto da S
ogni punto nello specchio e quindi verso il punto P
. Dividiamo lo specchio in N
segmenti, in questo esempio 13, etichettati A
come M
, in modo che la lunghezza del percorso della luce sia R=SN+NP
, dov'è SN
la distanza dal S
segmento specchio N
e simili per P
. ( Si noti che nell'immagine la distanza dei punti S
e P
dello specchio è stata molto ridotta, per scopi visivi. Il blocco Q
è piuttosto irrilevante e posizionato puramente per garantire la riflessione attraverso lo specchio, ed evitare la luce diretta da S
aP
. )
Per un dato numero d'onda k
il fasore di un raggio di luce può essere calcolato come exp(i k R)
, dov'è i
l'unità immaginaria. Tracciare tutti questi phaser dalla testa alla coda dal segmento dello specchio sinistro a destra porta alla spirale di Cornu. Per 13 elementi e i valori descritti di seguito questo dà:
Per grandi N
, cioè molti segmenti speculari, la spirale si avvicina alla "vera" spirale di Cornu. Vedi questa immagine usando vari valori per N
:
Sfida
Per un dato N
lasciare che x(n)
essere i x centro -coordinate del n segmento di specchio -esimo ( n = 0,1,2,...,N
):
x(n) := n/N-0.5
Lascia che SN(n)
sia la distanza S = (-1/2, 1000)
dell'ennesimo segmento speculare:
SN(n) := sqrt((x(n)-(-1/2))^2 + 1000^2)
e similmente
NP(n) := sqrt((x(n)-1/2)^2 + 1000^2)
Così la distanza totale percorsa dal n -esimo raggio di luce è
R(n) := SN(n) + NP(n)
Poi definiamo il fasore (un numero complesso) del raggio di luce passa attraverso il n segmento di specchio esimo come
P(n) = exp(i * 1e6 * R(n))
Consideriamo ora le somme cumulative (come approssimazione a un integrale)
C(n) = P(0)+P(1)+...+P(n)
L'obiettivo è ora tracciare una curva lineare a tratti attraverso i punti (C(0), C(1), ..., C(n))
, in cui la parte immaginaria C(n)
dovrebbe essere tracciata rispetto alla sua parte reale.
L' input dovrebbe essere il numero di elementi N
, che ha un minimo di 100 e un massimo di almeno 1 milione di elementi (ovviamente ne è consentito un numero maggiore).
L' output deve essere un grafico o un'immagine in qualsiasi formato di almeno 400 × 400 pixel o utilizzando la grafica vettoriale. Il colore della linea, la scala degli assi ecc. Non sono importanti, purché la forma sia visibile.
Dato che si tratta di code-golf, vince il codice più breve in byte.
Si noti che questa non è una vera spirale di Cornu, ma un'approssimazione ad essa. L'integrale del percorso iniziale è stato approssimato usando l'approssimazione di Fresnel, e lo specchio non è entrambi di lunghezza infinita e non contiene un numero infinito di segmenti, così come menzionato non è normalizzato dalle ampiezze dei singoli raggi.
n
gamma1
, ma in accordo con Luis e Flawr, che erano gli unici risponditori al momento del cambiamento, l'ho corretto per essere0
, il che rende lo specchio simmetrico ed è in accordo con il resto della sfida. Scuse.