Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
15-1406579402
Юрий
2014-07-29 00:30
2015.03.15
С днем рождения ! 29 июля 2014 вторник


3-1303294060
dim01
2011-04-20 14:07
2015.03.15
Компоненты Interbase


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


15-1406835192
A.P.V.
2014-07-31 23:33
2015.03.15
нет ли среди благородных донов пользователей edifactoring.net?


2-1391319886
Никита Антошин
2014-02-02 09:44
2015.03.15
Как узнать ІР-адреса сетевых карт ПК?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский