![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Алгоритм расчета миллисекунд Формула [D7, 2003]
Иупштук © (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)
и т.п.