Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

поворот RECT   Найти похожие ветки 

 
Ms-R   (2010-04-04 11:14) [0]

Уважаемые мастера.
Скажите как повернуть RECT на угол.
RECT задается через (a,b,c,d).
Например А(100,100,200,300) на 45 градусов.
На выходе В(a,b,c,d).
Спасибо.


 
DVM ©   (2010-04-04 11:25) [1]

Относительно чего повернуть?


 
{RASkov} ©   (2010-04-04 11:29) [2]

> [0] Ms-R   (04.04.10 11:14)
> Например А(100,100,200,300)

тут указаны две точки(верх/лев и низ/прав)

> На выходе В(a,b,c,d).

с двумя точками рект стандартно(или стандартный рект) не повернешь...
если его(рект) нужно нарисовать, то можно, например, повернуть канву или рект рисовать "не стандартно" т.е. другими стандартными функциями, например Polyline/Polygon....


 
_avenger_   (2010-04-04 11:48) [3]

Недавно решал такую задачу:

procedure PointRotate(var APoints: array of TPoint; const AOrigin: TPoint; const AAngle: Extended; const AStartIndex: Integer = 0);
var
 i, x, y: Integer;
 AACos, AASin: Extended;
begin
 AACos          := Cos(AAngle);
 AASin          := Sin(AAngle);
 for i := AStartIndex to High(APoints) do
 begin
   x            := APoints[i].X - AOrigin.X;
   y            := APoints[i].Y - AOrigin.Y;
   APoints[i].X := Round( (x * AACos) - (y * AASin) ) + AOrigin.X;
   APoints[i].Y := Round( (x * AASin) + (y * AACos) ) + AOrigin.Y;
 end;
end;

function RectRotate(const ARect: TRect; const AAngle: Extended): TRect;
var
 APoints: array [0..3] of TPoint;
begin
 with ARect do
 begin
   APoints[0] := Point(Left,  Top);
   APoints[1] := Point(Right, Top);
   APoints[2] := Point(Right, Bottom);
   APoints[3] := Point(Left,  Bottom);
 end;
 PointRotate(APoints, APoints[0], -AAngle, 0);
end;


 
_avenger_   (2010-04-04 11:52) [4]

Надо еще дописать:
 PointRotate(APoints, APoints[0], -AAngle, 0);
 with Result do
 begin
   Left       := MinIntValue([APoints[0].X, APoints[1].X, APoints[2].X, APoints[3].X]);
   Top        := MinIntValue([APoints[0].Y, APoints[1].Y, APoints[2].Y, APoints[3].Y]);
   Right      := MaxIntValue([APoints[0].X, APoints[1].X, APoints[2].X, APoints[3].X]);
   Bottom     := MaxIntValue([APoints[0].Y, APoints[1].Y, APoints[2].Y, APoints[3].Y]);
 end;


Ну или доработайте под себя. Мне надо было узнать высоту и ширину повернутых на определенный угол символов.


 
Anatoly Podgoretsky ©   (2010-04-04 13:36) [5]

> Ms-R  (04.04.2010 11:14:00)  [0]

Лучше всего привлечь матричное исчисление, наиболее полно и просто.
Ну а аналитически можно почитать тему Rotation в справке. Там приведены формулы.



Страницы: 1 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.071 c
15-1265817082
Медвежонок Пятачок
2010-02-10 18:51
2010.08.27
Тоска-печаль


15-1267230629
Юрий
2010-02-27 03:30
2010.08.27
С днем рождения ! 27 февраля 2010 суббота


15-1266164269
CSS
2010-02-14 19:17
2010.08.27
Win7 - не запускается проводник


2-1272814938
TechnoDreamer
2010-05-02 19:42
2010.08.27
Контейнер


2-1267226371
Дима
2010-02-27 02:19
2010.08.27
Загрузка текст.файла по индексу ListBox.