Масштабирование значения индикатора выполнения - PullRequest
0 голосов
/ 15 февраля 2012

Я настраиваю индикатор выполнения следующим образом:

void CProgressBar::add(int ammount)
{
    mProgress += ammount;
}

float CProgressBar::get()
{
    float pr = (float)mProgress * 100.0f / (float)mMax;
    return pr;
}

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

/*
    Progress bar box has size of 128x16
    |-----------|
    |-----------|
*/
float progress = progressBar->get();
float scale = 4.0f; //Here i have it hardcoded although i have to make this generic

progress *= scale;
graphics->color(prgColor);
graphics->renderQd(CRect(x,y,progress,height));

Так что я прошу помощи в этом вопросе ...

Ответы [ 2 ]

1 голос
/ 15 февраля 2012

Вы должны линейно интерполировать между шириной прямоугольника с прогрессом 0% и шириной прямоугольника с прогрессом 100%.EG:

float width_0 = 0.f; // or any other number of pixels
float width_100 = 250.f; // or any other number of pixels

Интерполяция работает следующим образом:

float interpolated_width = (width_100 - width_0) * progress + width_0;

Важно: progress должно быть в диапазоне от 0 до 1!Поэтому вы можете захотеть изменить функцию CProgressBar::get() или сначала разделить на 100.

Теперь вы можете просто визуализировать прямоугольник с новой шириной:

graphics->renderQd(CRect(x,y,interpolated_width,height));
0 голосов
/ 15 февраля 2012

Ширина вашего индикатора выполнения равна 128, а функция progress-> get () возвращает что-то между 0 и 100, поэтому, не зная деталей вашей библиотеки, кажется, что ваш масштаб должен быть 1,28

Я предполагаю, что mMaxзначение полного прогресса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...