Электрик-студент
Гость
|
|
« : 03-12-2008 07:04 » |
|
Уважаемые программисты, помогите пожалуйтса понять процедуру. Не могу найти её описание: procedure Dec2Polar(Ang, Len: Real; var P: TPoint); begin Ang := Ang - 90; { Correlation for our coord system } P.x := Xc + Len * cos(Ang * Pi / 180); P.y := Yc + Len * sin(Ang * Pi / 180); end; Нсколько я смог разобраться это перевод из декартовых координат в полярные. Но возникает ряд вопросов: откуда программа берет значения Ang, Len, P??? Мы их только объявляем, но значения не присваиваем Сама программа, это идущие стрелочные часы показывающие системное время!
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #1 : 03-12-2008 07:22 » |
|
Вообще, судя по коду, оно, вопреки названию, переводит наоборот - полярные в декартовы Принимает угол (в радианах) и расстояние от центра, а возвращает точку в декартовых координатах. Что в контексте отрисовки часов имеет смысл: угол поворота, видимо, перед этим вычисляется исходя из текущего времени, и по этому углу и длине вычисляется точка, в которой находится конец стрелки.
|
|
« Последнее редактирование: 03-12-2008 07:26 от Вад »
|
Записан
|
|
|
|
Sla
|
|
« Ответ #2 : 03-12-2008 07:34 » |
|
полностью согласен с Вад'ом XC и YC координаты центра циферблата
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Электрик-студент
Гость
|
|
« Ответ #3 : 04-12-2008 07:18 » |
|
Спасибо!!! А вот с этим не поможете разобраться?! Это продолжение той же программы. for i := 0 to 23 do begin Dec2Polar(i * 15, Yc - 40, P); Circle(Round(P.x), Round(P.y), 2 + 3*Byte(i mod 2 = 0)); end;
{ SetLineStyle(0, 0, 3);} while not keypressed do begin { Erase } SetColor(0); Line(Round(P2.x), Round(P2.y), Round(P.x), Round(P.y)); Line(Round(P4.x), Round(P4.y), Round(P3.x), Round(P3.y)); Line(Round(P6.x), Round(P6.y), Round(P5.x), Round(P5.y));
GetTime(H, M, S, Hund);
{ Second arrow } Dec2Polar((S + Hund/100) * 6, Yc - 50, P); Dec2Polar((S + Hund/100) * 6, 5, P2);
{ Minute arrow } Dec2Polar((M + S/60) * 6, Yc - 100, P3); Dec2Polar((M + S/60) * 6, 5, P4);
{ Hour arrow } Dec2Polar((H + M/60) * 30, Yc - 150, P5); Dec2Polar((H + M/60) * 30, 5, P6);
{ Redraw } SetColor(15); Line(Round(P2.x), Round(P2.y), Round(P.x), Round(P.y));
SetColor(9); Line(Round(P4.x), Round(P4.y), Round(P3.x), Round(P3.y));
SetColor(7); Line(Round(P6.x), Round(P6.y), Round(P5.x), Round(P5.y));
у меня получилось так: for i := 0 to 23 do Деления циферблата begin Dec2Polar(i * 15, Yc - 40, P); Circle(Round(P.x), Round(P.y), 2 + 3*Byte(i mod 2 = 0)); в Турбо Паскале есть операция MOD - получение остатка от целочисленного деления. end;
{ SetLineStyle(0, 0, 3);} Устанавливает текущие толщину и цвет линии. (тип, образец, толщина линии) Цикл вывода стрелок while not keypressed do Оператор цикла while с предпроверкой условия: пока не нажата клавиша делать (выполнять) оператор keypressed (Анализирует нажатие клавиши. Результат TRUE, если на клавиатуре нажата клавиша (кроме Alt, Ctrl и т.п.), и FALSE в противном случае. Не задерживает исполнение программы.) begin { Erase } SetColor(0); Устанавливает основной цвет, которым будет осуществляться рисование Line(Round(P2.x), Round(P2.y), Round(P.x), Round(P.y)); ROUND округляет REAL до ближайшего целого Line(Round(P4.x), Round(P4.y), Round(P3.x), Round(P3.y)); Line(Round(P6.x), Round(P6.y), Round(P5.x), Round(P5.y));
GetTime(H, M, S, Hund); Процедура для работы с датой и временем, возвращает текущее время, установленное в операционной системе. GetTime занимается тем, что берет текущую дату/время и преобразует его к виду, переданному как параметр. Затем полученная строка передается внешней программе или записывается в файл.
{ Second arrow } Стрелка часа Dec2Polar((S + Hund/100) * 6, Yc - 50, P); Dec2Polar((S + Hund/100) * 6, 5, P2);
{ Minute arrow } Стрелка минут Dec2Polar((M + S/60) * 6, Yc - 100, P3); Dec2Polar((M + S/60) * 6, 5, P4);
{ Hour arrow } Стрелка секунд Dec2Polar((H + M/60) * 30, Yc - 150, P5); Dec2Polar((H + M/60) * 30, 5, P6);
{ Redraw } Перерисовка SetColor(15); Line(Round(P2.x), Round(P2.y), Round(P.x), Round(P.y)); рисует линию от точки P2.x, P2.y к точке P.x, P.y
SetColor(9); Line(Round(P4.x), Round(P4.y), Round(P3.x), Round(P3.y));
SetColor(7); Line(Round(P6.x), Round(P6.y), Round(P5.x), Round(P5.y));
Round - это как бы цикл совершается вокруг этих точек :
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #4 : 04-12-2008 07:23 » |
|
round - как бы округляет полученный результат
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Вад
|
|
« Ответ #5 : 04-12-2008 08:36 » |
|
SetColor(0) и то, что дальше - закрашивает (чёрным?) предыдущее положение стрелок, если я всё правильно понял. Стрелка часа и стрелка секунд - перепутано местами Hour arrow - это часовая SetColor(15) и далее - отрисовка новой позиции стрелок.
|
|
|
Записан
|
|
|
|
Электрик-студент
Гость
|
|
« Ответ #6 : 04-12-2008 08:41 » |
|
Да, спасибо, это я уже нашел: координаты должны быть целочисленными, нужно использовать функцию round - округление!!! Ещё пожалуйста уделите мне немножко времени!!! Вот это не могу понять как работает: Dec2Polar(i * 15, Yc - 40, P); Circle(Round(P.x), Round(P.y), 2 + 3*Byte(i mod 2 = 0)); и вот: { Second arrow } Стрелка секунд Dec2Polar((S + Hund/100) * 6, Yc - 50, P); Dec2Polar((S + Hund/100) * 6, 5, P2);
и ещё вопросик в процедуре GetTime, Hund - это миллисекунды( а точнее - сотые части)
|
|
|
Записан
|
|
|
|
Электрик-студент
Гость
|
|
« Ответ #7 : 04-12-2008 08:44 » |
|
Вад Команда клуба, спасибо!!! Я так определил: Нужно очищать изображение перед каждой новой отрисовкой. Самый простой способ очистить - закрасить его весь цветом фона. А со стрелками просто невнимателность
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #8 : 04-12-2008 08:51 » |
|
Электрик-студент, всё правильно сделал ) А не мигает картинка ? Можно ещё сделать битмап часов без стрелки (нарисовать вначале и помнить) - ляпать сначала его, потом рисовать стрелки. Тогда мигать точно не будет
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #9 : 04-12-2008 08:57 » |
|
Алексей1153++, +1 Электрик-студент, я так понимаю, что Circle в твоём случае рисует маленькие круги по периметру циферблата - делает насечку делений. Зачем-то делается 24 деления, и чётные рисуются жирнее - я так понимаю, они должны соответствовать часовым отметкам. Поэтому вопрос к тебе - GetTime возвращает часы в 12-часовом интервале или в 24-часовом? На циферблат традиционно выводят в 12-часовом
|
|
|
Записан
|
|
|
|
Электрик-студент
Гость
|
|
« Ответ #10 : 04-12-2008 09:18 » |
|
Делений как таковых нет! Есть действительно круги на месте делений, которые побольше в диаметре, те означают часы, а между ними маленькие, т.е. получается так, большой круг(12)-маленький-большой(1)-маленький и т.д. Вроде в 12-часовом
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #11 : 04-12-2008 09:25 » |
|
Электрик-студент, странно, всю жизнь считал что в 24 часовом формате
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #12 : 04-12-2008 09:32 » |
|
рисуются просто не только "часы" (побольше) но и "полу-часы" (моменьше)...
Dec2Polar(i * 15, Yc - 40, P); Circle(Round(P.x), Round(P.y), 2 + 3*Byte(i mod 2 = 0));
здесь 15 это 15 градусов... то есть, рисуется 24 круга по окружности со смещением в 15 градусов - получаем один полный круг.
|
|
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #13 : 04-12-2008 09:35 » |
|
возвращает она в 24-х часовом но при переводе в градусы * 30 - получается все правильно - 720 градусов за сутки.
|
|
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
Электрик-студент
Гость
|
|
« Ответ #14 : 04-12-2008 10:36 » |
|
24 секундная стрелка Dec2Polar((S + Hund/100) * 6, Yc - 50, P); Dec2Polar((S + Hund/100) * 6, 5, P2); А здесь как?! и ещё вопросик в процедуре GetTime, Hund - это миллисекунды( а точнее - сотые части), вот там Sсекунды,Mминуты, Hчасы, Hund? Нигде нет информации
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #15 : 04-12-2008 11:12 » |
|
Электрик-студент, ну как это нет нигде информации? неужели в help'е нету? Не верю!
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Электрик-студент
Гость
|
|
« Ответ #16 : 04-12-2008 12:14 » |
|
Нету ни Dec2Polar ни этого злосчастный Hund!
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #17 : 04-12-2008 12:24 » |
|
Электрик-студент, Dec2polar - пользовательская процедура hund - пользовательская переменная.
GetTime - встроенная процедура в турбопаскаль, кажется в модуле Dos
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Электрик-студент
Гость
|
|
« Ответ #18 : 04-12-2008 17:44 » |
|
Мда, ну а в этих то строчках Dec2Polar((S + Hund/100) * 6, Yc - 50, P); Dec2Polar((S + Hund/100) * 6, 5, P2); как всё происходит? Не могу разобраться....
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #19 : 04-12-2008 18:01 » |
|
угол вычисляется как произведение числа секунд (дробного) на 6 (6 градусов угла на одну секунду), Yc-50 - это, как я понимаю, длина стрелки. Так что первый вызов считает точку для конца секундной стрелки, а второй - координаты точки, находящейся под тем же углом, но на расстоянии 5 от центра. Это же очевидно
|
|
|
Записан
|
|
|
|
Электрик-студент
Гость
|
|
« Ответ #20 : 04-12-2008 19:19 » |
|
Вад, для вас это очевидно, для меня не настолько!!! Спасибо что пояснили!!!
|
|
|
Записан
|
|
|
|
|