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

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

Страниц: 1 ... 3 4 [5] 6   Вниз
  Печать  
Автор Тема: оператор [] для union  (Прочитано 40499 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #60 : Май 17, 2018, 06:50 »

трэш конечно, но может как идея подойдет(не проеверял)
dst[1]=src[1]; должна работать
Ну как-то совсем вяло. Если трэш - то зачем пердлагать? Идея (насколько я понял) извлечь адрес и там уже темплейтом - так это никак не экономит свитчевание. И чего ж это присваивание должно работать если оператор [] возвращает по значению? Наоборот, не должно.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #61 : Май 17, 2018, 07:29 »

..и можно было даже на C++17 закладываться..
Я придерживаюсь совершенно противоположного мнения. Все эти новшества конечно интересны и полезны, но на архитектурные решения они практически никак не влияют.

Архитектурой Qt я не восторгаюсь
Хмм.. может не стоит так категорично? Тут наблюдается эффект о котором я читал в одной фэнтэзи (кажется "Маг в законе" но точно не помню). Смысл в чем: быть "нулевым" оказывается... хорошо Улыбающийся Ну вот не знает человек дуста, а слово "сплайн" только слышал и все. И что? Берет букварь, подбирает нужный класс и через денек-другой - реальный результат. А мы (такие умные) - все чего-то спорим, сомневаемся, а ни к чему реальному пока не пришли  Улыбающийся

Может попробуем с чего то начать? Как вообще должен хранить данные класс CParameter? (можно Curve, Container, называйте как хотите). Делать его "инстанциируемым темплейтом" нельзя, он сразу всех задолбает (см постановку выше). Тогда как? Qt реализует незатейливо
Код
C++ (Qt)
QVector<QPair<double, QVariant> >
 
Но мы-то знаем что вариант - зло, более того, у нас очень узкий набор типов (оглашен выше). И вообще - хорош ли тут QVector? Слушаю Ваши предложения/мысли
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #62 : Май 17, 2018, 10:36 »

Просьба цитированием не злоупотреблять
Здесь предполагается что вход интерполяции - просто TimeType t который QEasingCurve умеет посчитать. Однако для Безье-подобных кубических сплайнов это не так, там значение вычисляется
Код:
value = point0 * k0(t) + ctl0 * k1(t) + ctl1 * k2(t) + point1 * k3(t);
Где
t - время на сегменте (от 0 до 1)
point0, point1 - значения в начале и конце сегмента (напр QColor)
k(t) - интерполяционный полином (обычно Эрмит или Бернштейн)
ctl0, ctl1 - настраиваемые параметры (контрольные точки) сплайна

Вот этих настраиваемых параметров я в Qt реализации не увидел (ну может плохо смотрел). Это числа double которые юзер может менять подстраивая таким образом кривизну (собсно поэтому Безье сплайны так популярны). Числа свои для каждого "канала", напр для одного double - одно число, для координаты 3, для цвета 4. Таким образом каждый канал интерполируется независимо, хотя коэффициенты полинома одинаковы.

Ну и тут получается изрядная котовасия - просто так интерполировать "голые" значение (напр QColor) я не могу, т.к. нужно еще знать контрольные точки, но откуда их взять (где хранить)?

Причем тут EasingCurve, я просто показал пример. Параметры вы передаете в конструктор класса.
Или вы хотите сказать, что у вас от t меняется ctl1? т.е. value = point0 * k0(t) + ctl0(t) * k1(t) + ctl1(t) * k2(t) + point1 * k3(t); ?
Просто как я написал - да, зависит только от времени. В целом, можно всё это переделать на пачку параметров в виде мапы.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #63 : Май 17, 2018, 10:37 »

..и можно было даже на C++17 закладываться..
Я придерживаюсь совершенно противоположного мнения. Все эти новшества конечно интересны и полезны, но на архитектурные решения они практически никак не влияют.


Пару страниц назад вы жаловались что говнокодите потому что union не умеет в классы. Так вот, теперь умеет:)
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #64 : Май 17, 2018, 12:37 »

Все эти новшества конечно интересны и полезны, но на архитектурные решения они практически никак не влияют.

Архитектурные решения и алгоритмы обычно унифицированы и не сильно зависят от языка, на котором они будут реализовываться. Зато от языка и библиотек сильно зависит, сколько велосипедов и костылей придётся написать, чтобы воплотить эту архитектуру в коде. Для меня, с каждым принятым стандартом С++, написание кода упрощается, в некоторых аспектах очень даже значительно. И Ваш CData из начального поста есть не что иное, как std::variant, появившийся в С++17. Можно не велосипедить и boost не таскать Улыбающийся.

Тут наблюдается эффект о котором я читал в одной фэнтэзи (кажется "Маг в законе" но точно не помню). Смысл в чем: быть "нулевым" оказывается... хорошо Улыбающийся Ну вот не знает человек дуста, а слово "сплайн" только слышал и все. И что? Берет букварь, подбирает нужный класс и через денек-другой - реальный результат.

Если "нулевой" рассматривать в контексте, что у человека свежий взгляд на задачу и нет стереотипов по ней, то может и помочь. А может и нет. Если "нулевой", в смысле ничего не знает, то скорее совсем не поможет. Но сказки на то и сказки, чтобы Емеля-дурачок лежал на печи, а всё делалось "по щучьему веленью, по моему хотенью" Улыбающийся.

А мы (такие умные) - все чего-то спорим, сомневаемся, а ни к чему реальному пока не пришли  Улыбающийся

Не мы, а Вы Улыбающийся. Вам же что не предложи - всё не нравится.

Свои мысли и предложения я озвучил в "той самой теме". С тех пор они не изменились.
Записан

Пока сам не сделаешь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #65 : Май 18, 2018, 08:28 »

Или вы хотите сказать, что у вас от t меняется ctl1?
Нет, ctl0/ctl1 задаются юзером, причем они свои (индивидуальны) для каждой компоненты, напр для x, y, z будет тройка ctl0 и тройка ctl1. Тогда юзер может крутить этот вектор интерактивно (для этого Безье сплайн и берут). А в Qt реализации, к сожалению, этого нет, кривая как бы "одномерна".

Выкрутиться можно напр так: свалить все параметры в свой вариант и сказать EasyCurve что кривая линейна, а на интерполяции все посчитать самому - на так я практически ничего не имею с готового класса.

Пару страниц назад вы жаловались что говнокодите потому что union не умеет в классы. Так вот, теперь умеет:)
Я сказал что мой код выглядит весьма старомодно и предложил сравнить его с "современным"  Улыбающийся. Хотя пока никаких убедительных преимуществ "модерна" не наблюдаю - все равно надо "следить за тенденциями"   

Про "юнион в классы" не понял
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #66 : Май 18, 2018, 08:41 »

Свои мысли и предложения я озвучил в "той самой теме". С тех пор они не изменились.
В одной из наших полемик (может в той самой теме) я озвучил
Цитировать
мыслей как не было так и нет
Вижу тут тоже ничего не изменилось  Улыбающийся
Не мы, а Вы Улыбающийся. Вам же что не предложи - всё не нравится.
Ну вот хоть убейте - НЕ ПОМНЮ ни одного Вашего предложения. Может высказанные Вами идеи слишком тонкие для меня (я спокойно к этому отношусь), но ведь как ни крути, а данные так или иначе хранить придется. Вот пару постов назад задаю вопрос как. Ответа нет, только переводы стрелок Улыбающийся Ну на нет и суда нет
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #67 : Май 18, 2018, 10:03 »

Нет, ctl0/ctl1 задаются юзером, причем они свои (индивидуальны) для каждой компоненты, напр для x, y, z будет тройка ctl0 и тройка ctl1. Тогда юзер может крутить этот вектор интерактивно (для этого Безье сплайн и берут). А в Qt реализации, к сожалению, этого нет, кривая как бы "одномерна".

Выкрутиться можно напр так: свалить все параметры в свой вариант и сказать EasyCurve что кривая линейна, а на интерполяции все посчитать самому - на так я практически ничего не имею с готового класса.


Фейспалм.жпг.
Я не предлагаю исользовать QAnimation. Я предлагаю сделать по _аналогии_ - есть виртуальный метод интерполяции, а все параметры для интерполяции задаются в конструкторе. Юзер поменял параметр - ок, удалили старый интерполятор, создали новый. Или можно в нем геттеров-сеттеров наделать, как удобно.
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #68 : Май 18, 2018, 11:32 »

Ну вот хоть убейте - НЕ ПОМНЮ ни одного Вашего предложения.

Не вижу, не понимаю, не помню - тут я ничем помочь не могу. Это компетенция специалистов другой области Улыбающийся. Если этот пример - не предложение, то я уже и не знаю, что можно назвать предложением Улыбающийся. Но это было давно, можно и забыть.

Может высказанные Вами идеи слишком тонкие для меня (я спокойно к этому отношусь), но ведь как ни крути, а данные так или иначе хранить придется. Вот пару постов назад задаю вопрос как. Ответа нет, только переводы стрелок Улыбающийся Ну на нет и суда нет

Ещё ранее, чем "пару постов назад" я писал:
Цитировать
Например на то, как работать с контейнерами из элементов Value, Coord, Color по отдельности; в compile-time в составе структуры, tuple; в run-time в составе vector. Как для этого примеры операторов из моего VarData органично расширяются для контейнеров. Как можно std::any и его визитёров применять, чтобы в vector  в run-time добавлять различные контейнеры данных, если с проектированием голову особо ломать не хочется.
но да, это могло быть тонко Улыбающийся.

Фейспалм.жпг.
Я не предлагаю исользовать QAnimation. Я предлагаю сделать по _аналогии_ - есть виртуальный метод интерполяции, а все параметры для интерполяции задаются в конструкторе. Юзер поменял параметр - ок, удалили старый интерполятор, создали новый. Или можно в нем геттеров-сеттеров наделать, как удобно.

Про интерполятор уже что-то было. Не зашло Улыбающийся.
Записан

Пока сам не сделаешь...
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #69 : Май 18, 2018, 13:42 »

Ну там никогда "не заходит"
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #70 : Май 19, 2018, 10:27 »

Я не предлагаю исользовать QAnimation. Я предлагаю сделать по _аналогии_ - есть виртуальный метод интерполяции, а все параметры для интерполяции задаются в конструкторе. Юзер поменял параметр - ок, удалили старый интерполятор, создали новый. Или можно в нем геттеров-сеттеров наделать, как удобно.
Действуем по примеру из букваря, создали класс MyColor (4 float). Понимаем "интерполяция" буквально, т.е. взвешивание значений
Код
C++ (Qt)
QVariant myColorInterpolator(const MyColor &start, const MyColor &end, qreal progress)
{
// красная компонента
  float red = start.red * (1.0 - progress) + end.red * progress;
 
// др компоненты
   ...
   return MyColor(red, green, blue);
}
 
Пусть start = end = 0 (все компоненты нулевые), тогда на выходе получим тоже нулевой цвет при любом progress. Однако для настраиваемых сплайнов это нет так (аттач). Две нулевые точки могут интерполироваться самыми разнообразными кривыми, причем разными для разных компонент. Для этого надо написать напр так
Код
C++ (Qt)
float k0 = CalcK0(progress); // вычисление коэффициентов сплайна (зависят только от t)
...
float red = start.red * k0 + start.red_ctl1 * k1 + end.red_ctl0 * k2 + end.red * k3;
 
Причем progress должно быть оригинальным временем нормированным на сегменте (а не тем что вычисляет QEasyCurve, она здесь бесполезна). Но все равно рез-т зависит не только от типа данных, но и от типа сплайна. Поэтому вся затея с "таблицей интерполяторов" теряет смысл, поживиться с готового класса тут нечем
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #71 : Май 19, 2018, 10:41 »

Фейспалм2.жпг
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #72 : Май 19, 2018, 11:11 »

Если этот пример - не предложение, то я уже и не знаю, что можно назвать предложением Улыбающийся
И тогда и сейчас с удовольствием посмотрел Ваш пример. Нарисовали красиво, много всяких интересных бубочек что я не употребляю. За это спасибо. Но вот с "сутью", т.е.содержательной частью.. ну как-то и говорить неудобно. Это ж просто-напросто.. наследование Улыбающийся Которое кстати не имеет никакого отношения ни к новым стандартам, ни к std вообще. В данном случае его цель - замкнуть темплейтовскую заразу на базовом классе и общаться с темплейт-реализациями через него. Я не раз применял эту схему, да и все присутствующие наверняка тоже. Ну ладно, если это "предложение" - давайте немного пожуем. Вот огрызок чтобы было перед глазами
Код
C++ (Qt)
struct AbstractCurve
{
...
};
 
template <class Key, class Point, class Option = EmptyOption>
struct Curve final : public AbstractCurve
{
   struct Data
   {
       Key key;
       Point point;
       Option option;
   };
 ...
   using Container = vector<Data>;
   Container data;
...
};
Ну во-первых каждый чих надо оборачивать в базовый виртуал. Число эл-тов в контейнере - перекрытый виртуал, доступ к Key (у простых людей double, время) - опять виртуал и так все-все

Во-вторых, не решается главная проблема - доступ к элементу(ам). Да, часто вызывающий знает какой тип должен быть и может запросить его с темплейт аргументом (напр get<double>). Но часто и нет, чем инстанциироваться - неизвестно. Напр обменять местами 2 эл-та? Ну ладно, так еще можно через базовый виртуал (с натяжкой). Но вот присвоить один эл-т другому - и такой виртуал тащить? Видимо подозревая об этом Вы заметили
Соответственно нужно стремиться к методам в AbstractCurve, которые не зависят от типов данных кривых:
Это идет вразрез с общепринятой концепцией контейнеров. Получается контейнер где просто так эл-т не получить, как это? Заметим что даже наследование от контейнера обычно порицается, мол, действуйте хвункторами). Хотя часто напрасно

Сравним эту схему с простецкой в Qt (детали typedef опускаем)
Код
C++ (Qt)
QVector<QPair<TimeValue, QVariant> >
Ну согласитесь, ведь намного приятнее отой бандуры с виртуалами. Оберток - никаких, если вызывающий знает тип - он может инстанциироваться через вариант, но даже если не знает - QVariant он получит.

Про интерполятор уже что-то было. Не зашло Улыбающийся.
Ой, ну то было так, "не подумавши", тут можно только поулыбаться вместе  Улыбающийся
« Последнее редактирование: Май 19, 2018, 11:14 от Igors » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #73 : Май 20, 2018, 10:34 »

Фейспалм2.жпг
Так вот, я предлагаю это, а не то, что вы написали:

Код:
class ColorInterpolator : public AbstractInterpolator
{
ColorInterpolator(const MyColor &start, const MyColor &end, Hint hint):
    _start(start), _end(_end), _hint(hint)
{
}

QVariant interpolate(qreal progress) override
{
// красная компонента
    float k0 = CalcK0(_hint, progress); // вычисление коэффициентов сплайна (зависят только от t).
    // _hint - это что вам захочется, тип кривой (и тогда внутре будет свитч по типу кривой)
    // или модно передать std::function() которая будет вычислять эти ваши k.
    // или это просто массив будет
    // тут уж вам виднее, как удобнее считать коэффициенты
     ...
    float red = _start.red * k0 + _start.red_ctl1 * k1 + _end.red_ctl0 * k2 + _end.red * k3;
// др компоненты
    ...
    return MyColor(red, green, blue);
}

private:
};

Идея в том, что ВСЕ необходимые неизменяемые параметры передаются в конструктор.
По аналогии с лямбдой - захватываем контекст (опорные цвета, коэффициенты), а сама лямбда зависит только от t:
Код:
auto interpolate[k1, k2, k3, start, end](qreal time) { return /*ваша форумула*/; };
Только классом с виртуалом.
Можно без виртуала, можно std::function так и таскать и написать классов-функторов, которые и засунуть в эту функцию.
Главное, что вызов из был унифицирован - для параметра Key мы вызывали interpolate(key) { /*тут вызов этой std::function или класса нашего с виртуалом*/} и на выходе имели map<Key, Variant> которая полностью описывает состояние.
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #74 : Май 20, 2018, 11:53 »

Число эл-тов в контейнере - перекрытый виртуал, доступ к Key (у простых людей double, время) - опять виртуал и так все-все

Во-вторых, не решается главная проблема - доступ к элементу(ам). Да, часто вызывающий знает какой тип должен быть и может запросить его с темплейт аргументом (напр get<double>). Но часто и нет, чем инстанциироваться - неизвестно. Напр обменять местами 2 эл-та? Ну ладно, так еще можно через базовый виртуал (с натяжкой). Но вот присвоить один эл-т другому - и такой виртуал тащить? Видимо подозревая об этом Вы заметили
Соответственно нужно стремиться к методам в AbstractCurve, которые не зависят от типов данных кривых:
Это идет вразрез с общепринятой концепцией контейнеров. Получается контейнер где просто так эл-т не получить, как это? Заметим что даже наследование от контейнера обычно порицается, мол, действуйте хвункторами). Хотя часто напрасно

AbstractCurve - это не контейнер. Контейнер Curve::data находится в классе-реализации Curve. Это может быть vector<Data>, а может быть БД на сервере на противоположной стороне планеты. Про это я уже писал и смысла повторяться не вижу. Мы уже сошлись на том, что я любитель "маленьких, но по три", а Вы "больших, но по пять" Улыбающийся.

Сравним эту схему с простецкой в Qt (детали typedef опускаем)
Код
C++ (Qt)
QVector<QPair<TimeValue, QVariant> >
Ну согласитесь, ведь намного приятнее отой бандуры с виртуалами. Оберток - никаких, если вызывающий знает тип - он может инстанциироваться через вариант, но даже если не знает - QVariant он получит.

Если Вам эта штука приятнее отой бандуры с виртуалами, так и пользуйтесь на здоровье Улыбающийся.
Записан

Пока сам не сделаешь...
Страниц: 1 ... 3 4 [5] 6   Вверх
  Печать  
 
Перейти в:  


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