Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2015.03.15;
Скачать: CL | DM;

Вниз

Помогите с формулой   Найти похожие ветки 

 
Борщи   (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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.006 c
15-1406872807
JohnKorsh
2014-08-01 10:00
2015.03.15
Поиск компонента или исходников ZIP


2-1391269043
Ден99
2014-02-01 19:37
2015.03.15
Ping


4-1245937247
robotic
2009-06-25 17:40
2015.03.15
Как не забирать фокус в момент открытия?


2-1391359486
elestrado
2014-02-02 20:44
2015.03.15
Классы объектов Delphi 7


15-1406296878
SergP
2014-07-25 18:01
2015.03.15
VPN-клиент в WinXP