Russian Qt Forum
Ноябрь 22, 2024, 17:55 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: Шаблон треугольника  (Прочитано 18761 раз)
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #30 : Июнь 17, 2016, 13:09 »

Прочитал на википедии про паттерн фасад. Глядя на пример BlackSabbath ничего не понятно, в чём тут паттерн... Либо я интуитивно его постоянно использую. Есть что-то маленькое, которое входит в состав чего-то большого и имеет свою ответственность.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #31 : Июнь 17, 2016, 13:12 »

Код из первого моего поста ведь тоже фасад? Три точки, которые управляются бОльшим классом.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #32 : Июнь 17, 2016, 13:50 »

И чем это лучше? Всё равно придётся копипастить весь класс..
Нет, только конструкторы с аргументами, остальное унаследуется. Хотя стоит ли оно того - хз. Напр вот реализация
Код
C++ (Qt)
float Triangle::Area( void )
{
return QVector3D::crossProduct(vertices[1] - vertices[0], vertices[2] - vertices[1]).length() / 2;
}
 
Очевидно для arma::vec3 это не прокатит. Арифметика (-, /) там наверное есть, а вот статический crossProduct вряд ли, да и length может быть другим. То же самое случится со многими (если не всеми) содержательными методами, итог обобщения - неск косметических сеттеров.

Также template проблематичен и с др стороны. Допустим мы добились желаемого и теперь может свободно объявлять
Код
C++ (Qt)
QVector<Triangle<QVector3D> > vec1;
QVector<Triangle<arma::vec3> > vec2;
...
 
Ну и как теперь с этим работать? Напр был класс
Код
C++ (Qt)
struct Model {
..
QVector<Triangle> mPoly;
..
};
 
А теперь, когда Triangle стал шаблоном - какой контейнер писать? И к кому обращаться методам использующим mPoly? Утрированный пример:
Код
C++ (Qt)
QImage<ARGB_32>;
QImage<RGB_32>;
QImage<Monochrome>;
...
 
Минусы (или просто глупость) такого решения очевидны.

Мои предложения

1) Реализовать всю содержательную часть Triangle для "старшего" типа, здесь это arma::vec3 и только хранилище (vertices) имеет тип аргумента template
Код
C++ (Qt)
class Triangle {
 Triangle( arma::vec3 & a, arma::vec3 & b, arma::vec3 & c )
 {
   SetVer(0, a);
   SetVer(1, b);
   SetVer(2, c);
 }
// Содержательные методы
//
 virtual arama::vec3 GetVer( size_t index ) = 0;
 virtual void SetVer( size_t index, const arama::vec3 & val ) = 0;
};
 
template <class T>
class TriangleImpl : public Triangle {
 virtual arama::vec3 GetVer( size_t index ) { return vertices[index]; };
 virtual void SetVer( size_t index, const arama::vec3 & val ) { vertices[index] = val; }
 
 T vertices[3];
};
Теперь T может быть чем угодно - лишь бы он умел приводиться к arma::vec3, это легко обеспечить. Да, есть расходы на перегонку, но они терпимы.

2) Подобным образом "замкнуть" template внутри контейнера полигонов
Код
C++ (Qt)
struct CPolyList {
virtual Triangle & Get( size_t index );
};
 
template <class T>
struct CPolyListImp : public CPolyList {
virtual Triangle & Get( size_t index ) { return mData[index]; }
 
QVector<TroangleImpl<T> > mData;
};
 
Теперь мы можем писать
Код
C++ (Qt)
CPolyList * poly;
poly = new CPolyListImp<QVector3D>;
..
poly = new CPolyListImp<arma::vec3>;

3) Вот что-то мне никак не верится что есть необходимость в хранении фундаментальных данных (полигонов) 2-мя или более способами. Впечатление что площадь считается по формуле Герона - ну тогда да, точность низкая.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #33 : Июнь 17, 2016, 14:30 »

3) плавно перевести проект с использования одного типа на другой.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #34 : Июнь 17, 2016, 15:12 »

3) плавно перевести проект с использования одного типа на другой.
К слову: VBO с double не дружит. Ошибок не выдает, но тормоза вместо ускорения. Не смертельно, но придется на карту подать временный массив float. По поводу "плавности" - все-таки лобовая замена дешевле, обобщение здесь оказывается совсем не простым.

Безболезненно? Вы шутите?) То что Вы сейчас предлагаете - это антипатерн..
Это как минимум не эффективно: приводить суперкласс к частным случаям (QVector3D, arma::vec3)..
Да, но эти скромные потери все же лучше чем все инфицировано template, там полный тупик.

И как быть с тем, что завтра мне понадобится использовать в качестве вектора /точки другой класс? (например с размерностью больше 3?) Ммм? Будете опять лезть в супервектор и добавлять новый функционал? И так до бесконечности?
Нет уж, нафиг-нафиг)         
Кстати размерность 4 - вполне реальный случай, так называемые "однородные" координаты, 4-е число - делитель. Часто используется для хранения перспективы, напр в OpenGL. Да, возможно тогда придется чего-то "специализировать", напр вычисление центра тр-ка, при этом приводясь к явному классу. Но это неизбежно, мы не можем получить 4-ю если базовый вектор имеет 3.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #35 : Июнь 17, 2016, 16:05 »

Минусы (или просто глупость) такого решения очевидны.
Это точно.

Но, как я понял, __Heaven__ хотел простого перехода от одного треугольника к другому, а не совместно их использовать в проекте:
Код
C++ (Qt)
#ifdef USE_QVECTOR3D
using Triangle = TriangleBase<QVector3D>;
#else
using Triangle = TriangleBase<arma::vec3>;
#endif
 
vector<Triangle> vec;
list<Triangle> lst;
 
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #36 : Июнь 17, 2016, 16:38 »

Old, в точку.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #37 : Июнь 17, 2016, 16:40 »

Igors, да. Vbo будет наполняться float.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #38 : Январь 30, 2017, 11:00 »

Кстати, не рассматривался вариант шаблонной обёртки для точки с оператором преобразования к типу. Он будет как-то хуже, чем предложенный с point_traits?
Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.186 секунд. Запросов: 23.