Итак, вы говорите о векторе в математическом смысле, а не о контейнере.Давайте все же предположим, что вы реализовали это с std::vector<fieldT>
, где, например, typedef double fieldT
.Кажется, вы хотите, чтобы направление отражалось каким-то препятствием.Легко, когда «зеркало» лежит в направлении одного из ваших базовых векторов, тогда вам нужно только отрицать этот компонент - «зеркало» в плоскости xy (в 3D) будет делать
v[2] = -v[2];
т.е. переворачивать z -компоненту, в плоскости yz это будет
v[0] = -v[0];
Ситуация усложняется, если возникают отраженияв произвольном направлении.Одна из возможностей состоит в том, чтобы определить компонент скорости в направлении плоскости - это делается путем вычисления скалярного произведения между вектором скорости и вектором нормали плоскости - и затем вычитать дважды вектор нормали, взвешенный с этим фактором.
std::vector<fieldT> n // normal vector of the plane
, v // speed vector
;
fieldT eta=0;
for (unsigned i=0; i<n.size(); ++i) //scalar product between v and n
eta += v[i]*n[i];
for (unsigned i=0; i<n.size(); ++i) //substract twice the weighted normal vector
v[i] -= 2*eta*n[i];
Более общим подходом было бы моделирование отражения с помощью матричного приложения: отражение по сути является применением ортогонального линейного отображения.