У меня есть класс item
. Каждый экземпляр этого класса представляет собой объект в трехмерном пространстве, может иметь базовые формы, такие как цилиндр, сфера и конус. У class Item
есть удобный API для геометрии (радиус, верхний радиус, радиус бота, длина) и трансформаций (поворот, перемещение, масштабирование).
enum ItemType {
Sphere = 1,
Cone
}
class Item
{
// ...
public:
ItemType type();
void setType(const ItemType &t);
float radius();
float length();
float topRadius();
float botRadious();
QMatrix4x4 transformations();
void setRadius(const float &r);
void setLength(const float &l);
void setTopRadius(const float &tr);
void setBotRadius(const float &br);
void setTransformations(const QMatrix4x4 &matrix);
// ...
}
Часто мне нужно склеить несколько объектов вместе, чтобы сформировать единую форму. Например, ниже соединены две сферы и конус. Геометрия и преобразования объединенного объекта зависят от двух сфер и одного конуса.
Проблема в:
- Удобное обращение с единым объектом невозможно
- Под обращением я подразумеваю, например, трансформацию. Например, изменение длины единого объекта требует, соответственно, изменения длины среднего конуса и расположения двух сфер.
class Item
есть API для удобной работы с каждым отдельным объектом, а не с единым- Для обработки единого объекта мне приходится работать с тремя разными объектами, что мучительно.
Вопрос в том:
Какие шаблоны проектирования лучше всего подходят для удобной обработки унифицированных объектов?
radius
не имеет смысла для ограничивающей рамки илиTopRadius
для сферы... - person Jarod42   schedule 17.10.2019Group
, который определяет произвольную контрольную точку (скажем, центр масс) и запоминает, как каждыйItem
в группе позиционируется и поворачивается относительно этой контрольной точки. Это уже позволяет вращать, масштабировать и перемещать группу. Если вам нужно дополнительное поведение (например, растяжение конуса вдоль одной оси), вам нужно будет назначить один из элементов корневым и определить, как каждое изменение влияет на остальную часть группы. - person Botje   schedule 17.10.2019Group
и классомItem
? - person user3405291   schedule 17.10.2019Group
будет содержать набор (std::vector
,std::list
, ...) изItem
экземпляров, каждый из которых имеет перемещение, поворот и масштаб относительно контрольной точки группы. - person Botje   schedule 17.10.2019