Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Алгоритм расчета миллисекунд Формула [D7, 2003]


Страницы:   1 2 3

Иупштук ©   (2013-10-18 18:41:00) 

Подскажите пожалуйста алгоритм расчета миллисекунд.

Вот псевдокод, на самом деле я пока незнаю как его оформить, но смысл не в нем а в формуле расчета для переменной Pause


procedure Calk;
begin
 rim := Random(6000)+1000;
 Pause := ???
end;

procedure Blink;
begin
 F := True;   //зажгли лампочку
 Sleep(100);
 F := False;  //потушили лампочку
 Sleep(Pause);
end;



не соображу как лучше спросить.
Собс-но нужно как-то раcсчитать Pause так, что бы если процедура Blink будет вызываться как-то так
while true do Blink; и при rim = 1000 то Pause должно ровняться 900, при rim = 2000 -- Pause = 400
т.е. цикл блинк должен быть 1000 миллисекунд. При rim = 1000  -- лампочка должна моргнуть 1 раз в секунду 100 (горит) + 900 (не горит)
при rim=2000 лампочка моргает два раза 100+100 - и не горит 400+400 = 1000 миллисекунд.
при rim=3000 лампочка моргает три раза 100+100+100 и не горит 700/3 = 233 мск

Как-то вот так. как расчитать Pause? расчет должен быть актуальный и для например rim = 1678 или rim = Random(6000)+1000;

на самом деле rim не скачет по рандому, но меняется плавно или более резко в указанных пределах - типа спидометра на авто (скорость) или тахометра.
лампочка как бы должна моргать чем выше rim тем чаще.
Pause расчитывается как бы для цикла мигания лампочки в течении секунды, но на самом деле ждать секунду и моргать нет смысла. Просто от текущего значения rim расчитать новую pause и один раз моргнуть. Но если представить что rim замер то для его значения pause должна быть такая, чтобы подходило условию 1 мырг в секунду для 1000 rim

не знаю, понятно объяснил или нет. но если что поясню или отвечу на уточняющие вопросы. Заранее спасибо за понимание.


Inovet   (2013-10-27 03:28:00) [1]

> [49] ProgRAMmer Dimonych ©   (27.10.13 01:13)
> Пора рассказать, какая задача решается

Наконец-то. А то окажется, что обсуждаем задачу про xyz.


ProgRAMmer Dimonych   (2013-10-27 01:13:00) [2]

> [47] Иупштук   (25.10.13 16:12)

Пора рассказать, какая задача решается и почему нужно плавное изменение частоты моргания. Может быть, всё совсем не константно, а зависит от текущего значения чего-нибудь?


Туповатый   (2013-10-25 19:32:00) [3]


> можно было бы ограничится константами... зачем расчеты.

в одном из моих проектов было около 2000 констант. скорости ради. теперь догадайся, зачем расчеты.


Иупштук   (2013-10-25 16:12:00) [4]

Если бы так, то тогда можно было бы ограничится константами... зачем расчеты.


ProgRAMmer Dimonych   (2013-10-25 14:55:00) [5]

Вопрос на всякий случай: а точно надо для произвольных значений или на самом деле окажется, что есть 2–3 режима и используются только они?


[ВладОшин]   (2013-10-24 14:02:00) [6]


> Там выше было условие не использовать вещественных типов
> :)

замечательно,
CountM_WHILE_TIME: Integer;
TIME: integer;
юзать  
CountM_WHILE_TIME / TIME
или div TIme


Иупштук   (2013-10-24 13:12:00) [7]

Памяти мало, процессор слабый, скорость работы кода высокая а компактность по барабану... :)
...мало, слабый - катастрофически :)


Туповатый   (2013-10-24 12:57:00) [8]


> А так [16] не проще?) ...и без синусов-косинусов, квадратов
> и вещественных пи...

невозможно ответь без дополнительных данных. неизвестны параметры: использование памяти, тип процессора, компактность или скорость работы кода.


Иупштук   (2013-10-24 12:14:00) [9]


> Туповатый ©   (24.10.13 10:40) [40]
....
> T=sqrt(cos((x+c)/a)*Pi)+2  ?

А так [16] не проще?) ...и без синусов-косинусов, квадратов и вещественных пи...


Туповатый   (2013-10-24 10:43:00) [10]

вообще, в самом начале:
т.е. цикл блинк должен быть 1000 миллисекунд. При rim = 1000  -- лампочка должна моргнуть 1 раз в секунду 100 (горит) + 900 (не горит)
при rim=2000 лампочка моргает два раза 100+100 - и не горит 400+400 = 1000 миллисекунд.

абсолютно укладывается в то, что ты прочитал в вики.


Туповатый   (2013-10-24 10:40:00) [11]


> А мне так не нужно.

так напиши, как нужно. что, в школе не учили писать нечто типа:
a - константа,
x - длительность паузы,
с - длительность импульса
T- период,
T=sqrt(cos((x+c)/a)*Pi)+2  ?


Иупштук   (2013-10-24 10:09:00) [12]


> [ВладОшин] ©   (23.10.13 22:11) [3
...
>  CountM: Double;

Там выше было условие не использовать вещественных типов :)


> Туповатый ©   (23.10.13 14:58) [30]
> переформулируйте вопрос.например так:Как изменять период
> импульсов (Duty cycle)?тогда получите примерно такой ответ:
> Duty cycle (D) - отношение длительности импульса к периоду
> их следования.D = t/T, где t -длительность импульса, T -
>  период.

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


[ВладОшин]   (2013-10-23 22:11:00) [13]

а, не :)
если надо 2/3 раза мигнуть в секунду, то

var
 Second: Integer;
 Myrg: integer;
 CountM: Double;
begin
 Second := 1000;
 Myrg := 100;
 CountM := 2/3;
 ShowMessage( FloatToStr( (Second - CountM*Myrg)/CountM  ) );

= 1400
Что логично. еще 100 на мырг, и *2 , и = 3 секунды


[ВладОшин]   (2013-10-23 21:54:00) [14]


> А как по Вашей формуле сделать для rim = 1500? :) Должна
> получится пауза  600 мск.

надо понять что это 2 раза в три секунды (или три раза в две секунды)
а то эти rim-ляня порядком сбивают :)

если надо 3/2 раза мигнуть в секунду, то
(1000 - 1.5 *100)/1.5 ~ 566

если надо 2/3 раза мигнуть в секунду, то
(1000 - 0.66 *100)/0.66 ~ 666


Иупштук   (2013-10-23 19:48:00) [15]


> Так где ответ на вопрос: сколько получится для 11000?

Прошу прощения - это я не правильно понял ваши мысли)

А ответ для 10000 и выше пауза 0.
Но на самом деле rim не будет столько... От 0 до 9000.


Inovet   (2013-10-23 19:07:00) [16]

> [34] Inovet ©   (23.10.13 19:07)

Вот и уточняем - что же такое это правильно.


Inovet   (2013-10-23 19:07:00) [17]

> [30] Туповатый ©   (23.10.13 14:58)

Об этом я спрашивал где-то в начале, но автор не ответил, вернее ответил, что у него всё правильно.


Inovet   (2013-10-23 19:02:00) [18]

> [29] Иупштук   (23.10.13 14:17)
> Ибо отнимать нужно 100, 200, 300, 400.... а не прибавлять.

Так где ответ на вопрос: сколько получится для 11000?


Иупштук   (2013-10-23 18:47:00) [19]


> [ВладОшин] ©   (23.10.13 16:49) [31]

А как по Вашей формуле сделать для rim = 1500? :) Должна получится пауза  600 мск.


[ВладОшин]   (2013-10-23 16:49:00) [20]

Так может проще сказать сколько раз в секунду надо моргать?


секунда - (раз * мырг)
----------------------
        раз


1 раз: (1000 - 100)/1 = 900
2 раз: (1000 - 200)/2 = 400
3 раз: (1000 - 300)/3  ~ 233,(3)
и т.п.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо