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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.05.2011, 16:50   #1
Vova777
Уважаемый
Форумчанин
 
Аватар для Vova777
 
Регистрация: 04.07.2010
Сообщений: 318
По умолчанию Алгоритм поворота прямоугольника. Всего 4 точки. Проблема.

var
xA,yA,xB,yB,xC,yC,xD,yD,fi: integer;
begin
//получаем значение угла
fi:= StrToInt(Edit1.Text);

//инициализация начальных точек полигона
xA:= 70;
yA:= 85;
xB:= 130;
yB:= 85;
xC:= 130;
yC:= 115;
xD:= 70;
yD:= 115;
//конец инициализации

// преобразуем градусы в радианы
xA:= Round((xA*cos(fi*Pi/180) - yA*sin(fi*Pi/180)));
yA:= Round((xA*sin(fi*Pi/180) + yA*cos(fi*Pi/180)));

xB:= Round((xB*cos(fi*Pi/180) - yB*sin(fi*Pi/180)));
yB:= Round((xB*sin(fi*Pi/180) + yB*cos(fi*Pi/180)));

xC:= Round((xC*cos(fi*Pi/180) - yC*sin(fi*Pi/180)));
yC:= Round((xC*sin(fi*Pi/180) + yC*cos(fi*Pi/180)));

xD:= Round((xD*cos(fi*Pi/180) - yD*sin(fi*Pi/180)));
yD:= Round((xD*sin(fi*Pi/180) + yD*cos(fi*Pi/180)));
//конец преобразования

//вывод полигона
Form1.Canvas.Polygon([Point(xA,yA),Point(xB,yB),Point(xC, yC),Point(xD, yD)]);
end;

Не могу понять, что же тут не так? Рисуется прямоугольник, который должен поворачиваться на угол fi при нажатии по кнопке. Поворачивается, но не понятно относительно какой точки происходит поворот? Это не центр пересечения его диагоналей и даже не ноль формы. А нужно относительно центра пересечения его диагоналей. Что же не так?
даешь высокое напряжение
Vova777 вне форума Ответить с цитированием
Старый 27.05.2011, 17:31   #2
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
не понятно относительно какой точки
Как это не понятно ?
Отн-но верхнего левого угла канвы !
mss вне форума Ответить с цитированием
Старый 27.05.2011, 17:47   #3
Vova777
Уважаемый
Форумчанин
 
Аватар для Vova777
 
Регистрация: 04.07.2010
Сообщений: 318
По умолчанию

Цитата:
Сообщение от mss Посмотреть сообщение
Как это не понятно ?
Отн-но верхнего левого угла канвы !
нет. точно не относительно ее. Такое чувство что как будто в 3D поворачивается. Но это не так. Нужно разобраться, и сделать, чтобы относительно центра пересечения его диагоналей.
даешь высокое напряжение
Vova777 вне форума Ответить с цитированием
Старый 27.05.2011, 18:19   #4
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
точно не относительно ее
Тогда начни "разборки" с выяснения относительно КАКОЙ точки тобой произведена "инициализация начальных точек полигона"

Цитата:
Pi/180
Для перевода градусов в радианы существует штатная ф-ция DegToRad()

Последний раз редактировалось mss; 27.05.2011 в 18:21.
mss вне форума Ответить с цитированием
Старый 27.05.2011, 18:25   #5
Vova777
Уважаемый
Форумчанин
 
Аватар для Vova777
 
Регистрация: 04.07.2010
Сообщений: 318
По умолчанию

Цитата:
Сообщение от mss Посмотреть сообщение
Тогда начни "разборки" с выяснения относительно КАКОЙ точки тобой произведена "инициализация начальных точек полигона"
Относительно нуля, это понятно ведь. Но производится поворот непонятным образом: помимо того, что полигон вращается относительно нуля, он еще вращается вокруг себя самого(?), в пространстве причем.
Тут вся проблема в том, что я не знаю как сделать так, чтобы поворот полигона осуществлялся относительно точки пересечения диагоналей данного полигона и все, больше мне ничего не надо.
даешь высокое напряжение
Vova777 вне форума Ответить с цитированием
Старый 27.05.2011, 18:26   #6
Vova777
Уважаемый
Форумчанин
 
Аватар для Vova777
 
Регистрация: 04.07.2010
Сообщений: 318
По умолчанию

Для перевода градусов в радианы существует штатная ф-ция DegToRad()[/QUOTE]

учту на будущее )))
даешь высокое напряжение
Vova777 вне форума Ответить с цитированием
Старый 27.05.2011, 18:34   #7
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
Относительно нуля, это понятно ведь
А "нуль"-то в координатах канвы ГДЕ по-твоему ?)
mss вне форума Ответить с цитированием
Старый 27.05.2011, 18:40   #8
Swarog
Форумчанин
 
Аватар для Swarog
 
Регистрация: 26.01.2010
Сообщений: 215
По умолчанию

исправлено и дополнено, поворот относительно чентра диагонали AC
что не понятно спрашивай
Код:

var
xA,yA,xB,yB,xC,yC,xD,yD,fi: real;

var
 cx, cy: real;

procedure TForm1.FormCreate(Sender: TObject);
begin
//инициализация начальных точек полигона
xA:= 70;
yA:= 85;
xB:= 130;
yB:= 85;
xC:= 130;
yC:= 115;
xD:= 70;
yD:= 115;
// считаем центр
 cx := xa - (xa - xc) / 2;
 cy := ya - (ya - yc) / 2;

//конец инициализации
end;

procedure TForm1.Button1Click(Sender: TObject);
procedure Rotate(var X,Y,Cx,CY,Fi: real);
 var tx: real;
 begin
  // сначала перенос
  x := x - cx;
  y := y - cy;
  // поворот
  tx := x;
  x := tx * cos(fi) +  y * sin(fi);
  y := -tx * sin(fi) + y * cos(fi);
  // перенос обратно на место
  x := x + cx;
  y := y + cy;
 end;

begin

 fi := 5;
 fi := DegToRad(fi);

// поворот каждой точки
 Rotate(xa,ya,cx,cy,fi);
 Rotate(xb,yb,cx,cy,fi);
 Rotate(xc,yc,cx,cy,fi);
 Rotate(xd,yd,cx,cy,fi);

end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Button1Click(nil);
 Form1.Canvas.Polygon([
  Point(round(xA),round(yA)),
  Point(round(xB),round(yB)),
  Point(round(xC), round(yC)),
  Point(round(xD), round(yD))]);
end;

end.
Могу лишь пнуть в нужном направлении (ну или как получится)

Последний раз редактировалось Swarog; 27.05.2011 в 20:06.
Swarog вне форума Ответить с цитированием
Старый 27.05.2011, 18:43   #9
Swarog
Форумчанин
 
Аватар для Swarog
 
Регистрация: 26.01.2010
Сообщений: 215
По умолчанию

твоя ошибка была во первых в формуле, хотя нет с формулой нормально просто крутить будет в обратную сторону, это формула обратного преобразования, вторая твоя ошибка ты не сохранял Х, в итоге значение У считалось не правильно
Могу лишь пнуть в нужном направлении (ну или как получится)
Swarog вне форума Ответить с цитированием
Старый 27.05.2011, 18:52   #10
Vova777
Уважаемый
Форумчанин
 
Аватар для Vova777
 
Регистрация: 04.07.2010
Сообщений: 318
По умолчанию

говорит:
[Error] Unit1.pas(68): Undeclared identifier: 'DegToRad'

что-то добавить нужно?
даешь высокое напряжение
Vova777 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Точки персечения окружности и прямоугольника _-Re@l-_ Общие вопросы Delphi 2 29.05.2011 20:28
Не работает алгоритм вращения точки. 616th Помощь студентам 4 06.02.2011 23:31
Проблема со скриптом на сайте (скорее всего) Alex_Rad Помощь студентам 0 26.05.2010 22:04
Улучшить алгоритм нахождения элемента, чаще всего повторяющегося в возрастающем массиве nitrolighter Помощь студентам 6 18.10.2009 13:33
Проблема с рисованием прямоугольника Юра. Общие вопросы Delphi 13 04.08.2007 06:08