Форум: "WinAPI";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];
Вниз
Непонятки с SetWorldTransform Найти похожие ветки
← →
GrayFace © (2004-12-22 16:39) [0]Мне надо повернуть картинку на 90 градусов.
Делаю так:b:TBitmap;
...
myForm.eDx:=0;
myForm.eDy:=0;
SetGraphicsMode(b.Canvas.Handle, GM_ADVANCED);
myForm.eM11:=0;
myForm.eM22:=0;
myForm.eM12:=1;
myForm.eM21:=-1;
SetWorldTransform(b.Canvas.Handle, myForm);
Control.Canvas.CopyRect(Rect,b.Canvas,b.Canvas.ClipRect);
В результате на канвасе контрола ничего не меняется.
Если кто-то вращал без WinAPI, буду тоже очень признателен.
← →
MBo © (2004-12-22 17:39) [1]1. Какая ОС? (в 9x поворот не поддерживается)
2. при повороте на 90 вокруг точки 0,0 картинка будет за областью видимости, чток что нужно ее смещать
3. Альтернативы для поворота - PlgBlt, ScanLine, статья "Поставить точку..."
← →
GrayFace © (2004-12-23 19:12) [2]1. XP
2. Я так и подумал. Но странно: если я пишу eM11:=2, eM22:=2, а остальные нули, то нет никакого результата (как будто не было Transform"а). А как ее двигать?
3. Спасибо.
← →
wicked © (2004-12-23 20:03) [3]
> 2. Я так и подумал. Но странно: если я пишу eM11:=2, eM22:=2,
> а остальные нули, то нет никакого результата (как будто
> не было Transform"а). А как ее двигать?
eDx, eDy... также желательно почитать об однородных координатах и их трансформациях...
← →
GrayFace © (2004-12-23 21:06) [4]А, я подумал о передвижение Cliprect"а.
Значит так:
Все-таки скалируется нормально. При любой трансформации меняется Cliprect. При любом ненулевом значении eM12 или eM21 результат - пустота. Flip(eM11:=-1) не работает.
В MSDN написано, что маска в PlgBlt - параметр необязательный, но, когда я пишу нули вместо 3 посл. параметров, летит ошибка:Неверный дескриптор
. К тому же, в MSDN написано, что он не умеет вращать, а мне-то именно вращать надо.
wicked © (23.12.04 20:03) [3]
также желательно почитать об однородных координатах и их трансформациях...
Не думаю. О линейных оператах я уже имею достаточное (в данном случае) представление - больше тут ничего знать не нужно. Но что такое однородные координаты?
← →
MBo © (2004-12-24 08:33) [5]>GrayFace
PlgBlt вращать умеет - это трансформация прямоугольника в параллелограмм любого расположения.
← →
GrayFace © (2004-12-24 09:30) [6]GrayFace © (23.12.04 21:06) [4]
О линейных оператах я уже имею достаточное (в данном случае) представление - больше тут ничего знать не нужно.
Поправлюсь: ЛО тут совсем не причем, но это и не важно.
MBo © (24.12.04 8:33) [5]
А как быть с последними тремя параметрами?
← →
MBo © (2004-12-24 09:44) [7]Пример использования PlgBlt для поворота битмапа b вокруг центра таким образом, что левый угол охватывающего пр-ка остается в точке 0,0
procedure TForm1.RotateNTClick(Sender: TObject);
var
p: array[0..2] of TPoint;
fi, fi0: Double;
NewWd, NewHt, xc, yc, diag: Integer;
begin
Refresh;
fi := pi / 4;
fi0 := ArcTan2(b.Height, -b.Width);
NewWd := Abs(Round(b.Height * Sin(fi))) + Abs(Round(b.Width * Cos(fi)));
NewHt := Abs(Round(b.Width * Sin(fi))) + Abs(Round(b.Height * Cos(fi)));
xc := NewWd div 2;
yc := NewHt div 2;
diag := Round(Sqrt(Sqr(b.Width) + Sqr(b.Height)) / 2);
p[0].x := xc + Round(diag * Cos(fi + fi0));
p[0].y := yc - Round(diag * Sin(fi + fi0));
fi0 := fi - fi0;
p[1].x := xc - Round(diag * Cos(fi0));
p[1].y := yc + Round(diag * Sin(fi0));
p[2].x := xc + Round(diag * Cos(fi0));
p[2].y := yc - Round(diag * Sin(fi0));
PlgBlt(Canvas.Handle, p, b.Canvas.Handle, 0, 0, b.Width, b.Height, 0, 0, 0);
end;
← →
GrayFace © (2004-12-25 11:47) [8]Спасибо.
Еще несколько вопросов:
1) Есть ли функция для поворота, совместимая с 9x?
2) В MSDN написано, что PlgBlt поддерживается железом не всегда. Насколько часто она не поддерживается?
А не найдется ли исходник поворота при помощи SetWorldTransform или поворота вручную?
← →
MBo © (2004-12-25 13:22) [9]1. Нет, вручную. В статье "поставить точку" и в delphibase.endimus.com есть примеры
2. не знаю. Драйверы принтера могут не поддерживать, наверно
← →
GrayFace © (2004-12-28 12:24) [10]MBo © (25.12.04 13:22) [9]
1. Нет, вручную. В статье "поставить точку" и в delphibase.endimus.com есть примеры
Действительно. Спасибо. А я-то подумал, что там просто про Scanline рассказывается.
← →
wicked © (2004-12-28 14:51) [11]> GrayFace © (23.12.04 21:06) [4]
> Не думаю. О линейных оператах я уже имею достаточное (в
> данном случае) представление - больше тут ничего знать не
> нужно. Но что такое однородные координаты?
http://encycl.yandex.ru/cgi-bin/art.pl?art=bse/00054/57700.htm&encpage=bse
http://cgm.graphicon.ru:8080/issue4/Paper2_ignatenko/index.html
простым языком - это математический инструмент, позволяющий в одно преобразование записать вращение, масштабирование и параллельный перенос определенной точки (в 2d или 3d)... базируется на умножении матриц преобразований...
кстати, в msdn дано похожее обьяснение для функции SetWorldTransform...
← →
wicked © (2004-12-28 14:53) [12]кстати, во второй ссылке в списке литературы под 3 номером дана книжка Эйнджела... советую её найти - там однородные координаты разжеваны очень даже подробно...
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.048 c