Накреслення спіралі Рону


33

Корінь спіраль може бути обчислена з використанням методи Фейнман для інтегралів по шляхах поширення світла. Ми наблизимо цей інтеграл, використовуючи наступну дискретизацію.

Розглянемо дзеркало, як на цьому зображенні, де Sджерело світла та Pточка, де ми збираємо світло. Ми припускаємо, що світло відбивається в прямому промені від Sкожної точки дзеркала, а потім до точки P. Розділимо дзеркало в Nсегментах, в даному прикладі 13, міченого Aз M, так що довжина шляху світла R=SN+NP, де SNце відстань від Sдо дзеркального сегмента N, і аналогічні для P. ( Зверніть увагу, що на зображенні відстань точок Sі Pдо дзеркала значно скорочено для візуальних цілей. Блок Qдосить не має значення і розміщується виключно для забезпечення відбиття через дзеркало та уникнення прямого світла від SдоP. )

Відбиваюче дзеркало

Для заданого хвильового числа Фазор променя світла може бути обчислена як , де знаходиться уявна одиниця. Позначення всіх цих фазорів головою до хвоста від лівого сегмента дзеркала праворуч веде до спіралі Корну. Для 13 елементів та значень, описаних нижче, це дає:kexp(i k R)i

введіть тут опис зображення

Для великих N, тобто багатьох дзеркальних сегментів, спіраль наближається до "справжньої" спіралі Корну. Перегляньте це зображення, використовуючи різні значення для N:

введіть тут опис зображення

Виклик

Для заданого Nнехай x(n)буде x -координатний центр n -го сегмента дзеркала ( n = 0,1,2,...,N):

x(n) := n/N-0.5

Нехай SN(n)буде відстань S = (-1/2, 1000)до n-го відрізка дзеркала:

SN(n) := sqrt((x(n)-(-1/2))^2 + 1000^2) 

тощо

NP(n) := sqrt((x(n)-1/2)^2 + 1000^2) 

Таким чином, загальна відстань, пройдена n -м променем світла, становить

R(n) := SN(n) + NP(n) 

Тоді ми визначаємо фазор (комплексне число) променя світла, що проходить через n -й сегмент дзеркала як

P(n) = exp(i * 1e6 * R(n)) 

Тепер ми розглядаємо сукупні суми (як наближення до інтегралу)

C(n) = P(0)+P(1)+...+P(n)

Мета - намітити кусково-лінійну криву через точки (C(0), C(1), ..., C(n)), де уявна частина C(n)має бути побудована проти її реальної частини.

Введення повинен бути числом елементів N, яке має як мінімум 100 і максимум , щонайменше , 1 мільйон елементів (чим більше , звичайно , дозволено).

Вихід повинен бути ділянку або зображення в будь-якому форматі , щонайменше , 400 × 400 пікселів, або з використанням векторної графіки. Колір лінії, масштаб осей і т. Д. Не мають значення, поки видно форму.

Оскільки це код-гольф, виграє найкоротший код у байтах.

Зверніть увагу, що це не фактична спіраль Корну, а її наближення. Початковий інтеграл шляху був апробований за допомогою наближення Френеля, і дзеркало не має нескінченної довжини і не містить нескінченну кількість сегментів, а також згадане воно не нормалізується амплітудами окремих променів.


5
У мене були значення, nпочинаючи з 1, але, погоджуючись з Луїсом і недоліком, які були єдиними відповідачами на момент зміни, я виправив це на те 0, що робить дзеркало симетричним і відповідає іншій проблемі. Вибачення.
Адріан

Відповіді:


20

MATL , 29 26 25 байт

Дякуємо @Adriaan за 3 байти!

Q:qG/q1e3YytP+1e6j*ZeYsXG

Ось приклад із введенням даних 365 366 … адже сьогодні перший день народження MATL! (і 2016 рік - високосний рік; дякує @MadPhysicist за виправлення).

Або спробуйте в MATL онлайн! (експериментальний компілятор; оновіть сторінку, якщо вона не працює).

введіть тут опис зображення

Пояснення

Q:q    % Input N implicitly. Push range [0 1 ... N] (row vector)
G/     % Divide by N, element-wise
q      % Subtract 1. This gives NP projected onto the x axis for each mirror element
1e3    % Push 1000. This is NP projected onto the y axis
Yy     % Hypotenuse function: computes distance NP
tP     % Duplicate, reverse. By symmetry, this is the distance SN
+      % Add. This is distance SNP for each mirror element (row vector)
1e6j   % Push 1e6*1i
*      % Multiply
Ze     % Exponential
Ys     % Cumulative sum
XG     % Plot in the complex plane

8
Схоплює найближчий рушник і кидає його в ...
Чарівна восьминога Урна

10
З Днем народження MATL!
Suever

1
Чи не 2016 рік високосний?
Божевільний фізик

14

MATLAB, 88 84 81 79 байт

g=@(x)hypot(1e3,x);h=@(x)plot(cumsum(exp(1e6i*(g(x)+g(1-x)))));f=@(N)h(0:1/N:1)

Дякую @LuisMendo за -3 байти, а @Adriaan за -2 байти!

Ця функція g- це функція відстані, яку ми використовуємо в SNі NP, і hрешта обчислення плюс графік. fфактичну функцію, яку ми хочемо, і вона виробляє необхідний нам вектор.

Це вихід для N=1111

вихід для N = 1111


12

GeoGebra , 107 байт

1
1E6
InputBox[a]
Polyline[Sequence[Sum[Sequence[e^(i*b(((k/a)^2+b)^.5+((k/a-1)^2+b)^.5)),k,0,a],l],l,1,a]]

Кожен рядок вводиться окремо у рядок введення. Вхід береться з поля введення.

Ось gif виконання:

Рогова спіраль

Як це працює

Вводячи 1та 1E6неявно призначаючи значення відповідно aта bвідповідно. Далі InputBox[a]команда створює вікно введення та пов’язує його a.

Внутрішня Sequenceкоманда повторює цілі значення значень kвід 0до aвключно. Для кожного значення kпотрібної відстані обчислюється за допомогою виразу ((k/a)^2+b)^.5+((k/a-1)^2+b)^.5). Потім множимо на i*b, де iє уявна одиниця, іe піднімається до результату. Це дає список складних чисел.

Після цього зовнішній Sequenceвиконує кумулятивний підсумок шляхом ітерації над цілими значеннями від lвід 1до aвключно. Для кожного значення lперших lелементів списку підсумовуються за допомогою Sumкоманди, знову отримуючи список складних чисел.

GeoGebra трактує комплексне число a + biяк точку (a, b). Отже, складні числа можна побудувати за допомогою Polylineкоманди, яка з'єднує всі точки в списку складних чисел прямими відрізками.


5

R, 102 82 80 байт

Редагувати: записує функцію для обчислення відстані

Edit2: Помітив майже однакову відповідь від @Plannapus (ну добре)

Edit3: збережено 2 байти завдяки @Plannapus

N=scan();x=1:N/N;plot(cumsum(exp((sqrt(x^2+1e6)+sqrt((x-1)^2+1e6))*1e6i)),t="l")

Бо N=1000ми отримуємо:

введіть тут опис зображення


Насправді ви можете досягти всього 80 байт, оскільки дужки xвже не знадобляться :N=scan();x=1:N/N;plot(cumsum(exp((sqrt(x^2+1e6)+sqrt((x-1)^2+1e6))*1e6i)),t="l")
плануйте

4

R, 86 83 81 байт

plot(cumsum(exp(1e6i*((1e6+(0:(N<-scan())/N)^2)^.5+(1e6+(0:N/N-1)^2)^.5))),t="l")

Дякую @JarkoDubbeldam за зайві 3 байти.

Для N = 1000:

N = 1e3


Нічого собі, 2 відповіді протягом 2 хвилин. Як це не дивно, я спробував те саме, і я не міг змусити його працювати, але це добре працює для мене: S Як би там не було, хороша робота!
JAD

Також використання сканування як такого plot(cumsum(exp(1e6i*(sqrt(1e6+(0:(N<-scan())/N)^2)+sqrt(1e6+(0:N/N-1)^2)))),t="l")економить кілька байтів
JAD

1

Математика 89 байт (87 символів)

Graphics[Line[ReIm/@Tr/@Table[E^(I*10^6*Tr[√(10^6+(-{0,1}+j/#)^2)]),{i,0,#},{j,0,i}]]]&

Використання:

%@100

врожайність

введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.