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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.04.2011, 14:50   #21
detalik
Форумчанин
 
Регистрация: 05.04.2011
Сообщений: 115
По умолчанию

Цитата:
и по достижении границы делаем
dR:=-dR;
По этому поводу мне самое главное не понятно, как указать-то эту границу? И dR это переменная?
detalik вне форума Ответить с цитированием
Старый 19.04.2011, 14:54   #22
detalik
Форумчанин
 
Регистрация: 05.04.2011
Сообщений: 115
По умолчанию

И кроме того, дуга не просто меняет направление, она должна отразиться, т.е повернуться выпуклой стороной в др.сторону...
detalik вне форума Ответить с цитированием
Старый 19.04.2011, 14:56   #23
OlegVE
Форумчанин
 
Регистрация: 27.09.2010
Сообщений: 376
По умолчанию

Цитата:
Сообщение от detalik Посмотреть сообщение
Дело не в том, что не понравилось, задание так построено, т.е. дуга должна начинать движение сразу после запуска приложения...а не после нажатия кнопки, спасибо большое за совет!!!!
Главный вопрос в другом рисовать или не рисовать. При необходимости, по простому, очистить и перерисовать только Image1 или скопировать в переменные типа TBitmap все фазы (их думается немного) Ваших "преВРАЩЕНИЙ".

Последний раз редактировалось OlegVE; 19.04.2011 в 15:04.
OlegVE вне форума Ответить с цитированием
Старый 19.04.2011, 15:02   #24
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

detalik, ну что ж Вы так мучаетесь то? Задача то совсем несложная!!
Выложите исходники проекта!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.04.2011, 15:04   #25
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Цитата:
Если я уберу цикл, как в программе задать, чтобы дуга дошла до правого края и форма, а затем отразилась и до левого, как прописать эти условия?
точно также
.// while i<XM do begin

if i>=XM // lдошли до правого края
then // меняем направление
dr:= - dr; // dr:= -4;
if i<=0 //дошли до левого края
then // опять меняем направление
dr:= - dr; // dr:= +4;

R;=R +dR;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 19.04.2011, 15:22   #26
detalik
Форумчанин
 
Регистрация: 05.04.2011
Сообщений: 115
По умолчанию

Вот исходник программы в последнем варианте с учетом всех ваших замечаний, насколько я их понял, буду очень благодарен за помощь, потму как я уже сам себя окончательно запутал. Напомню суть задачи "Полукруг с дугой справа, находящийся в центре формы, начинает движение вправо и, отразившись от правого края формы, движется в обратном направлении. За-тем таким же образом отражается от левого края формы и т.д."
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
XM,YM,XX,YY,X1,Y1,kx,c,i,b,a,R:integer;

  Form1: TForm1;

const
hx=2;hy=2;

implementation

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


procedure TForm1.Timer1Timer(Sender: TObject);
begin
   XM:=Form1.Width;
   YM:=Form1.Height;
    i:=trunc(XM/2);
     while i<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:=Form1.Color;
     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+4;
     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));
     i:=trunc(XM/2)+b+R;
      end;
      //if   c>0 then begin
      Form1.Canvas.Pen.Color:=Form1.Color;
      Form1.Canvas.Arc(trunc(XM)-trunc(b/2),trunc(YM/2)-trunc(a/2),trunc(XM)+trunc(b/2),trunc(YM/2)+trunc(a/2),trunc(XM),trunc(YM/2)-trunc(a/2),trunc(XM),trunc(YM/2)+trunc(a/2));
      Form1.Canvas.Pen.Color:=Form1.Color;
      Form1.Canvas.Arc(trunc(XM)-trunc(b/2)-R,trunc(YM/2)-trunc(a/2),trunc(XM)+trunc(b/2)-R,trunc(YM/2)+trunc(a/2),trunc(XM)-R,trunc(YM/2)-trunc(a/2),trunc(XM)-R,trunc(YM/2)+trunc(a/2));
      R:=R+4;
      Form1.Canvas.Pen.Color:=ClBlue;
      Form1.Canvas.Arc(trunc(XM)-trunc(b/2)-R,trunc(YM/2)-trunc(a/2),trunc(XM)+trunc(b/2)-R,trunc(YM/2)+trunc(a/2),trunc(XM)-R,trunc(YM/2)-trunc(a/2),trunc(XM)-R,trunc(YM/2)+trunc(a/2));
       c:=trunc(XM)-trunc(a/2)-R;
     //X:=XX+kx*hx; YY:=YY+ky*hy;
//end;

end;

end.

end.
Огромное спасибо.
Oleg_VE, ваш совет, кстати, оч. хорош, но я уже настолько долго с этим мучился, что хочется просто разобраться до конца. Спасибо.
detalik вне форума Ответить с цитированием
Старый 19.04.2011, 16:27   #27
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Код:
   XM:=Form1.Width;
   YM:=Form1.Height;
//    i:=trunc(XM/2);
//     while i<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:=Form1.Color;
     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 +dr;
// проверяем слева и справа 
if trunc(XM/2)+b+R>XM then begin // проверяем условие МЫ(дуга) справа 
  dr:= -dr; //dr:=-4; // и меняем направление
//  R:=R + dr; если хотим восстанавливаем старое положение
end;
if trunc(XM/2)+b+R<0 then begin // проверяем условие дуга слева 
  dr:= -dr; //dr:=4; // и меняем направление
//  R:=R + dr; если хотим восстанавливаем старое положение
end;
// а теперь условия выполнены новые координаты посчитаны и рисуем
     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));
//     i:=trunc(XM/2)+b+R;
//      end;
программа — запись алгоритма на языке понятном транслятору

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

....не работает, дуга при первом запуске улетает за края формы и больше не возвращается.....Сделал все точно как у вас написано....
detalik вне форума Ответить с цитированием
Старый 20.04.2011, 08:40   #29
detalik
Форумчанин
 
Регистрация: 05.04.2011
Сообщений: 115
По умолчанию

Помогите, пожалуйста,написать траекторию для движения этой дуги, уже третий день бьюсь....
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
   XM:=Form1.Width;
   YM:=Form1.Height;
    //i:=trunc(XM/2)+b;

     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:=Form1.Color;
     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+dr;
     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));
     i:=i+R;

     if trunc(XM/2)+b+R>XM then begin
    

     dr:=-dr;
Сделал,как советовал Evg_m, дуга отражается от правого края формы, уходит за левый край и не возвращается....а нужно ,чтобы она отразилась от левого и т.д, и причем кода отражается соответственно от правого и от левого края формы, дуга обращалась выпуклой стороной в др сторону. Спасибо.
detalik вне форума Ответить с цитированием
Старый 20.04.2011, 11:59   #30
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

это проверка СПРАВА
Цитата:
if trunc(XM/2)+b+R>XM then begin
dr:=-dr;
а где проверка СЛЕВА?
читайте предыдущие сообщения.
Цитата:
дуга обращалась выпуклой стороной в др сторону
Добавьте еще одну переменную (дуга вверх/вниз) меняйте ее(переменную) и рисуйте в соответствии с ней.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 20.04.2011 в 12:02.
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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