Помощь - Поиск - Пользователи - Календарь
Полная версия: Поворот линии
Форум «Всё о Паскале» > Pascal, Object Pascal > Написание игр
pashist
Всем привет. Есть линия от A до B.
A _______________ B
Как заставить её поворачиваться вокруг центра А, чтобы при этом длина линии не изменялась, с помощью клавиш курсора? Для простоты понятия: допустим, что А-это центр окружности, AB-ее радиус. Мне нужно, чтобы линия AB описывала эту окружность.
klem4
Маятник
Движение по окружности

В общем поиск ;)

Уравнение кружности

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

r - радиус
a - угол
0 - 360 градусов
pashist
Мужики, выручайте! Не до конца понимаю, как написать программу правильно. Нужно крутить вокруг центра окружности линию с помощью курсора.
Вот код
Uses Graph,Crt;
Const
     Left=#75; Right=#77; Up=#72; Down=#80;
Var GD,GM: Integer;
Function Quoter(x,y: Integer): Integer;
Begin
     If x<320 Then
        If y<240 Then Quoter:=1
           Else If y>240 Then Quoter:=3
                Else Quoter:=-1
        Else If y<240 Then Quoter:=2
             Else If y>240 Then Quoter:=4
                  Else Quoter:=-3;
        If x=320 Then If y<240 Then Quoter:=-2 Else Quoter:=-4;
End;
Procedure DrawHunter;
Var x0,y0,x1,y1,r:Integer; c: Char; t: Real;
Begin
     x0:=320; y0:=240;
     x1:=520; y1:=240;
     r:=200; t:=0;
     Circle(x0,y0,200);
     Repeat
           c:=ReadKey;
           If c=#0 Then c:=ReadKey;
           Case c Of
                #27:;
                Up: Begin
                         SetColor(0);
                         Line(x0,y0,x1,y1);
                         Case Quoter(x1,y1) Of
                              1: Begin x1:=Round(x0+r*Cos(t)); y1:=Round(y0+r*Sin(t)); End;
                              2: Begin x1:=Round(x0-r*Cos(t)); y1:=Round(y0-r*Sin(t)); End;
                              3: Begin x1:=Round(x0-r*Cos(t)); y1:=Round(y0-r*Sin(t)); End;
                              4: Begin x1:=Round(x0+r*Cos(t)); y1:=Round(y0-r*Sin(t)); End;
                              -1:Begin x1:=Round(x0+r*Cos(t)); y1:=Round(y0-r*Sin(t)); End;
                              -2:;
                              -3:Begin x1:=Round(x0-r*Cos(t)); y1:=Round(y0-r*Sin(t)); End;
                              -4:Begin x1:=Round(x0+r*Cos(t)); y1:=Round(y0-r*Sin(t)); End;
                         End;
                         t:=t-0.01;
                         End;
                Down: Begin
                         SetColor(0);
                         Line(x0,y0,x1,y1);
                         Case Quoter(x1,y1) Of
                              1: Begin x1:=Round(x0-r*Cos(t)); y1:=Round(y0+r*Sin(t)); End;
                              2: Begin x1:=Round(x0+r*Cos(t)); y1:=Round(y0+r*Sin(t)); End;
                              3: Begin x1:=Round(x0+r*Cos(t)); y1:=Round(y0+r*Sin(t)); End;
                              4: Begin x1:=Round(x0-r*Cos(t)); y1:=Round(y0+r*Sin(t)); End;
                              -1:Begin x1:=Round(x0+r*Cos(t)); y1:=Round(y0+r*Sin(t)); End;
                              -2:Begin x1:=Round(x0+r*Cos(t)); y1:=Round(y0+r*Sin(t)); End;
                              -3:Begin x1:=Round(x0-r*Cos(t)); y1:=Round(y0+r*Sin(t)); End;
                              -4:;
                         End;
                         t:=t-0.01
                    End;
                Left: Begin
                         SetColor(0);
                         Line(x0,y0,x1,y1);
                         Case Quoter(x1,y1) Of
                              1: Begin x1:=Round(x0-r*Cos(t)); y1:=Round(y0+r*Sin(t)); End;
                              2: Begin x1:=Round(x0-r*Cos(t)); y1:=Round(y0-r*Sin(t)); End;
                              3: Begin x1:=Round(x0-r*Cos(t)); y1:=Round(y0-r*Sin(t)); End;
                              4: Begin x1:=Round(x0-r*Cos(t)); y1:=Round(y0+r*Sin(t)); End;
                              -1:;
                              -2:Begin x1:=Round(x0-r*Cos(t)); y1:=Round(y0+r*Sin(t)); End;
                              -3:Begin x1:=Round(x0-r*Cos(t)); y1:=Round(y0+r*Sin(t)); End;
                              -4:Begin x1:=Round(x0-r*Cos(t)); y1:=Round(y0-r*Sin(t)); End;
                         End;
                         t:=t-0.01
                    End;
                Right: Begin
                         SetColor(0);
                         Line(x0,y0,x1,y1);
                         Case Quoter(x1,y1) Of
                              1: Begin x1:=Round(x0+r*Cos(t)); y1:=Round(y0-r*Sin(t)); End;
                              2: Begin x1:=Round(x0+r*Cos(t)); y1:=Round(y0+r*Sin(t)); End;
                              3: Begin x1:=Round(x0+r*Cos(t)); y1:=Round(y0+r*Sin(t)); End;
                              4: Begin x1:=Round(x0-r*Cos(t)); y1:=Round(y0+r*Sin(t)); End;
                              -1:Begin x1:=Round(x0+r*Cos(t)); y1:=Round(y0-r*Sin(t)); End;
                              -2:Begin x1:=Round(x0+r*Cos(t)); y1:=Round(y0+r*Sin(t)); End;
                              -3:;
                              -4:Begin x1:=Round(x0+r*Cos(t)); y1:=Round(y0-r*Sin(t)); End;
                         End;
                         t:=t-0.01
                    End;
           End;
     SetColor(White);
     Line(x0,y0,x1,y1);
     SetColor(Blue);
     SetFillStyle(1,Blue);
     PieSlice(320,240,0,360,10);
     SetColor(Green);
     SetFillStyle(1,Green);
     PieSlice(320,240,0,360,6);
     Until c=#27;
End;
Begin
     GD:=Detect;
     InitGraph(GD,GM,'');
     DrawHunter;
End.

Получается бред.. Линия крутится как хочет=( Ошибка в использовании t?
Archon
blink.gif Это ты так просто линию вращаешь? wacko.gif Круто... cool.gif

Мой вариант попроще, но может на что и сгодится wink.gif
Uses Graph,Crt;

Const
  Left  = #75;
  Right = #77;
  Up    = #72;
  Down  = #80;

Var
  GD, GM: Integer;

Procedure DrawHunter;
Var
  x0, y0, x1, y1, r : Integer;
  c : Char;
  t : Real;
Begin
  x0 := 320;
  y0 := 240;
  x1 := r + x0;
  y1 := y0;
  r  := 199;
  t  := 0;
  Circle(x0, y0, 200);
  repeat
    c := ReadKey;
    case c Of
      Left:  t := t - 0.01;
      Right: t := t + 0.01;
    end;
    if (t >= 2 * Pi) or (t <= -2 * Pi) then t := 0;
    SetColor(Black);
    Line(x0, y0, x1, y1);
    x1 := Round(r * cos(t)) + x0;
    y1 := Round(r * sin(t)) + y0;
    SetColor(White);
    Line(x0, y0, x1, y1);
    SetColor(Blue);
    SetFillStyle(1, Blue);
    PieSlice(320, 240, 0, 360, 10);
    SetColor(Green);
    SetFillStyle(1, Green);
    PieSlice(320, 240, 0, 360, 6);
  until c = #27;
end;

begin
     GD := Detect;
     InitGraph(GD, GM, '');
     DrawHunter;
end.
pashist
Я хотел линию вращать всеми клавишами) Попробую доделать твой код. Спасибо!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.