Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
14-1106320457
Aleksandr
2005-01-21 18:14
2005.02.13
Установка Win2000 Server


1-1106881630
gsformat
2005-01-28 06:07
2005.02.13
как отловить утечку памяти


10-1083047420
JibSkeart
2004-04-27 10:30
2005.02.13
Внутри СОМ не ловит события WaitForMultipleObjects почему ?


14-1106457948
Чеширский_Кот
2005-01-23 08:25
2005.02.13
Doxygen


8-1099143128
colonel
2004-10-30 17:32
2005.02.13
Не работает прога под win2k и XP





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский