Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.04.2011, 08:24   #1
detalik
Форумчанин
 
Регистрация: 05.04.2011
Сообщений: 115
По умолчанию Движение полукруга горизонтально по форме - отражение от краёв. Графика Delphi7

Здравствуйте, у меня есть вот такая вот задачка
Цитата:
Полукруг с дугой справа, находящийся в центре формы, начинает движение вправо и, отразившись от правого края формы, движется в обратном направлении. За-тем таким же образом отражается от левого края формы и т.д.
Я попробовал реализовать следующим образом: разместил на форме таймер и для OnTimer OnPaint написал процедуры
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
X1:=10; Y1:=10;
kx:=1;ky:=1; b:=40; a:=40;
  end;
procedure TForm1.FormPaint(Sender: TObject);
begin
   Canvas.Font.Color:=ClBlack;
   Canvas.Arc(X1,Y1,X1+b,Y1+a,X1+trunc(b/2),Y1+a,X1+trunc(b/2),Y1);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
   XM:=Form1.Width;
   YM:=Form1.Height;

   if (X1>=0) and (Y1>=0) and (X1+R<=XM) and (Y1+R<=YM)
   then 
     begin
     Form1.Canvas.Pen.Color:=Form1.Color;
     Form1.Canvas.Arc(X1+R,Y1,X1+b+R,Y1+a,X1+trunc(b/2)+R,Y1+a,X1+trunc(b/2)+R,Y1);
     Form1.Canvas.Pen.Color:=ClBlue;
     Form1.Canvas.Arc(X1+R,Y1,X1+b+R,Y1+a,X1+trunc(b/2)+R,Y1+a,X1+trunc(b/2)+R,Y1);
К сожалению, движения полукруга не получилось- если запустить приложение, то один раз полукруг прорисовывается, причем не знаю как стереть предыдущее изображ. полукруга, чтобы казалось будто он движется. Да и как сделать, чтобы полукруг размещался в центре? (через относительные координаты)? Огромное спасибо за помощь.
detalik вне форума Ответить с цитированием
Старый 19.04.2011, 08:39   #2
detalik
Форумчанин
 
Регистрация: 05.04.2011
Сообщений: 115
По умолчанию

Процедуру OnPaint для Form1 убрал вообще...OnTimer подкорректировал следующим образом
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
   XM:=Form1.Width;
   YM:=Form1.Height;

   if (X1>=0) and (Y1>=0) and (X1+R<=XM) and (Y1+R<=YM)
   then
     begin
     Form1.Canvas.Pen.Color:=Form1.Color;
     Form1.Canvas.Arc(trunc(XM/2)+R,trunc(YM/2),trunc(XM/2)+b+R,trunc(YM/2)+a,trunc(XM/2)+trunc(b/2)+R,trunc(YM/2)+a,trunc(XM/2)+trunc(b/2)+R,trunc(YM/2));
     Form1.Canvas.Pen.Color:=ClBlue;
     Form1.Canvas.Arc(trunc(XM/2)+R,trunc(YM/2),trunc(XM/2)+b+R,trunc(YM/2)+a,trunc(XM/2)+trunc(b/2)+R,trunc(YM/2)+a,trunc(XM/2)+trunc(b/2)+R,trunc(YM/2));
Пытался сделать, чтобы дуга была в центре формы, но все равно,что-то она не очень то по центру и двигаться не хочет....Помогите, пожалуйста.
detalik вне форума Ответить с цитированием
Старый 19.04.2011, 08:51   #3
detalik
Форумчанин
 
Регистрация: 05.04.2011
Сообщений: 115
По умолчанию

Код:
 begin
     Form1.Canvas.Pen.Color:=Form1.Color;
     Form1.Canvas.Arc(trunc(XM/2),trunc(YM/2)-trunc(a/2),trunc(XM/2)+b,trunc(YM/2)+trunc(a/2),trunc(XM/2)+trunc(b/2),trunc(YM/2)+trunc(a/2),trunc(XM/2)+trunc(b/2),trunc(YM/2)-trunc(a/2));
     Form1.Canvas.Pen.Color:=ClBlue;
     Form1.Canvas.Arc(trunc(XM/2),trunc(YM/2)-trunc(a/2),trunc(XM/2)+b,trunc(YM/2)+trunc(a/2),trunc(XM/2)+trunc(b/2),trunc(YM/2)+trunc(a/2),trunc(XM/2)+trunc(b/2),trunc(YM/2)-trunc(a/2))
В центре вроде сделал, только как теперь заставить ее двигаться? И от края до края, как это задать условие проверки, что типа это край формы? Спасибо.
detalik вне форума Ответить с цитированием
Старый 19.04.2011, 08:57   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
и двигаться не хочет....
движение - это изменение координат во времени.
чтобы двигалась необходимо чтобы координаты МЕНЯЛИСЬ.
Form1.Canvas.Pen.Color:=ClBlue;
Form1.Canvas.Arc(trunc(XM/2)+R,trunc(YM/2),trunc(XM/2)+b+R,trunc(YM/2)+a,trunc(XM/2)+trunc(b/2)+R,trunc(YM/2)+a,trunc(XM/2)+trunc(b/2)+R,trunc(YM/2));

Цитата:
что-то она не очень то по центру
TCanvas.Arc Delpi Example
procedure TForm1.FormPaint(Sender: TObject);
var
R: TRect;
begin
R := GetClientRect; {Gets the boundaries of the current window}
Canvas.Arc(R.Left, R.Top, R.Right, R.Bottom, R.Right, R.Top, R.Left, R.Top);
e

Form1.Canvas.Arc(trunc(XM/2)+R,trunc(YM/2),trunc(XM/2)+b+R,trunc(YM/2)+a,trunc(XM/2)+trunc(b/2)+R,trunc(YM/2)+a,trunc(XM/2)+trunc(b/2)+R,trunc(YM/2));
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 19.04.2011 в 09:00.
evg_m вне форума Ответить с цитированием
Старый 19.04.2011, 09:14   #5
detalik
Форумчанин
 
Регистрация: 05.04.2011
Сообщений: 115
По умолчанию

Что такое движение в Delphi я понимаю, про центр написал -все уже по центру, для того чтобы двигалось попробовал добавить к
Код:
Form1.Canvas.Pen.Color:=Form1.Color;
     Form1.Canvas.Arc(trunc(XM/2),trunc(YM/2)-trunc(a/2),trunc(XM/2)+b,trunc(YM/2)+trunc(a/2),trunc(XM/2)+trunc(b/2),trunc(YM/2)+trunc(a/2),trunc(XM/2)+trunc(b/2),trunc(YM/2)-trunc(a/2));
     Form1.Canvas.Pen.Color:=ClBlue;
     Form1.Canvas.Arc(trunc(XM/2)+R,trunc(YM/2)-trunc(a/2),trunc(XM/2)+b+R,trunc(YM/2)+trunc(a/2),trunc(XM/2)+trunc(b/2)+R,trunc(YM/2)+trunc(a/2),trunc(XM/2)+trunc(b/2)+R,trunc(YM/2)-trunc(a/2))
Код:
R:=R+hx;
, где hx и R-константа, a и b константы(стороны прямоугольника ,в кот вписана дуга) Выдает ошибку left side cannot be asigned to.

Последний раз редактировалось detalik; 19.04.2011 в 09:17.
detalik вне форума Ответить с цитированием
Старый 19.04.2011, 09:57   #6
detalik
Форумчанин
 
Регистрация: 05.04.2011
Сообщений: 115
По умолчанию

Код:
 begin
     Form1.Canvas.Pen.Color:=Form1.Color;
     Form1.Canvas.Arc(trunc(XM/2),trunc(YM/2)-trunc(a/2),trunc(XM/2)+b,trunc(YM/2)+trunc(a/2),trunc(XM/2)+trunc(b/2),trunc(YM/2)+trunc(a/2),trunc(XM/2)+trunc(b/2),trunc(YM/2)-trunc(a/2));
     Form1.Canvas.Pen.Color:=ClBlue;
     Form1.Canvas.Arc(trunc(XM/2)+R,trunc(YM/2)-trunc(a/2),trunc(XM/2)+b+R,trunc(YM/2)+trunc(a/2),trunc(XM/2)+trunc(b/2)+R,trunc(YM/2)+trunc(a/2),trunc(XM/2)+trunc(b/2)+R,trunc(YM/2)-trunc(a/2));
     R:=R+2;
Как загнать это в цикл?
detalik вне форума Ответить с цитированием
Старый 19.04.2011, 10:06   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

константа = НЕИЗМЕНЯЕМОЕ значение.

Цитата:
R:=R+hx;
, где hx и R-константа,
Каким образом вы хотите изменить значение константы.
Цитата:
Выдает ошибку left side cannot be asigned to.
Цитата:
Как загнать это в цикл?
зачем это загонять в цикл.
Таймер и так будет срабатывать КАЖДЫЕ N мс. Это уже ГОТОВЫЙ цикл.
Надо ХРАНИТЬ данные о положении ВНЕ процедуры OnTimer (поле класса. глобальная переменная, и т.п.). чтобы ими можно было пользоваться ( и менять) при КАЖДОМ вызове.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 19.04.2011, 10:08   #8
detalik
Форумчанин
 
Регистрация: 05.04.2011
Сообщений: 115
По умолчанию

Не подскажите как это сделать? Просто я попробовал вот так
Код:
var
XM,YM,XX,YY,X1,Y1,kx,ky,i,b,a,R:integer;

  Form1: TForm1;



implementation

{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
X1:=10; Y1:=10;
b:=40; a:=40;R:=4;
  end;


procedure TForm1.Timer1Timer(Sender: TObject);
begin
   XM:=Form1.Width;
   YM:=Form1.Height;

      while (XM/2)+b+R<=XM do begin
     Form1.Canvas.Pen.Color:=Form1.Color;
     Form1.Canvas.Arc(trunc(XM/2),trunc(YM/2)-trunc(a/2),trunc(XM/2)+b,trunc(YM/2)+trunc(a/2),trunc(XM/2)+trunc(b/2),trunc(YM/2)+trunc(a/2),trunc(XM/2)+trunc(b/2),trunc(YM/2)-trunc(a/2));
     Form1.Canvas.Pen.Color:=ClBlue;
     Form1.Canvas.Arc(trunc(XM/2)+R,trunc(YM/2)-trunc(a/2),trunc(XM/2)+b+R,trunc(YM/2)+trunc(a/2),trunc(XM/2)+trunc(b/2)+R,trunc(YM/2)+trunc(a/2),trunc(XM/2)+trunc(b/2)+R,trunc(YM/2)-trunc(a/2));
     R:=R+2;
     end;
Остается "след" от движения.....
detalik вне форума Ответить с цитированием
Старый 19.04.2011, 10:14   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

НАДО
стереть старое (предыдущее)
изменить координаты
нарисовать новое.
У ВАС
стереть начальное
нарисовать старое
изменить координаты
И еще раз таимер это УЖЕ цикл
Цитата:
while (XM/2)+b+R<=XM do begin
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 19.04.2011, 10:33   #10
detalik
Форумчанин
 
Регистрация: 05.04.2011
Сообщений: 115
По умолчанию

Как таймеру объяснить что это надо делать пока
Цитата:
while (XM/2)+b+R<=XM do begin
, и как стереть старое( у меня рисуется не старое, а новое, т.к. +R, где R переменная для увеличения коордиаты по гориз-ли)
Код:
 Form1.Canvas.Arc(trunc(XM/2),trunc(YM/2).....
старое
Код:
 Form1.Canvas.Arc(trunc(XM/2),trunc(YM/2)+R
новое , спасибо!

Последний раз редактировалось detalik; 19.04.2011 в 10:36.
detalik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
отражение в форме, всех данных из подчиненной таблицы stbo Microsoft Office Access 1 17.01.2011 15:58
Delphi7 Как осуществить движение объекта? -ushёl- Компоненты Delphi 3 10.05.2010 22:01
Движение полукруга malir Помощь студентам 0 14.12.2009 17:50
Движение по эллипсу в delphi7 GaLiof Помощь студентам 16 15.11.2009 14:06