Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 25.02.2011, 15:44   #1 (permalink)
ИнгаИИ
Новичок
 
Регистрация: 25.02.2011
Сообщений: 1
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Помогите завершить программу на Паскале

Привет!
Помогите завершить программу в паскале.
Вот задание: Написать программу, формирующую на экране изображение перемещающегося объекта. Объект должен перемещаться согласно указанному на рисунке направлению (вперед по стрелке).
По достижении каждой вершины траектории объект должен совершать плавный разворот в направлении движения по следующему участку траектории. Точка вращения объекта выбирается в его геометрическом центре.
Я нарисовала фигуру, сделала траекторию. Фигура ходит по траектории. А вот поворот не умею. Помогите пожалуйста.
Вот моя программа:
Замечание:
Ссылка на файлообменник удалена!

если у кого-то есть программа почти с такими же условиями, вышлите пожалуйста.
Вложения
Тип файла: zip ZADACHA3.ZIP (2.1 Кб, 10 просмотров)
ИнгаИИ вне форума   Ответить с цитированием

Старый 25.02.2011, 15:44
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Советую вам сразу обратить внимание на похожие обсуждения

Помогите доработать программу на Паскале
Помогите составить программу на Паскале
Помогите создать программу на турбо Паскале
Помогите написать программу в Паскале

Старый 25.02.2011, 15:51   #2 (permalink)
Long Cat
Banned
 
Регистрация: 01.09.2009
Сообщений: 4,396
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 2544
По умолчанию

О геометрических преобразованиях можно почитать в замечательном учебнике Немнюгина С. А. "Turbo Pascal"
А формулы поворота произвольной точки на угол alpha вокруг начала координат такие:
Код:
x=x*cos(alpha)-y*sin(alpha)
y=x*sin(alpha)+y*cos(alpha)
Long Cat вне форума   Ответить с цитированием
Старый 26.02.2011, 13:13   #3 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,343
Сказал(а) спасибо: 288
Поблагодарили 507 раз(а) в 165 сообщениях
Репутация: 91953
По умолчанию

Ну вот, сочинил я для Вас некую вспомогательную игру. Вначале Ваш инопланетянин располагается в центре экрана (640х480). Нажатие клавиши "R" (в любом регистре, но с латинской раскладкой ("En")) заставляет его вертеться, клавиши "M" - двигаться туда, куда смотрит "голова". Нажатие любой другой символьной клавиши прерывает программу. Клавиши "M" и "R" можно удерживать. Одновременное их нажатие НЕ ПРЕДУСМОТРЕНО.
Кроме того, мне кажется, у меня массив точек и построение фигуры сделаны более компактно и рационально.
А уж всякие там траектории, стрелки и пр. - это Вы, пожалуйста, самостоятельно.
И еще одно - ВАЖНО! У меня DOS-экран, на котором рисование идет белым по черному. Если у Вас экран белый, а линии черные, то цвета в командах SetColor в процедуре нужно поменять местами.
Код:
Uses
 CRT, Graph;

TYPE
 PCoord=Array[1..19,1..2] of Integer;

CONST
 a0:PCoord=((-25,20),(-25,-20),(25,-20),(25,0),(25,-10),
            (28,-10),(28,-20),(30,-20),(30,-10),(35,-5),
            (35,5),(30,10),(30,20),(28,20),(28,10),
            (25,10),(25,0),(25,20),(-25,20));

VAR
 a1,a2:PCoord;
 X1,Y1,X2,Y2,Angle:WORD;
 Ch:Char;
 Shft:Byte;
 grDriver:integer;
 grMode:integer;
 ErrCode: integer;

Procedure Draw_Fig(X_bef,Y_bef,Fi:Word; a_bef:PCoord; Sh:Byte;
                   var X_aft:WORD; var Y_aft:WORD; var a_aft:PCoord);
var
 i:Byte;
 Fi_rad:Real;

begin
 Fi_rad:=Pi*Fi/180;
 SetColor(Black);
 for i:=1 to 18 do
  Line(X_bef+a_bef[i,1],Y_bef+a_bef[i,2],
                        X_bef+a_bef[i+1,1],Y_bef+a_bef[i+1,2]);
 If Sh<>0 then
  begin
   X_aft:=ROUND(X_bef+Sh*Cos(Fi_Rad));
   Y_aft:=ROUND(Y_bef-Sh*Sin(Fi_Rad));
  end
  else
  begin
   X_aft:=X_bef;
   Y_aft:=Y_bef;
  end;
 for i:=1 to 19 do
  begin
   a_aft[i,1]:=ROUND(a0[i,1]*Cos(Fi_Rad)+a0[i,2]*Sin(Fi_Rad));
   a_aft[i,2]:=ROUND(-a0[i,1]*Sin(Fi_Rad)+a0[i,2]*Cos(Fi_Rad));
  end;
 SetColor(White);
 for i:=1 to 18 do
  Line(X_aft+a_aft[i,1],Y_aft+a_aft[i,2],
                        X_aft+a_aft[i+1,1],Y_aft+a_aft[i+1,2]);
end;

BEGIN
 grDriver:=Detect;
 InitGraph(grDriver, grMode, 'd:\bp\bgi' );
 ErrCode:=Graphresult;
 a1:=a0;
 X1:=320;
 Y1:=240;
 Angle:=0;
 Draw_Fig(X1,Y1,0,a1,0,X2,Y2,a2);
 X1:=X2;
 Y1:=Y2;
 a1:=a2;
 Repeat
  Ch:=ReadKey;
  If (Ch='m') or (Ch='M') then
   Draw_Fig(X1,Y1,Angle,a1,4,X2,Y2,a2);
  If (Ch='r') or (Ch='R') then
   begin
    Angle:=Angle+9;
    Draw_Fig(X1,Y1,Angle,a1,0,X2,Y2,a2)
   end;
  X1:=X2;
  Y1:=Y2;
  a1:=a2;
 Until (Ch<>'m') and (Ch<>'M') and (Ch<>'r') and (Ch<>'R');
 CloseGraph;
END.
Обработку Graphresult я обычно не использую. Хотите - добавьте, тут нет проблем.
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S на форуме   Ответить с цитированием
Старый 27.02.2011, 12:49   #4 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,343
Сказал(а) спасибо: 288
Поблагодарили 507 раз(а) в 165 сообщениях
Репутация: 91953
По умолчанию

Ладно, сочинил я полное решение Вашей задачки. Как и в пердыдущей программе, если у Вас графика типа "черное по белому", то цвета black и white надо поменять местами.
Программа прерывается в любой момент нажатием клавиши "Esc".
Код:
Uses
 CRT, Graph;

TYPE
 PCoord=Array[1..19,1..2] of Integer;

CONST
 a0:PCoord=((-25,20),(-25,-20),(25,-20),(25,0),(25,-10),
            (28,-10),(28,-20),(30,-20),(30,-10),(35,-5),
            (35,5),(30,10),(30,20),(28,20),(28,10),
            (25,10),(25,0),(25,20),(-25,20));

VAR
 a1,a2:PCoord;
 X1,Y1,X2,Y2:WORD;
 Angle:Real;
 grDriver:integer;
 grMode:integer;
 ErrCode: integer;

Procedure Escape;
VAR
  Chr : char;
BEGIN
  IF KeyPressed THEN
    BEGIN
      Chr :=ReadKey;
      if Chr = #27 then  Halt(0);
    END;
END;

Procedure Draw_Arrow;
begin
 SetLineStyle(SolidLn,0,ThickWidth);
 MoveTo(450,290);
 LineTo(550,290);
 LineTo(540,286);
 Line(550,290,540,294);
 SetLineStyle(SolidLn,0,NormWidth);
end;

Procedure Draw_Line;
begin
 SetLineStyle(DottedLn,0,ThickWidth);
 MoveTo(41,240);
 LineTo(599,240);
 LineTo(599,54);
 LineTo(41,426);
 LineTo(320,426);
 LineTo(320,54);
 LineTo(41,240);
 SetLineStyle(SolidLn,0,NormWidth);
end;

Procedure Draw_Fig(X_bef,Y_bef:Word; Fi:Real; a_bef:PCoord; ShX,ShY:ShortInt;
                   var X_aft:WORD; var Y_aft:WORD; var a_aft:PCoord);
var
 i:Byte;
 Fi_rad:Real;

begin
 Fi_rad:=Pi*Fi/180;
 SetColor(Black);
 for i:=1 to 18 do
  Line(X_bef+a_bef[i,1],Y_bef+a_bef[i,2],
                        X_bef+a_bef[i+1,1],Y_bef+a_bef[i+1,2]);
 If (ShX<>0) or (ShY<>0) then
  begin
   X_aft:=X_bef+ShX;
   Y_aft:=Y_bef+ShY;
  end
  else
  begin
   X_aft:=X_bef;
   Y_aft:=Y_bef;
  end;
 for i:=1 to 19 do
  begin
   a_aft[i,1]:=ROUND(a0[i,1]*Cos(Fi_Rad)+a0[i,2]*Sin(Fi_Rad));
   a_aft[i,2]:=ROUND(-a0[i,1]*Sin(Fi_Rad)+a0[i,2]*Cos(Fi_Rad));
  end;
 SetColor(White);
 for i:=1 to 18 do
  Line(X_aft+a_aft[i,1],Y_aft+a_aft[i,2],
                        X_aft+a_aft[i+1,1],Y_aft+a_aft[i+1,2]);
end;

BEGIN
 grDriver:=Detect;
 InitGraph(grDriver, grMode, 'd:\bp\bgi' );
 ErrCode:=Graphresult;
 Draw_Arrow;
 Draw_Line;
 a1:=a0;
 X1:=320;
 Y1:=240;
 Angle:=0;
 Draw_Fig(X1,Y1,0,a1,0,0,X2,Y2,a2);
 X1:=X2;
 Y1:=Y2;
 a1:=a2;
 Repeat
  Draw_Fig(X1,Y1,Angle,a1,3,0,X2,Y2,a2);
  X1:=X2;
  Y1:=Y2;
  a1:=a2;
  Draw_Line;
  Delay(200);
  Escape;
 Until X2=599;
 Repeat
  Angle:=Angle+2;
  Draw_Fig(X1,Y1,Angle,a1,0,0,X2,Y2,a2);
  X1:=X2;
  Y1:=Y2;
  a1:=a2;
  Draw_Line;
  Delay(200);
  Escape;
 Until Angle=90;
 Repeat
  Draw_Fig(X1,Y1,Angle,a1,0,-2,X2,Y2,a2);
  X1:=X2;
  Y1:=Y2;
  a1:=a2;
  Draw_Line;
  Delay(200);
  Escape;
 Until Y2=54;
 Repeat
  Angle:=Angle+2;
  Draw_Fig(X1,Y1,Angle,a1,0,0,X2,Y2,a2);
  X1:=X2;
  Y1:=Y2;
  a1:=a2;
  Draw_Line;
  Delay(200);
  Escape;
 Until Angle>(Pi+Arctan(2/3))*180/Pi;
 Angle:=(Pi+Arctan(2/3))*180/Pi;
 Repeat
  Draw_Fig(X1,Y1,Angle,a1,-3,2,X2,Y2,a2);
  X1:=X2;
  Y1:=Y2;
  a1:=a2;
  Draw_Line;
  Delay(200);
  Escape;
 Until X2=41;
 Repeat
  Angle:=Angle+2;
  Draw_Fig(X1,Y1,Angle,a1,0,0,X2,Y2,a2);
  X1:=X2;
  Y1:=Y2;
  a1:=a2;
  Draw_Line;
  Delay(200);
  Escape;
 Until Angle>360;
 Angle:=0;
 Repeat
  Draw_Fig(X1,Y1,Angle,a1,3,0,X2,Y2,a2);
  X1:=X2;
  Y1:=Y2;
  a1:=a2;
  Draw_Line;
  Delay(200);
  Escape;
 Until X2=320;
 Repeat
  Angle:=Angle+2;
  Draw_Fig(X1,Y1,Angle,a1,0,0,X2,Y2,a2);
  X1:=X2;
  Y1:=Y2;
  a1:=a2;
  Draw_Line;
  Delay(200);
  Escape;
 Until Angle=90;
 Repeat
  Draw_Fig(X1,Y1,Angle,a1,0,-2,X2,Y2,a2);
  X1:=X2;
  Y1:=Y2;
  a1:=a2;
  Draw_Line;
  Delay(200);
  Escape;
 Until Y2=54;
 Repeat
  Angle:=Angle+2;
  Draw_Fig(X1,Y1,Angle,a1,0,0,X2,Y2,a2);
  X1:=X2;
  Y1:=Y2;
  a1:=a2;
  Draw_Line;
  Delay(200);
  Escape;
 Until Angle>(Pi+Arctan(2/3))*180/Pi;
 Angle:=(Pi+Arctan(2/3))*180/Pi;
 Repeat
  Draw_Fig(X1,Y1,Angle,a1,-3,2,X2,Y2,a2);
  X1:=X2;
  Y1:=Y2;
  a1:=a2;
  Draw_Line;
  Delay(200);
  Escape;
 Until X2=41;
 Repeat
  Angle:=Angle+2;
  Draw_Fig(X1,Y1,Angle,a1,0,0,X2,Y2,a2);
  X1:=X2;
  Y1:=Y2;
  a1:=a2;
  Draw_Line;
  Delay(200);
  Escape;
 Until Angle>360;
 Angle:=0;
 Repeat
  Draw_Fig(X1,Y1,Angle,a1,3,0,X2,Y2,a2);
  X1:=X2;
  Y1:=Y2;
  a1:=a2;
  Draw_Line;
  Delay(200);
  Escape;
 Until X2=320;
 ReadKey;
 CloseGraph;
END.
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S на форуме   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 11:56.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.