Помощь - Поиск - Пользователи - Календарь
Полная версия: Поворот линии
Форум «Всё о Паскале» > 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
Я хотел линию вращать всеми клавишами) Попробую доделать твой код. Спасибо!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.