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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с движение стрелки в коде  (Прочитано 9049 раз)
0 Пользователей и 1 Гость смотрят эту тему.
jonec
Интересующийся

ua
Offline Offline

« : 16-11-2010 18:48 » 

Проблема с движением стрелки по радиусу окружности по заданному времени. Вот код, помогите, в чём проблема там в нём.

Код:
var
  Form1: TForm1;
  x,y:integer;
  ra,x1,y1,x2,y2:integer;
  dsec,sec:real;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var r:trect;
begin

{начало таймера}
Timer1.Enabled:=true;
{пряугольник}
with form1.Canvas do begin
r.Left:=150;
r.Top:=100;
r.Right:=750;
r.Bottom:=500;
Rectangle(r);
Form1.Canvas.Brush.Color:=clwhite;

end;
begin
{кардинаты стрелки}
x1:=450;
y1:=300;
x2:=625;
y2:=300;

dsec:=6*3.1415/360;
sec:=0;
Ra:=125;
//form1.Canvas.Rectangle(x1,y1,x2,y2);
Form1.Canvas.MoveTo(450,300); {начальная координата}
Form1.Canvas.LineTo(625,300); {конечная координата}
x:=0;
end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
x:=x+1;
end;

{///////////////////////////////////////}

Form1.Canvas.MoveTo(450,300); {начальная координата}
Form1.Canvas.LineTo(625,300); {конечная координата}

x1 := round(100+Ra*cos(sec));
y1 := round(100+Ra*sin(sec));


sec:=sec+dsec;

{///////////////////////////////////////}

end;
end.
« Последнее редактирование: 22-11-2010 06:28 от Sel » Записан
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #1 : 17-11-2010 06:53 » 

Delphi у меня нет, но на мой взгляд тут ничего не происходит.. Оно хотя бы компилируется?
Единственное, что тут может меняться - это x1 увеличивается по таймеру до бесконечности.. Точнее, до переполнения.
jonec, давай рассуждать логически - что значит "движение"? Какие действия должен выполнять компьютер при рисовании движения стрелки? Попробуй составить алгоритм сам, а мы поможем.
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
jonec
Интересующийся

ua
Offline Offline

« Ответ #2 : 17-11-2010 18:47 » 

Компилируется и  работает, но просто линия стоит на месте. Линия должно, по иде, двигаться по окружности с радиусом в 125градусов... Но она по таймеру не двигается.
« Последнее редактирование: 22-11-2010 06:35 от Sel » Записан
Dale
Блюзмен
Команда клуба

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

WWW
« Ответ #3 : 17-11-2010 21:10 » 

линия должно по идей двигаться по окружности,с радиусом в 125градусов...но она по таймеру не двигаться.

Если не секрет, в каком учебном заведении выдали это задание?
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #4 : 18-11-2010 07:08 » 

jonec, еще раз намекну - по таймеру нужно рисовать стрелку. У тебя же просто пересчитывается координата, да и то неправиьно.
А вообще - составь алгоритм.
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
jonec
Интересующийся

ua
Offline Offline

« Ответ #5 : 18-11-2010 17:37 » new

Код:
var
  Form1: TForm1;
  x,y:integer;

implementation

uses DateUtils;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
 Var R: TRect; Sec, tmp: Word;
begin
Form1.Canvas.Brush.Color:=clWhite;
Timer1.Interval:=100;
Form1.DoubleBuffered:=True;

Timer1.Enabled:=true;

Begin
With Form1.Canvas Do

      Begin
      DecodeDateTime(Now, tmp, tmp, tmp, tmp, tmp, Sec, tmp);
      Form1.Caption:=IntToStr(Sec);
      //Rectangle(150, 100, 750, 500);
      Ellipse(250, 100, 650, 500);
      MoveTo(450, 300);
      LineTo(Round(450-200*Cos((Sec*5+90)/180*Pi)), Round(300-200*Sin((Sec*5+90)/180*Pi)));
      Ellipse(443, 293, 457, 307);
      End;

end;
end;






procedure TForm1.Timer1Timer(Sender: TObject);
begin

Repaint;

Вот, я нашел, как лучше сделать.
« Последнее редактирование: 22-11-2010 06:35 от Sel » Записан
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #6 : 19-11-2010 08:21 » 

Мда.... Ну если говоришь, что работает...
jonec, в цикле хотя бы задержку на 0.5 секунды поставь... А то тормозит все, наверное? Ага
А если тебя интересует "правильное" программирование, то ошибки вижу в следующем:
* Рисовать в FormCreate, да еще и в цикле - не очень правильно. В этой процедуре ты должен задать начальные положения стрелки. Рисовать же нужно в таймере, например.
* У тебя таймер вообще зачем нужен, если ты все рисуешь в FormCreate?
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines