Форум: "Media";
Текущий архив: 2004.09.05;
Скачать: [xml.tar.bz2];
ВнизРазмеры повернутого битмапа Найти похожие ветки
← →
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 вся ветка
Форум: "Media";
Текущий архив: 2004.09.05;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.034 c