| 
							Электрик-студент
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 «  : 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 »    | 
								
								 | 
							  
							 
							Вад, для вас это очевидно, для меня не настолько!!! Спасибо что пояснили!!! 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	 |