Специалист
Регистрация: 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.
|