Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Паскаль. Помогите пожалуйста разобраться с процедурой!!! Срочно!!!  (Прочитано 18507 раз)
0 Пользователей и 5 Гостей смотрят эту тему.
Электрик-студент
Гость
« : 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??? Мы их только объявляем, но значения не присваиваем
Сама программа, это идущие стрелочные часы показывающие системное время!
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 03-12-2008 07:22 » 

Вообще, судя по коду, оно, вопреки названию, переводит наоборот - полярные в декартовы Улыбаюсь Принимает угол (в радианах) и расстояние от центра, а возвращает точку в декартовых координатах. Что в контексте отрисовки часов имеет смысл: угол поворота, видимо, перед этим вычисляется исходя из текущего времени, и по этому углу и длине вычисляется точка, в которой находится конец стрелки.
« Последнее редактирование: 03-12-2008 07:26 от Вад » Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #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
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 04-12-2008 07:23 » 

round - как бы округляет полученный результат
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #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 » 

Вад
Команда клуба, спасибо!!!
Я так определил: Нужно очищать изображение перед каждой новой отрисовкой. Самый простой способ очистить - закрасить его весь цветом фона.
А со стрелками просто невнимателность
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 04-12-2008 08:51 » 

Электрик-студент, всё правильно сделал ) А не мигает картинка ? Можно ещё сделать битмап часов без стрелки (нарисовать вначале и помнить) - ляпать сначала его, потом рисовать стрелки. Тогда мигать точно не будет
Записан

Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 04-12-2008 08:57 » 

Алексей1153++, +1 Улыбаюсь

Электрик-студент, я так понимаю, что Circle в твоём случае рисует маленькие круги по периметру циферблата - делает насечку делений. Зачем-то делается 24 деления, и чётные рисуются жирнее - я так понимаю, они должны соответствовать часовым отметкам. Поэтому вопрос к тебе - GetTime возвращает часы в 12-часовом интервале или в 24-часовом? На циферблат традиционно выводят в 12-часовом Улыбаюсь
Записан
Электрик-студент
Гость
« Ответ #10 : 04-12-2008 09:18 » 

Делений как таковых нет! Есть действительно круги на месте делений, которые побольше в диаметре, те означают часы, а между ними маленькие, т.е. получается так, большой круг(12)-маленький-большой(1)-маленький и т.д.
Вроде в 12-часовом
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 04-12-2008 09:25 » 

Электрик-студент, странно, всю жизнь считал что в 24 часовом формате
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
PooH
Глобальный модератор

ru
Offline 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
Глобальный модератор

ru
Offline 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
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #15 : 04-12-2008 11:12 » 

Электрик-студент, ну как это нет нигде информации?
неужели в help'е нету? Не верю!
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Электрик-студент
Гость
« Ответ #16 : 04-12-2008 12:14 » 

Нету ни Dec2Polar ни этого злосчастный Hund!
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #17 : 04-12-2008 12:24 » new

Электрик-студент, 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); как всё происходит? Не могу разобраться....
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #19 : 04-12-2008 18:01 » 

угол вычисляется как произведение числа секунд (дробного) на 6 (6 градусов угла на одну секунду), Yc-50 - это, как я понимаю, длина стрелки.
Так что первый вызов считает точку для конца секундной стрелки, а второй - координаты точки, находящейся под тем же углом, но на расстоянии 5 от центра. Это же очевидно Улыбаюсь
Записан
Электрик-студент
Гость
« Ответ #20 : 04-12-2008 19:19 » 

Вад, для вас это очевидно, для меня не настолько!!! Спасибо что пояснили!!!
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines