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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.09.2010, 16:47   #1
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию Проекция Rectangle

Паскалевская функция Rectangle умеет строить прямоугольники только со сторонами паралелльными осям.Вот вопрос: как построить прямоугольник повёрнутый под любым углом к осям?
P.S. Пробовал нечто подобное, но потом бросил - не получается
Код:
Procedure DrawBox(X1,Y1,X2,Y2:Integer;Color:Word);
Var Tx1,Tx2,Ty1,Ty2:Integer;
    Ax,Ay,Bx,By:Integer;
Begin
     SetColor(Color);
     Line(X1,Y1,X2,Y2);
     Tx1:=X1;Ty1:=Y1;
     Tx2:=Round(Tx1+Tx1*Sin(30*0.0174));
     Ty2:=Round(Ty1*Cos(30*0.0174));
     Line(Tx1,Ty1,Tx2,Ty2);
     Tx1:=0;Tx2:=0;Ty1:=0;Ty2:=0;
     Tx1:=X2;Ty1:=Y2;
     Tx2:=Round(Tx1+Tx1*Sin(30*0.0174));
     Ty2:=Round(Ty1*Cos(30*0.0174));
     Line(Tx1,Ty1,Tx2,Ty2);
End;
_-Re@l-_ вне форума Ответить с цитированием
Старый 08.09.2010, 16:49   #2
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

а 4 -мя линиями не устраивает?
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"
Mad_Cat вне форума Ответить с цитированием
Старый 08.09.2010, 16:50   #3
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Так вот линии то и надо спроектировать!


Ладно, поставим вопрос по другому:
даны координаты всех углов прямоугольника. Нужно повернуть прямоугольник на 30 градусов по часовой стрелке. Т.е. нужно вычислить все координаты нового прямоугольника, что у меня и не получается!

Последний раз редактировалось _-Re@l-_; 08.09.2010 в 16:57.
_-Re@l-_ вне форума Ответить с цитированием
Старый 08.09.2010, 17:05   #4
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

1) Ищем центр прямоугольника.
2) Определяем углы от X до каждой точки, если центр окружности мы уже нашли.
3) Прокручиваем каждую точку + 30 г.
4) Рисуем 4 линии по новым координатам.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 08.09.2010, 17:11   #5
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

Поворот точки на угол альфа, через центр cx, cy, можно осуществить так
Цитата:
dx = ox - cx
dy = oy - cy
nx = cx + (dx * cos(alpha) - dy * sin(alpha))
ny = cy + (dx * sin(alpha) + dy * cos(alpha))
Где ox, oy - старые координаты точки, nx, ny - новые координаты точки
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"
Mad_Cat вне форума Ответить с цитированием
Старый 08.09.2010, 17:13   #6
dexterua
Пользователь
 
Регистрация: 16.11.2009
Сообщений: 24
По умолчанию

Код:
Procedure DrawLine(X1,Y1,X2,Y2:Integer;Color:Word;int L);//угол добавился
Var Tx1,Tx2,Ty1,Ty2:Integer;
Begin
     SetColor(Color);
     Tx1:=X1;Ty1:=Y1;
     Tx2:=Round(X1+(X2-X1)*Cos(L*0.0174)-(Y2-Y1)*Sin(L*0.0174));
     Ty2:=Round(Y1+(Y2-Y1)*Cos(L*0.0174)+(X2-X1)*Sin(L*0.0174));
     Line(Tx1,Ty1,Tx2,Ty2);
End;
Рисует вектор повернутый на угол L
Если не ясно, то посмотри информацию про матрицу поворота

ой, уже опоздал)

Последний раз редактировалось dexterua; 08.09.2010 в 17:15. Причина: не успел
dexterua вне форума Ответить с цитированием
Старый 08.09.2010, 19:27   #7
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Честно говоря, с вектором всё хорошо, а вот повернуть прямоугольник до сих пор не получается.
_-Re@l-_ вне форума Ответить с цитированием
Старый 08.09.2010, 23:58   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

_-Re@l-_, видимо, не очень хорошо с векторами

посмотрите такую программку:
Код:
Uses Graph,Crt;
procedure MyDelay(HundSecond : longInt);
var
  Ticks      : LongInt  absolute 0:$46c;
begin
  HundSecond:=round(HundSecond * 0.185) +Ticks;
  repeat  until (Ticks>HundSecond);
end;

procedure DrawRectRotate(x0, y0, a, b : integer; Ugol : double;
                         LineColor : integer);
var x1,y1,x2,y2, x3,y3 : integer;
begin
  setcolor(LineColor);
  x1 := round(x0 + a * cos(Ugol*pi/180));
  y1 := round(y0 + a * sin(Ugol*pi/180));
  Line(x0, y0, x1, y1);

  x2 := round(x1 + b * cos((Ugol-270)*pi/180));
  y2 := round(y1 + b * sin((Ugol-270)*pi/180));
  Line(x1, y1, x2, y2);

  x3 := round(x0 + b * cos((Ugol-270)*pi/180));
  y3 := round(y0 + b * sin((Ugol-270)*pi/180));
  Line(x0, y0, x3, y3);

  Line(x2, y2, x3, y3);

end;

var GraphDriver, GraphMode,
   i : integer;
   x0, y0 : integer;
   Ang : integer;
begin
  GraphDriver := detect;
  InitGraph(GraphDriver, GraphMode, '..\BGI');
  x0 := 250;
  y0 := 200;
  setcolor(15);
  Ang := 0;

  repeat
    DrawRectRotate(x0, y0, 100, 50, Ang, 15);
    MyDelay(5);
    {сотрём - просто выведем фигуру цветом 0}
    DrawRectRotate(x0, y0, 100, 50, Ang, 0);
    Ang := Ang + 2;
  until KeyPressed;
  CloseGraph;
end.
для простоты поворот берётся от левого верхнего угла прямоугольника (x0,y0), но при желании центр поворота может быть где угодно...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.09.2010, 11:13   #9
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Интересный пример, как раз мне подходит. Спасибо
_-Re@l-_ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проекция файла и запись/чтение объектов класса в C++ sd13 Помощь студентам 26 25.05.2008 12:05