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

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

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

Сообщений: 11445


Просмотр профиля
« : Январь 03, 2021, 14:57 »

Добрый день

Есть простая структурка
Код
C++ (Qt)
struct CFrameRange {
 int mStart = 0;     // первый кадр
 int mSttop = 12;  // последний кадр
 int mCount = 4;    // число вариантов выбора
};
Требуется написать для нее метод принимающий float от 0 до 1 и возвращающий номер кадра. Напр для дефаултных значений должны возвращаться один из номеров  0, 4, 8, 12, чем больше входной флоат - тем и номер больше
Код
C++ (Qt)
int CFrameRange::Val2Frame( float val ) const
{
 ???
}

Спасибо
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #1 : Январь 12, 2021, 14:26 »

А нужно красиво или тупо?

псевдо:

Код:
int CFrameRange::Val2Frame( float val ) const
{
    int index = atoi(std::to_string(val).replace("0.", ""));
    return index;
}

или что то не верно понял?
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #2 : Январь 12, 2021, 14:28 »

Или float - это процент до 100 грубо говоря. И чем он выше тем ближе к концу нужно выбрать кадр?
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #3 : Январь 14, 2021, 08:27 »

Код
C++ (Qt)
int len = stop - start;
int result = (len * val) / count;
result *= count;
 
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Январь 14, 2021, 12:14 »

Или float - это процент до 100 грубо говоря. И чем он выше тем ближе к концу нужно выбрать кадр?
Да, как % только от 0 до 1

Код
C++ (Qt)
int len = stop - start;
int result = (len * val) / count;
result *= count;
 
Опять "прете напролом" Улыбающийся Так кадр 12 поучится только если val = 1,0f (почти никогда)
« Последнее редактирование: Январь 14, 2021, 12:24 от Igors » Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #5 : Январь 14, 2021, 22:08 »

ну как напролом, что спрошено, то и предложено
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Январь 15, 2021, 11:43 »

ну как напролом, что спрошено, то и предложено
Не совсем. Если val распределено равномерно (или равновероятно), то и выбранных кадров (0, 4, 8, 12) должно быть примерно поровну.

Довольно мерзкая деталюшка "на округление"   Улыбающийся

Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #7 : Январь 17, 2021, 20:54 »

Код:
int CFrameRange::Val2Frame( float val ) const
{
    int len = stop - start;
    int lenInterval = len / count;
    float intervalPercent = (float)1 / lenInterval;
    int intervalIndex = floor(val / intervalPercent);
   
    float minFramePercent = intervalIndex * intervalPercent;
    float maxFramePercent = (intervalIndex + 1) * intervalPercent;
   
    float minFrameDiff = abs(minFramePercent - val);
    float maxFrameDiff = abs(maxFramePercent - val);
    int step = len / lenInterval;
    float framePer;
    if (minFrameDiff  < maxFrameDiff) {
        framePer = minFramePercent;
    }else {
        framePer = maxFramePercent;
    }

    return step * (framePer / intervalPercent);
}

Думаю можно как то сделать оптимальнее. Но у меня получилось вот так.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Январь 18, 2021, 12:13 »

...у меня получилось вот так.
Извините, "ни асилил" Ваш вариант. Вот что получилось у меня
Код
C++ (Qt)
int CFrameRange::Val2Frame( float val ) const
{
int index = int(val * mCount);
float step = float(mStop - mStart) / (mCount - 1);
int frame = int(index * step + 0.5f) + mStart;
return qBound(mStart, frame, mStop);
}
 
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #9 : Январь 18, 2021, 12:33 »

Извините, "ни асилил" Ваш вариант. Вот что получилось у меня
Код
C++ (Qt)
int CFrameRange::Val2Frame( float val ) const
{
int index = int(val * mCount);
float step = float(mStop - mStart) / (mCount - 1);
int frame = int(index * step + 0.5f) + mStart;
return qBound(mStart, frame, mStop);
}
 

Вы и ваш не очень осилили. Улыбающийся
Разве не может быть mCount = 1?
« Последнее редактирование: Январь 18, 2021, 12:36 от Old » Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #10 : Январь 18, 2021, 13:10 »

...у меня получилось вот так.
Извините, "ни асилил" Ваш вариант. Вот что получилось у меня
Код
C++ (Qt)
int CFrameRange::Val2Frame( float val ) const
{
int index = int(val * mCount);
float step = float(mStop - mStart) / (mCount - 1);
int frame = int(index * step + 0.5f) + mStart;
return qBound(mStart, frame, mStop);
}
 

+- тоже что и у Вас, только сложнее.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


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

if (val <= 0) return mStart;
if (val >= 1) return mStop;
int delta = (mStop-mStart) % mCount;
return val * delta + mStart;
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Январь 20, 2021, 16:55 »

if (val <= 0) return mStart;
if (val >= 1) return mStop;
int delta = (mStop-mStart) % mCount;
return val * delta + mStart;
Не понял юмора. Ну вот данные первого поста, остаток от деления = 0. Так что, всегда вернем mStart ?
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #13 : Январь 21, 2021, 12:06 »

Упс, малёх обшибся... "простите старика, маразьм":

if (val <= 0) return mStart;
if (val >= 1) return mStop;
float delta = (mStop-mStart) / mCount;
int index = (val * delta) * mCount + mStart;

а так?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Январь 21, 2021, 13:06 »

а так?
Так уже было, кадр 12 не возвращается никогда (почти)
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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