Форум: "Прочее";
Текущий архив: 2015.03.15;
Скачать: [xml.tar.bz2];
ВнизПомогите с формулой Найти похожие ветки
← →
Борщи (2014-07-31 17:26) [0]Всем здравия.
Делаю вот такую вещь.
Есть нарисованный прямоугольник.
Если мы навели на него курсор - он плавно окрашивается в цвет, где интенсивность цвета измеряется от 0.0 до 1.0.
Если отвели, то от также плавно "сбрасывает" цвет.
Переменная DurationEnter содержит длительность в миллисекундах до того, как произойдет окончательное окрашивание прямоугольника.
Допустим это 600 мс. (Константа DURATION_ENTER)
Т.е. наводим курсор, проходит 600 мс. и прямоугольник полностью окрасился.
Переменная DurationLeave содержит длительность в миллисекундах того, сколько будет длится "сбрасывание" цвета.
Т.е. наводим курсор, проходит не 600 мс. а скажем 200 мс, отводим курсор, то DurationLeave будет равно 200.
Есть функция GetColorIntensive(), которая возвращает число от 0.0 до 1.0.
Используется для установки интенсивности окрашивания прямоугольника.
GetColorIntensive() при окрашивании (Когда курсор навели) рассчитывается от значения DurationEnter.
Так:
function GetColorIntensive(): Single
begin
Result:= (DurationEnter / DURATION_ENTER);
end;
Вопрос в том, что я не знаю как сделать GetColorIntensive() при сбрасывании цвета (Когда курсор отвели)
Т.е. GetColorIntensive() должно вернуть число от 0.0 до 1.0, что она вернет при значении DurationLeave = 200?
Если при DurationLeave = DURATION_ENTER вернет 1.0?
По какой формуле привести эту соразмерность, что-то туплю?
← →
Борщи (2014-07-31 17:29) [1]Т.е. в промежуток 0..600 вернет соотношение 0.0..1.0.
Промежуток 0..200 также вернет соотношение 0.0..1.0, но это не то.
← →
junglecat (2014-07-31 17:38) [2]не понятно, в чем проблема.
Если переменная enter увеличивается, а leave - уменьшается, то и так все будет нормально
DurationEnter = 0
...
DurationEnter = 200 увели курсор, интенсивность = 0.3
DurationLeave = 200
...
DurationLeave = 0 интенсивность 0
← →
junglecat (2014-07-31 17:45) [3]кстати, а зачем вообще 2 переменные?
← →
Борщи (2014-07-31 18:14) [4]
> junglecat (31.07.14 17:45) [3]
>
> кстати, а зачем вообще 2 переменные?
так удобней и наглядней
> junglecat (31.07.14 17:38) [2]
> DurationEnter = 200 увели курсор, интенсивность = 0.3
Мне нужно, чтобы, когда 200 плавно уменьшается к 0, получить правильную интенсивность цвета от 0.0. до 1.0.
Что-то додуматься не могу.
← →
junglecat (2014-07-31 18:19) [5]function GetColorIntensive(): Single
begin
Result:= (DurationEnter / MaxDuration);
end;
enter()
begin
MaxDuration := DURATION_ENTER;
начинаем увеличивать DurationEnter;
end;
leave()
begin
MaxDuration := DurationEnter;
DurationEnter := 0;
начинаем увеличивать DurationEnter;
end;
← →
MBo © (2014-07-31 19:08) [6]график цвет/время нарисуй, тогда вопрос может проясниться
← →
Д (2014-08-01 22:40) [7]var
FCurrentIntensive: Double = 0;
Timer.Interval := 50; // Частота анимации, 1000/50 = 20 перерисовок в секунду
Пока курсор над:
if FCurrentIntensive < 1 then
begin
FCurrentIntensive := FCurrentIntensive + Timer.Interval / DurationEnter;
if FCurrentIntensive > 1 then
FCurrentIntensive := 1;
Invalidate;
end;
Когда курсор не над:
On MouseOver:
if FCurrentIntensive > 0 then
begin
FCurrentIntensive := FCurrentIntensive - Timer.Interval / DurationLeave;
if FCurrentIntensive < 0 then
FCurrentIntensive := 0;
Invalidate;
end;
P.S. И да, надо следить за тем, чтобы DurationEnter и DurationLeave было > 0.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2015.03.15;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.001 c