![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Непонятки с SetWorldTransform
GrayFace © (2004-12-22 16:39:00)Мне надо повернуть картинку на 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, буду тоже очень признателен.
wicked (2004-12-28 14:53:00) [1]кстати, во второй ссылке в списке литературы под 3 номером дана книжка Эйнджела... советую её найти - там однородные координаты разжеваны очень даже подробно...
wicked (2004-12-28 14:51:00) [2]> 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...
GrayFace (2004-12-28 12:24:00) [3]MBo © (25.12.04 13:22) [9]
1. Нет, вручную. В статье "поставить точку" и в delphibase.endimus.com есть примеры
Действительно. Спасибо. А я-то подумал, что там просто про Scanline рассказывается.
MBo (2004-12-25 13:22:00) [4]1. Нет, вручную. В статье "поставить точку" и в delphibase.endimus.com есть примеры
2. не знаю. Драйверы принтера могут не поддерживать, наверно
GrayFace (2004-12-25 11:47:00) [5]Спасибо.
Еще несколько вопросов:
1) Есть ли функция для поворота, совместимая с 9x?
2) В MSDN написано, что PlgBlt поддерживается железом не всегда. Насколько часто она не поддерживается?
А не найдется ли исходник поворота при помощи SetWorldTransform или поворота вручную?
MBo (2004-12-24 09:44:00) [6]Пример использования 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-24 09:30:00) [7]GrayFace © (23.12.04 21:06) [4]
О линейных оператах я уже имею достаточное (в данном случае) представление - больше тут ничего знать не нужно.
Поправлюсь: ЛО тут совсем не причем, но это и не важно.
MBo © (24.12.04 8:33) [5]
А как быть с последними тремя параметрами?
MBo (2004-12-24 08:33:00) [8]>GrayFace
PlgBlt вращать умеет - это трансформация прямоугольника в параллелограмм любого расположения.
GrayFace (2004-12-23 21:06:00) [9]А, я подумал о передвижение Cliprect'а.
Значит так:
Все-таки скалируется нормально. При любой трансформации меняется Cliprect. При любом ненулевом значении eM12 или eM21 результат - пустота. Flip(eM11:=-1) не работает.
В MSDN написано, что маска в PlgBlt - параметр необязательный, но, когда я пишу нули вместо 3 посл. параметров, летит ошибка:Неверный дескриптор. К тому же, в MSDN написано, что он не умеет вращать, а мне-то именно вращать надо.
wicked © (23.12.04 20:03) [3]
также желательно почитать об однородных координатах и их трансформациях...
Не думаю. О линейных оператах я уже имею достаточное (в данном случае) представление - больше тут ничего знать не нужно. Но что такое однородные координаты?
wicked (2004-12-23 20:03:00) [10]
> 2. Я так и подумал. Но странно: если я пишу eM11:=2, eM22:=2,
> а остальные нули, то нет никакого результата (как будто
> не было Transform'а). А как ее двигать?
eDx, eDy... также желательно почитать об однородных координатах и их трансформациях...
GrayFace (2004-12-23 19:12:00) [11]1. XP
2. Я так и подумал. Но странно: если я пишу eM11:=2, eM22:=2, а остальные нули, то нет никакого результата (как будто не было Transform'а). А как ее двигать?
3. Спасибо.
MBo (2004-12-22 17:39:00) [12]1. Какая ОС? (в 9x поворот не поддерживается)
2. при повороте на 90 вокруг точки 0,0 картинка будет за областью видимости, чток что нужно ее смещать
3. Альтернативы для поворота - PlgBlt, ScanLine, статья "Поставить точку..."