|
Главная | Правила | Регистрация | Дневники | Справка | Пользователи | Календарь | Поиск | Сообщения за день | Все разделы прочитаны |
|
Опции темы | Опции просмотра |
25.02.2011, 15:44 | #1 (permalink) | ||
Новичок
Регистрация: 25.02.2011
Сообщений: 1
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Помогите завершить программу на Паскале
Помогите завершить программу в паскале. Вот задание: Написать программу, формирующую на экране изображение перемещающегося объекта. Объект должен перемещаться согласно указанному на рисунке направлению (вперед по стрелке). По достижении каждой вершины траектории объект должен совершать плавный разворот в направлении движения по следующему участку траектории. Точка вращения объекта выбирается в его геометрическом центре. Я нарисовала фигуру, сделала траекторию. Фигура ходит по траектории. А вот поворот не умею. Помогите пожалуйста. Вот моя программа:
если у кого-то есть программа почти с такими же условиями, вышлите пожалуйста. |
||
25.02.2011, 15:44 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Советую вам сразу обратить внимание на похожие обсуждения Помогите доработать программу на Паскале Помогите составить программу на Паскале Помогите создать программу на турбо Паскале Помогите написать программу в Паскале |
25.02.2011, 15:51 | #2 (permalink) |
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) |
26.02.2011, 13:13 | #3 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Ну вот, сочинил я для Вас некую вспомогательную игру. Вначале Ваш инопланетянин располагается в центре экрана (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. |
27.02.2011, 12:49 | #4 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Ладно, сочинил я полное решение Вашей задачки. Как и в пердыдущей программе, если у Вас графика типа "черное по белому", то цвета 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. |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
Опции темы | |
Опции просмотра | |
|
|