Показать сообщение отдельно
Старый 27.02.2011, 12:49   #4 (permalink)
Vladimir_S
Специалист
 
Регистрация: 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.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

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