Вниз
Скачать: CL | DM;

Размеры повернутого битмапа   Найти похожие ветки 

 
dimon_programmer   (2004-06-14 19:08) [0]

Здраствуйте! Подскажите вот какую вешь: как узнать минимальные размеры битмапа, в который влезет
битмап размером W на H, повернутый на N градусов. Я пробую находить минимальный и максимальный Х и У,
а затем находить разность, но при больших углах этот способ выдает ерунду.


 
Fenik   (2004-06-14 21:54) [1]

type TRectList = array [1..4] of TPoint;

function RotateRect(const Rect: TRect; const Center: TPoint; Angle: Double): TRectList;
var DX, DY: Integer;
   SinAng, CosAng: Double;

 procedure SinCos(AngleRad: Double; var ASin, ACos: Double);
 begin
   ASin := Sin(AngleRad);
   ACos := Cos(AngleRad);
 end;

 function RotPoint(PX, PY: Integer): TPoint;
 begin
   DX := PX - Center.x;
   DY := PY - Center.y;
   Result.x := Center.x + Round(DX * CosAng - DY * SinAng);
   Result.y := Center.y + Round(DX * SinAng + DY * CosAng);
 end;

begin
 SinCos(Angle * (Pi / 180), SinAng, CosAng);
 Result[1] := RotPoint(Rect.Left, Rect.Top);
 Result[2] := RotPoint(Rect.Right, Rect.Top);
 Result[3] := RotPoint(Rect.Right, Rect.Bottom);
 Result[4] := RotPoint(Rect.Left, Rect.Bottom);
end;

function Min(A, B: Integer): Integer;
begin
 if A < B then Result := A
          else Result := B;
end;

function Max(A, B: Integer): Integer;
begin
 if A > B then Result := A
          else Result := B;
end;

function GetRLLimit(const RL: TRectList): TRect;
begin
 Result.Left   := Min(Min(RL[1].x, RL[2].x), Min(RL[3].x, RL[4].x));
 Result.Top    := Min(Min(RL[1].y, RL[2].y), Min(RL[3].y, RL[4].y));
 Result.Right  := Max(Max(RL[1].x, RL[2].x), Max(RL[3].x, RL[4].x));
 Result.Bottom := Max(Max(RL[1].y, RL[2].y), Max(RL[3].y, RL[4].y));
end;

var Lim: TRect;

   Lim := GetRLLimit(RotateRect(Rect(0, 0, W, H), Point(0, 0), Angle));
   NewW := Lim.Right - Lim.Left;
   NewH := Lim.Bottom - Lim.Top;


Попробуй упростить.


 
Огромное Кулясище   (2004-06-14 22:31) [2]

Alpha := Alpha * 3.14159265358979 / 180;

Sx := Abs(SrcR * Cos(Alpha)) + Abs(SrcB * Sin(Alpha));
Sy := Abs(SrcR * Sin(Alpha)) + Abs(SrcB * Cos(Alpha));

Sx, Sy - ответ. Alpha - угол в градусах.


 
Fenik   (2004-06-14 22:45) [3]

>Огромное Кулясище  (14.06.04 22:31) [2]

О! Именно так.


 
Огромное Кулясище   (2004-06-14 22:54) [4]

Забыл пояснить, что ScrR и ScrB - это ширина и высота соответсвенно (т.е. ScrR - ширина).



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

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.02 c
1-1092826286
Lizka
2004-08-18 14:51
2004.09.05
Ширина колонок у EhLibDBGrid


14-1092382830
ruslan
2004-08-13 11:40
2004.09.05
Timaje


14-1092397485
nasty
2004-08-13 15:44
2004.09.05
люди добрые! есть ли в процессорах амд технология ммх?


3-1092140802
Koala
2004-08-10 16:26
2004.09.05
Ковертация из Dbase в Firebird


3-1092219346
Алексей
2004-08-11 14:15
2004.09.05
Подключение программы к запароленным таблицам




   Наверх