Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2014.10.12;
Скачать: [xml.tar.bz2];

Вниз

Алгоритм расчета миллисекунд Формула   Найти похожие ветки 

 
Иупштук   (2013-10-18 18:41) [0]

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

Вот псевдокод, на самом деле я пока незнаю как его оформить, но смысл не в нем а в формуле расчета для переменной 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

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


 
Вова   (2013-10-18 18:48) [1]

я ничо не понял )


 
Иупштук   (2013-10-18 18:56) [2]

представьте моргающую лампочку.
чем больше rim тем чаще моргает лампочка... т.е. меньше Pause
как для текущего rim вычислить Pause для одно вызова Blink;


 
Ega23 ©   (2013-10-18 18:58) [3]

Windows не является системой реального времени.


 
Иупштук   (2013-10-18 19:02) [4]

Да я в курсе.... мне просто алгоритм нахождения данного числа нужен :)
А объяснил как смог) Спасибо.


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

по математике двойка была..... шутка. Не, ну серьезно, что-то никак не соображу. Самому стыдно.
Для rim = 1500 pause должна быть такой, что бы лампочка моргнула три раза за две секунды


 
Иупштук   (2013-10-18 19:49) [6]

Хм.. вроде вот так получилось
procedure Calk;
begin
 rim:=Random(6000)+1000;
 fcnt:= rim / 1000;
 cnt:=trunk(fcnt)*100;
 Pause:= (1000 - cnt) / fcnt;
end;

Спасибо за помощь. но если будут комментарии - давайте


 
все арамисы, а я Дартаньян   (2013-10-18 20:12) [7]

на бумажке нарисуй график, чего ты хочешь, а из него и выводи формулы.


 
Inovet ©   (2013-10-18 22:59) [8]

Может ШИМ хочешь?


 
Иупштук   (2013-10-18 23:16) [9]


> Широтно-импульсная модуляция (ШИМ) — один из способов снижения
> воспринимаемой яркости в дисплеях, работающий путём быстрого
> циклического включения и выключения подсветки.

нет, мне просто необходимо моргать лампочкой прпорционально числу rim


 
Inovet ©   (2013-10-18 23:49) [10]

> [9] Иупштук   (18.10.13 23:16)

Какая разница дисплей или глаз циклопа. Ты написал многа букафф, а не понятно из писанного, что надо. Ты же приводишь какие-то соотношения, вот и объясни внятно - что там от чего зависит. Дисплей... Вот читай:

http://ru.wikipedia.org/wiki/%D0%A1%D0%BA%D0%B2%D0%B0%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C
и это читай
http://ru.wikipedia.org/wiki/%D0%A7%D0%B0%D1%81%D1%82%D0%BE%D1%82%D0%B0


 
Иупштук   (2013-10-19 00:35) [11]


> Inovet ©

Т.е. ты хочешь сказать, что в [6] где я сам себе ответил - это не правильно и нужно сделать по другому?


 
Inovet ©   (2013-10-19 01:14) [12]

> [11] Иупштук   (19.10.13 00:35)
> это не правильно и нужно сделать по другому?

Ты там написал "вроде", что означает неуверенность.


 
Иупштук   (2013-10-21 10:25) [13]

Подскажите, реально ли переделать это:
procedure Calk;
begin
 //rim:=Random(6000)+1000;
 rim:=3476;
 fcnt:= rim / 1000;
 cnt:=trunk(fcnt)*100;
 Pause:= (1000 - cnt) / fcnt; //=201
end;

Т.е. зная rim - целое число (например = 3476). Вычислить Pause (в данном случае должно получится 201) тоже целое не используя при этом вещественных типов, только целые?


 
stas ©   (2013-10-21 11:23) [14]

procedure Calk;
var fcnt:integer
begin


fcnt:= rim mod 1000
fcnt:= Round(rim / 1000)

так ?


 
stas ©   (2013-10-21 11:24) [15]

ой
fcnt:= rim div 1000


 
Иупштук   (2013-10-21 21:26) [16]

Хех.... вот так вроде.... конечно сомневаюсь, но вроде все верно:
procedure Calk;
var rim, Kol, Pause: Integer;
begin
 //rim:=Random(6000)+1000;
 rim:=3476;
 Kol:= (rim div 1000) * 100;
 Pause:= (((1000 - Kol) * 1000) div rim);  //=201
end;

Спасибо)


 
Inovet ©   (2013-10-21 22:11) [17]

А я так и не понял, что же ты считаешь.


 
Иупштук   (2013-10-21 22:35) [18]


> Inovet ©

Представь моргающую лампочку. Она моргает с частотой зависимой от rim.
чем выше rim тем чаще моргает. Зависимость такая при rim = 1000 лампочка моргает 1 раз в секунду.
Rim число меняющее в пределах 0 - 10000. примерно
Возьмем к примеру rim равно 2000 и на 5 сек замерло на этом этапе.
лампочка будет моргать так:
100мск горит + 400мск не горит + 100мск горит + 400мск не горит = секунда
т.е. два раза моргнула в секунду. и так пять раз...
Но мне не нужно знать о том сколько rim будет держаться мне просто нужно высчитать для текущего rim паузу, ее выдержать, за это время rim смениться его считать и на основе полученного нового rim высчитать новую паузу.... и т.д.


 
Иупштук   (2013-10-21 22:39) [19]

А, ну да.... изначально мне нужно было формулу, по которой высчитать паузу. Теперь понятно? :)


 
Inovet ©   (2013-10-21 23:02) [20]

> [19] Иупштук   (21.10.13 22:39)
> формулу, по которой высчитать паузу

> [18] Иупштук   (21.10.13 22:35)
> rim равно 2000

> [18] Иупштук   (21.10.13 22:35)
> 100мск горит + 400мск

Откуда 100 и 400? Почему не 250 и 250 или не 10 и 490?


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


> Inovet ©

Ё-моё... ну что же Вы как не сообразите :)

на 1000 rim 1 мырг лампочкой в секунду т.е. 100 миллисекунд горит и 900 не горит

на 2000 rim 2 мырга лампочкой в секунду т.е. 200 миллисекунд горит и 800 не горит 200 на два мырга по 100 и 800 между ними не горит два раза по 400
:)

100 - это постоянная величина. Время в миллисекундах сколько лампочка горит за один мырг. а вот 900 для 1000, 400 для 2000, 233 для 3000, 600 для 1500 нужно было рассчитать. ну и для любого rim конечно же...


 
Иупштук   (2013-10-21 23:22) [22]


> на 2000 rim 2 мырга лампочкой в секунду т.е. 200 миллисекунд
> горит и 800 не горит 200 на два мырга по 100 и 800 между
> ними не горит два раза по 400

ну т.е. за секунду 100 мск горит затем 400 не горит, а далее не повторяется а высчитывается новая пауза, но если rim так и останется 2000, то пауза будет опять 400 и будет казаться, что лампочка моргает 2 раза в секунду...
на самом деле моргает один раз с новой паузой....
Фух.... не знаю как еще объяснить :)
Ну да ладно.... вроде решился вопрос.


 
Inovet ©   (2013-10-22 00:51) [23]

> [21] Иупштук   (21.10.13 23:19)
> 100 - это постоянная величина. Время в миллисекундах сколько
> лампочка горит за один мырг. а вот 900 для 1000, 400 для
> 2000, 233 для 3000

Так 100 уже постоянная величина, ну пусть. 100 + будет для rim = 11000?


 
Inovet ©   (2013-10-22 00:52) [24]

> [22] Иупштук   (21.10.13 23:22)
> Фух.... не знаю как еще объяснить :)

Так прежде чем писать программу, надо бы объяснить хотя бы себе, что она должна делать.


 
Иупштук   (2013-10-23 10:28) [25]


> ну пусть. 100 + будет для rim

для rim=1000 + 100
для rim=2000 + 200
для rim=3000 + 300
для rim=1500 + 100
для rim=2999 + 200
case rim of
0..1999: +100;
2000..2999: +200;
3000..3999: +300;
.....


 
Inovet ©   (2013-10-23 11:01) [26]

> [25] Иупштук   (23.10.13 10:28)

Уже всё иначе, чем в прошлом посте.


 
Туповатый ©   (2013-10-23 12:03) [27]


> на 1000 rim 1 мырг лампочкой в секунду т.е. 100 миллисекунд
> горит и 900 не горит
>
> на 2000 rim 2 мырга лампочкой в секунду т.е. 200 миллисекунд
> горит и 800 не горит


период, скважность, длительность, коэффициент заполнения - вот необходимая терминология.


 
[ВладОшин] ©   (2013-10-23 12:10) [28]

>> Туповатый ©   (23.10.13 12:03) [27]
нормаль :)) как представлю:
Стоят такие два мырга.. небритые, с битами
- Это наши лампочки и мы их будем зажигать! Вали давай, ынтилигент вшивый..


 
Иупштук   (2013-10-23 14:17) [29]


> Inovet ©   (23.10.13 11:01) [26]

Ничего не иначе Длительность одной вспышки всегда одинаковая 100 мск, а вот пауза между вспышками разная. И если например rim = 3555 то в секунду будет 3 целых вспышки по 100 мск, а еще пол с чуточкой вспышки паузами между вспышками компенсируется....

а в [25] - это я привел Ваши мысли. И они не правильные. Ибо отнимать нужно 100, 200, 300, 400.... а не прибавлять.


 
Туповатый ©   (2013-10-23 14:58) [30]

переформулируйте вопрос.
например так:
Как изменять период импульсов (Duty cycle)?

тогда получите примерно такой ответ:
Duty cycle (D) - отношение длительности импульса к периоду их следования.
D = t/T, где t -длительность импульса, T - период.


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

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


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


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


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


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

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


 
Inovet ©   (2013-10-23 19:02) [33]

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

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


 
Inovet ©   (2013-10-23 19:07) [34]

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

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


 
Inovet ©   (2013-10-23 19:07) [35]

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

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


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


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

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

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


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


> А как по Вашей формуле сделать для 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 22:11) [38]

а, не :)
если надо 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-24 10:09) [39]


> [ВладОшин] ©   (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-24 10:40) [40]


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

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


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

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

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


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


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

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


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


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

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


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

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


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


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

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


 
ProgRAMmer Dimonych ©   (2013-10-25 14:55) [46]

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


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

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


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


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

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


 
ProgRAMmer Dimonych ©   (2013-10-27 01:13) [49]

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

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


 
Inovet ©   (2013-10-27 03:28) [50]

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

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



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2014.10.12;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.58 MB
Время: 0.003 c
15-1393587859
alexdn
2014-02-28 15:44
2014.10.12
Как продать программу за рубеж


15-1393878602
Юрий
2014-03-04 00:30
2014.10.12
С днем рождения ! 4 марта 2014 вторник


15-1394051405
Юрий
2014-03-06 00:30
2014.10.12
С днем рождения ! 6 марта 2014 четверг


15-1393593127
ТимоховДА
2014-02-28 17:12
2014.10.12
If (YouLoveVCL = true) then TReadThisNow.Create();


2-1382846989
Серёжка программист
2013-10-27 08:09
2014.10.12
XML





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский