Звучит так, будто вы на самом деле говорите не о лазерном луче, а о пистолете, стреляющем ярким снарядом, отражающимся от поверхности, и затем вы хотите наблюдать, как он отскакивает от коробки. (Ну, по крайней мере, на эту проблему я отвечаю!) Существуют более сложные, эффективные, общие, точные и т. Д. Методы, но есть простое решение проблемы, особенно когда коробка имеет перпендикулярные стены (то есть обычная коробка ):
Используя направление стрельбы из пистолета, найдите три компонента скорости (vx, vy, vz), и на каждом временном шаге, пока вы рисуете пулю, обновите ее положение x + = dt vx, y + = DT VY, Z + = DT * VZ, и продолжайте делать это, пока не ударится о стену. Когда вы ударяете стену, просто переверните соответствующий компонент вектора скорости , например, если вы ударите стену параллельно плоскости y-z, возьмите vx -vx. И продолжайте в том же духе, пока не достигнете другой стены, а затем снова переверните соответствующий компонент ...
Вот пример в 2D, просто чтобы я мог показать график, но 3D точно такой же с этим простым методом. Я показываю и полный путь черным цветом, и выделяю некоторые его участки красным. Кроме того, пример в Python, но единственные ключевые строки импорта (x + = dt * vx, ...), вероятно, не потребуют много в переводе:
альтернативный текст http://i38.tinypic.com/k4238.png
from pylab import *
from collections import deque
dt = .01
x, y = .5, .5
vx, vy = .233, .61
data = deque(maxlen=100)
all_data = []
for i in range(6000):
x += dt*vx
y += dt*vy
if x<0 or x>1:
vx = -vx
if y<0 or y>1:
vy = -vy
# store data and plot
data.append((x, y))
all_data.append((x, y))
if i%400==0:
plot(*zip(*data), color='r', linewidth=4)
plot(*zip(*all_data), color='k')
show()
Как я уже сказал, не так эффективно, но очень просто.