Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.05.2009, 23:19   #1
Ponaroshku
 
Регистрация: 25.05.2009
Сообщений: 5
По умолчанию Вращение прямоугольника

Задали в институте. Бился головой об стену, завершить не могу. Подскажите ошибку.

Текст задачи: Изобразить на экране прямоугольник, вращающийся в плоскости экрана вокруг одной из своих вершин.

Собственно, проблема в том, что не могу найти верные координаты четвертой точки (x4,y4). Надеюсь на помощь. Спасибо.

Код:
program three;
uses crt,GraphABC;
var
  a,b,r: real;
  x1_ekr,y1_ekr, x2_ekr, y2_ekr, x3_ekr,y3_ekr, x4_ekr,y4_ekr: integer;
begin
     a:=100;
  Repeat
    r:=a;
	  x1_ekr:=250;
	  y1_ekr:=150;
	  x2_ekr:=round(250+r*Cos(Pi*b/180));
	  y2_ekr:=round(150-r*Sin(Pi*b/180));
	  x3_ekr:=round(250+r*sin(Pi*b/180));
	  y3_ekr:=round(150+r*cos(Pi*b/180));
	  x4_ekr:=round(250+r*cos(Pi*b/180));
	  y4_ekr:=round(250+r*sin(Pi*b/180));
    SetPenColor(clBlack);
    Line(x1_ekr,y1_ekr,x2_ekr,y2_ekr);
    Line(x3_ekr,y3_ekr,x4_ekr,y4_ekr);
    Line(x1_ekr,y1_ekr,x3_ekr,y3_ekr);
    Line(x2_ekr,y2_ekr,x4_ekr,y4_ekr);
    SetPenColor(clWhite);
    Line(x1_ekr,y1_ekr,x2_ekr,y2_ekr);
    Line(x3_ekr,y3_ekr,x4_ekr,y4_ekr);
    Line(x1_ekr,y1_ekr,x3_ekr,y3_ekr);
    Line(x2_ekr,y2_ekr,x4_ekr,y4_ekr);
    b:=b+0.001
  until keypressed;
end.
Ponaroshku вне форума Ответить с цитированием
Старый 26.05.2009, 00:13   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Вот. Написал заново. Писал на FPC. У вас, я вижу, PascalABC, но, думаю, переделать сможете.
Код:
program three;
uses crt,Graph;
var
a,b: integer;
d,m : smallint;
x1,x2,x3,x4,y1,y2,y3,y4: integer;
alpha,beta : real;
x0,y0 : integer;
begin
clrscr;
initgraph(d,m,'');
alpha := 0;
x0 := 300;  // координаты левого верхнего угла
y0 := 300;
a := 100;   // сторона a
b := 200;   // сторона b
beta := arctan(b/a);
setcolor(15);
repeat
line(x1,y1,x2,y2);
line(x2,y2,x3,y3);
line(x3,y3,x4,y4);
line(x4,y4,x1,y1);

x1 := x0;
y1 := y0;
x2 := x0+round(a*cos(alpha));
y2 := y0+round(a*sin(alpha));
x3 := x0+round(sqrt(sqr(a)+sqr(b))*cos(alpha-beta));
y3 := y0+round(sqrt(sqr(a)+sqr(b))*sin(alpha-beta));
x4 := x0+round(b*cos(alpha-pi/2));
y4 := y0+round(b*sin(alpha-pi/2));

alpha := alpha + 0.1;
if alpha>=2*pi then alpha := 0;
delay(70);
cleardevice;
until keypressed;

closegraph;
end.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]

Последний раз редактировалось Sazary; 26.05.2009 в 00:32. Причина: исправил небольшой косяк
Sazary вне форума Ответить с цитированием
Старый 26.05.2009, 02:48   #3
Ponaroshku
 
Регистрация: 25.05.2009
Сообщений: 5
По умолчанию

2Sazary


В PABC замена черной линии белой происходит практически мгновенно, и получается, что прямоугольник виден на тысячные доли секунды. Но это скорее всего корявость тамошней графики. Постоянно с ней такие проблемы.

Огромное спасибо, буду дорабатывать.

Чуть позже : Исправил уменьшением прироста параметра alpha.

Финальный код:

Код:
program three;
uses crt,GraphABC;
var
  a,b: integer;
  x0,y0,x1,y1,x2,y2,x3,y3,x4,y4: integer;
  alpha,beta: real;
begin
     setwindowsize(800,600);
     x0:=400;
     y0:=300;
     a:=100;
     b:=200;
     alpha:=0;
     beta:=arctan(b/a);
  Repeat
    x1:=x0;
    y1:=y0;
    x2:=x0+round(a*cos(alpha));
    y2:=y0+round(a*sin(alpha));
    x3:=x0+round(sqrt(sqr(a)+sqr(b))*cos(alpha-beta));
    y3:=y0+round(sqrt(sqr(a)+sqr(b))*sin(alpha-beta));
    x4:=x0+round(b*cos(alpha-pi/2));
    y4:=y0+round(b*sin(alpha-pi/2));
    SetPenColor(clBlack);
    line(x1,y1,x2,y2);
    line(x2,y2,x3,y3);
    line(x3,y3,x4,y4);
    line(x4,y4,x1,y1);
    SetPenColor(clWhite);
    line(x1,y1,x2,y2);
    line(x2,y2,x3,y3);
    line(x3,y3,x4,y4);
    line(x4,y4,x1,y1);
    alpha:=alpha + 0.0001;
    if alpha>=2*pi then alpha:=0;
  until keypressed;
end.

Последний раз редактировалось Ponaroshku; 26.05.2009 в 02:53.
Ponaroshku вне форума Ответить с цитированием
Старый 26.05.2009, 02:52   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
В PABC замена черной линии белой происходит практически мгновенно, и получается, что прямоугольник виден на тысячные доли секунды.
Я не зарисовываю предыдущую линию. Я просто очищаю экран через cleardevice.
Уменьшите приращение угла alpha.
Еще можете попробовать увеличить задержку в Delay.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 28.05.2009, 13:31   #5
Ponaroshku
 
Регистрация: 25.05.2009
Сообщений: 5
По умолчанию

А как сделать так чтобы прямоугольник вращался относительно центра?
Ponaroshku вне форума Ответить с цитированием
Старый 28.05.2009, 13:37   #6
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от Ponaroshku
А как сделать так чтобы прямоугольник вращался относительно центра?
Учим геометрию
Код:
x1 := x0+round(sqrt(sqr(a)+sqr(b))*cos(alpha+(pi-beta))/2);
y1 := y0+round(sqrt(sqr(a)+sqr(b))*sin(alpha+(pi-beta))/2);
x2 := x0+round(sqrt(sqr(a)+sqr(b))*cos(alpha+beta)/2);
y2 := y0+round(sqrt(sqr(a)+sqr(b))*sin(alpha+beta)/2);
x3 := x0+round(sqrt(sqr(a)+sqr(b))*cos(alpha-beta)/2);
y3 := y0+round(sqrt(sqr(a)+sqr(b))*sin(alpha-beta)/2);
x4 := x0+round(sqrt(sqr(a)+sqr(b))*cos(alpha-(pi-beta))/2);
y4 := y0+round(sqrt(sqr(a)+sqr(b))*sin(alpha-(pi-beta))/2);
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 28.05.2009, 15:12   #7
Ponaroshku
 
Регистрация: 25.05.2009
Сообщений: 5
По умолчанию

Вы правы, очень с ней все плохо...
Ponaroshku вне форума Ответить с цитированием
Старый 28.10.2009, 17:50   #8
Kopova
Пользователь
 
Аватар для Kopova
 
Регистрация: 26.10.2009
Сообщений: 18
По умолчанию

Нашёл темку, которая мне нужна Спасибо за прогу - очень помогла Помогите написать цикл в котором прямоугольник поворачивался бы по нажатии одной клавиши в одну сторону, по нажатии другой - в противоположную. Я пытался, ничего не получается. Просто выключает программу при нажатии забинденной клавиши. Я ещё новичёк, поэтому сразу извините за тупость...
С уважением,
Kopova =)
Kopova вне форума Ответить с цитированием
Старый 28.10.2009, 18:26   #9
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Код:
program three;
uses crt,Graph;
var
a,b: integer;
d,m : smallint;
x1,x2,x3,x4,y1,y2,y3,y4: integer;
alpha,beta,koef : real;
x0,y0 : integer;
ch : char;
begin
clrscr;
initgraph(d,m,'');
alpha := 0;
koef := 1;
x0 := 300;  // êîîðäèíàòû ëåâîãî âåðõíåãî óãëà
y0 := 300;
a := 100;   // ñòîðîíà a
b := 200;   // ñòîðîíà b
beta := arctan(b/a);
setcolor(15);
repeat
line(x1,y1,x2,y2);
line(x2,y2,x3,y3);
line(x3,y3,x4,y4);
line(x4,y4,x1,y1);

x1 := x0;
y1 := y0;
x2 := x0+round(a*cos(alpha));
y2 := y0+round(a*sin(alpha));
x3 := x0+round(sqrt(sqr(a)+sqr(b))*cos(alpha-beta));
y3 := y0+round(sqrt(sqr(a)+sqr(b))*sin(alpha-beta));
x4 := x0+round(b*cos(alpha-pi/2));
y4 := y0+round(b*sin(alpha-pi/2));

alpha := alpha + koef*0.1;
if alpha>=2*pi then alpha := 0;
delay(70);
cleardevice;

if keypressed then
 begin
  ch := readkey;
  if ch = '1' then koef := 1
  else if ch='2' then koef := -1
  else if ch=#27 then break;
 end;
until ch=#27;

closegraph;
end.
Клавиша 1 - вращение по часовой, 2 - против, Esc - выход.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 29.10.2009, 16:12   #10
Kopova
Пользователь
 
Аватар для Kopova
 
Регистрация: 26.10.2009
Сообщений: 18
По умолчанию

Sazary, спасибо, но немного не то. Нужно, чтобы прямоугольник недвигался, пока не нажата клавиша. То есть, например, у нас есть обычный прямоугольник. По нажатию клавиши он начинает поворачиваться. Как только клавишу отпустили, он перестаёт крутиться.
На основе Вашей программы пытался сделать, вышло что-то такое...
Код:
...
alpha := alpha + koef*0.1;
if alpha>=2*pi then alpha := 0;
delay(70);
cleardevice;

if keypressed then
 begin
  ch := readkey;
  if ch = #75 then begin
  koef:= 1;
  alpha := alpha + koef*0.1;
  if alpha>=2*pi then alpha := 0;
  delay(70);
  end;
  else if ch=#77 then
  koef := -1;
  alpha := alpha + koef*0.1;
  if alpha>=2*pi then alpha := 0;
  delay(70);
  end;
  if ch=#27 then break;
 end;
until ch=#27;
... но мой Паскаль такое компилировать отказывается В чём ошибка? Или ошибки?
С уважением,
Kopova =)
Kopova вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вращение прямоугольника Ponaroshku Общие вопросы Delphi 0 25.05.2009 23:09
вращение треугольника в С++ bum90 Помощь студентам 3 28.04.2009 15:28
Вращение в DirectX Pedro Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 31.03.2009 21:37
Стороны прямоугольника Caragius Microsoft Office Excel 8 27.12.2008 03:02
Проблема с рисованием прямоугольника Юра. Общие вопросы Delphi 13 04.08.2007 06:08