Вот способ размышления о проблеме, который может оказаться для вас полезным. В каждый момент фотон имеет положение (x, y) и направление (dx, dy). Переменные (dx, dy) являются коэффициентами единичного вектора, поэтому sqrt(dx**2 + dy**2) = 1.0
. Расстояние, пройденное фотоном за один шаг, составляет направление path_length *.
На каждом шаге вы делаете 4 вещи:
- рассчитать новую позицию фотона
- выяснить, покинул ли фотон Солнце, вычислив его расстояние от центральной точки
- определить с помощью одного случайного числа, сталкивается ли фотон или нет. Если это так, вы случайным образом генерируете новое направление.
- Добавление текущей позиции фотона в список. Возможно, вы захотите сделать это как функцию расстояния от центра, а не х, у.
В конце вы строите построенный список.
Вы должны также выбрать случайное направление в самом начале.
Я не знаю, как вы прервете цикл, потому что фотон никогда не гарантированно покинет солнце - как в реальном мире. В принципе, программа может работать вечно (или до тех пор, пока не сгорит солнце).
Существует небольшая неточность в том, что фотон может столкнуться в любой момент, а не только в конце одного шага. Но поскольку шаги невелики, то и ошибка, вносимая этим упрощением.
Я укажу, что вам ничего не нужно для этого, кроме, возможно, заключительного сюжета. Стандартная библиотека Python имеет все математические функции, которые вам нужны. Numpy, конечно, отлично подходит для манипулирования массивами данных, но единственный массив, который у вас здесь будет, это тот, который вы строите, шаг за шагом, положение фотона в зависимости от времени.
Как я указывал в одном из моих комментариев, вы моделируете солнце как двумерный объект. Если вы хотите выполнить этот расчет в трех измерениях, вам не нужно менять этот базовый подход.