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

Вниз

Непонятки с 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 вся ветка

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

Наверх




Память: 0.5 MB
Время: 0.025 c
6-1101545732
JR
2004-11-27 11:55
2005.02.13
Знатокам WinSock


6-1101633576
OneFragLeft
2004-11-28 12:19
2005.02.13
Отказ на соединение.


9-1087206460
breakmaster
2004-06-14 13:47
2005.02.13
битовые образы.


14-1106653655
Ega23
2005-01-25 14:47
2005.02.13
Зацепило сильно...


8-1098891463
Colonel
2004-10-27 19:37
2005.02.13
Как програмно увеличить/уменьшить звук ?