Помощь - Поиск - Пользователи - Календарь
Полная версия: Круговое движение прямой
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Jaxx
Значит так. Нужно сделать какое-то подобие "радара". Есть окружность, в которой вписана прямая линия. Линия начинается в центре круга. Она должна перемещаться наподобие стрелки часов против часовой стрелки, только не слишком быстро. Окружность со стрелкой я сделал, а вот с движением линии проблемы.
Код

uses crt,graph;
var
 graphmode,graphdriver,errorcode:integer;
 x,y,i:integer;
begin
 graphdriver:=detect;
 initgraph(graphdriver,graphmode,'egavga.bgi');
 errorcode:=graphresult;
 if errorcode<>grok then
 begin
 clrscr;
   writeln('Graphics error: ',grapherrormsg(errorcode));
   writeln('Program aborted...');
   halt(1); end;
   setcolor(green);
   circle(320,240,220);
   setcolor(lightgreen);
   circle(320,240,218);
   circle(320,240,2);
   setcolor(lightgreen);
   setlinestyle(dottedln,0,normwidth);
   line(320,238,320,22);
   readln;
end.
Shura
Если, скажем, точка движется по окружности радиуса "r" и центром с координатами "x0" и "y0", то координаты этой точки:
Код

x = x0 + r*cos(t);
y = y0 + r*sin(t)

Где "t" - угол поворота точки в радинанах по часовой стрелке (считая от самой правой точки окружности).

Вот код:

Uses
 Crt, Graph;
Const
 r = 215;
Var
 gd, gm: Integer;
 t: Real;
Begin
 InitGraph(gd,gm,'');
  t:=0;
 repeat
   SetColor(15);
  Circle(320,240,220);
   SetColor(2);
  Line(320, 240, Round(320+r*cos(t)), Round(240+r*sin(t)));
   Delay(5000);
   SetColor(0);
  Line(320, 240, Round(320+r*cos(t)), Round(240+r*sin(t)));
   t:=t-0.01
 until KeyPressed;
 CloseGraph
End.

volvo
Jaxx, вот, выдрал кусок из своей старой игрушки (правда там вращение ПО часовой стрелке, но изменяется элементарно):
uses graph, crt;

procedure InitGraphix;
var gdriver, gmode, errorcode: integer;
begin
  gdriver := DETECT;
  initgraph( gdriver, gmode, '' );
  errorcode := graphresult;
  if errorcode <> grOk then begin
    writeln('Graphics error: ' + grapherrormsg(errorcode));
    readln; halt(100);
  end;
end;

procedure CloseGraphix;
begin
  closegraph;
end;

const
  RadToDegrees = 180 / Pi;
const
  numRadars: integer = 0;

type
  radar_circle = record
    CenterX, CenterY,
    RadarRadius,
    CurrentAngle,
    CurrentRadius: integer;
  end;

const
  MaxRadars = 10;
var
  RadarInfo: array[ 0 .. pred(MaxRadars) ] of radar_circle;

function GetXCoords(rHandler: integer): integer;
begin
  with RadarInfo[rHandler] do
    GetXCoords := CenterX + Trunc(RadarRadius *
                  sin(CurrentAngle / RadToDegrees));
end;
function GetYCoords(rHandler: integer): integer;
begin
  with RadarInfo[rHandler] do
    GetYCoords := CenterY - Trunc(RadarRadius *
                  cos(CurrentAngle / RadToDegrees));
end;

function DrawCircleRadar(CentX, CentY, Radius: integer): integer;
begin
  if NumRadars = MaxRadars then DrawCircleRadar := -1;

  setcolor(white);
  circle(CentX, CentY, Radius);
  setfillstyle(solidfill, green);
  floodfill(CentX, CentY, white);
  with RadarInfo[NumRadars] do begin
    CenterX := CentX;
    CenterY := CentY;
    RadarRadius := Radius;
    CurrentAngle := 0;
    CurrentRadius := 1;

    setwritemode(XORput);
    line(CenterX, CenterY,
         GetXCoords(NumRadars), GetYCoords(NumRadars));
    setwritemode(COPYput);
  end;
  DrawCircleRadar := NumRadars;
  inc(NumRadars);
end;

procedure RevolveRadar(rHandler, revStep: integer);
begin
  delay(2500);
  with RadarInfo[RHandler] do begin
    setwritemode(XORput);
    line( CenterX, CenterY,
          GetXCoords(rHandler), GetYCoords(rHandler));
    inc(CurrentAngle, revStep);
    if CurrentAngle > 359 then
      dec(CurrentAngle, 360);
    line(CenterX, CenterY,
         GetXCoords(rHandler), GetYCoords(rHandler));
    setwritemode(COPYput);
  end;
end;

var
  FirstRadar: Integer;
begin
  InitGraphix;
  FirstRadar := DrawCircleRadar(100, 400, 75);

  While not KeyPressed do
    RevolveRadar(FirstRadar, 3);

  While KeyPressed Do ReadKey;
  CloseGraphix;
end.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.