Вы делаете вещи сложнее, чем нужно.У вас есть коллекция объектов (которую вы называете figures
) и коллекция действий (которую вы называете moves
).Очевидный выбор с точки зрения ООП состоит в том, чтобы сделать moves
методы в ваших figures
классах.
Обновление
Исходя из комментария ниже, вы должны бытьиспользуя библиотеку линейной алгебры, такую как boost::ublas
.Также есть и другие, которые вы, возможно, захотите рассмотреть, такие как Eigen (более или менее показанный ниже).
Основная идея состоит в том, чтобы абстрагировать как фигуры, так и шаги, чтобы обобщить обапоэтому вам не нужно переписывать код для каждой возможной комбинации.Таким образом, вы бы создали базовый класс, который будет выглядеть примерно так:
template <typename T> class figure
{
std::vector<Eigen::Vector3d<T> > point_list;
...
void applyTransform(const Eigen::Affine3d<T>& src)
{
for (auto pt=point_list.begin(); pt != point_list.end(); pt++)
(*pt) = src * (*pt);
}
}
В этом случае вы определяете список точек на основе фигуры, которую вы визуализируете.Вы можете настроить значение точек в ваших производных классах, чтобы определить конкретные геометрические фигуры, которые вас интересуют. Класс Eigen::Affine3D
используется для определения преобразований, которые вы хотите применить.В Eigen уже определены вращения и другие аффинные преобразования, поэтому вы можете использовать их повторно.
Вы также можете взглянуть на некоторые специализированные классы геометрии OpenGL или DirectX, которые делают все это за вас.