Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.06.2011, 21:48   #1
Vova777
Уважаемый
Форумчанин
 
Аватар для Vova777
 
Регистрация: 04.07.2010
Сообщений: 318
По умолчанию Перспектива в 2D.

Не подскажете, возможно ли изображение выведенной канвой на форму или в битмапе обработать с таким эффектом: нужно правую сторону изображения сделать меньше чем левую, но чтобы и изображение исказилось также. Т.е. сделать из прямоугольной области трапецеидальную с уклоном вправо (эффект перспективы). Пример:
__
l .\
l__/

Или сделать смещение верхних точек прямоугольной области вправо, вот, например, как-то так:
. ___
/___/

Можно так сделать?

P.S. Прошу прощения за такие фигуры )))
даешь высокое напряжение
Vova777 вне форума Ответить с цитированием
Старый 24.06.2011, 07:27   #2
GreyScall
Пользователь
 
Аватар для GreyScall
 
Регистрация: 01.01.2011
Сообщений: 29
Лампочка

Если прямоугольная область остаётся параллелепипедом - то можно обойтись аффинными матричными преобразованиями (в GDI они уже предусмотрены)...
При помощи матрицы 3x3 задаётся аффинное отображение одной системы координат в другую... Частными случаями такого преобразования являются масштабирование, сдвиг (наклон) и поворот...

Пример:

Код:
. . .
      Private
            { Private declarations }
            Pict: TBitmap;
. . .

Procedure TForm1.FormCreate(Sender: TObject);
Begin
DoubleBuffered:=True;
Pict:=TBitmap.Create;
Pict.Width:=64;
Pict.Height:=64;
Pict.Canvas.Brush.Color:=clGreen;
Pict.Canvas.Pen.Color:=clYellow;
Pict.Canvas.Pen.Width:=4;
Pict.Canvas.FillRect(Pict.Canvas.ClipRect);
Pict.Canvas.Rectangle(10, 10, 54, 54);
Pict.Canvas.Font.Color:=clWhite;
Pict.Canvas.Font.Size:=12;
Pict.Canvas.Font.Style:=[fsBold];
Pict.Canvas.TextOut(14, 22, 'Test');
End;

Procedure TForm1.FormPaint(Sender: TObject);
Var GM: Integer; Ang: Double; XF: tagXFORM;
Begin
GM:=SetGraphicsMode(Form1.Canvas.Handle, GM_ADVANCED); // Установили улучшенный графический режим (нужно для работы SetWorldTransform);
XF.eM11:=1;
XF.eM12:=0;
XF.eM21:=0.3; // Matrix for the Horizontal Shear;
XF.eM22:=1;
XF.eDx:=Pict.Width;
XF.eDy:=0;
SetWorldTransform(Form1.Canvas.Handle, XF); // Horizontal Shear;
Form1.Canvas.Draw(10, 10, Pict); // Вывод изображения;
XF.eM11:=1;
XF.eM12:=0.3; // Matrix for the Vertical Shear;
XF.eM21:=0;
XF.eM22:=1;
XF.eDx:=0;
XF.eDy:=Pict.Height;
SetWorldTransform(Form1.Canvas.Handle, XF); // Vertical Shear;
Form1.Canvas.Draw(10, 10, Pict); // Вывод изображения;
XF.eM11:=1.33;
XF.eM12:=0.3;
XF.eM21:=0.3;
XF.eM22:=1.33; // Matrix for an Affine Transformation;
XF.eDx:=Pict.Width;
XF.eDy:=Pict.Height;
SetWorldTransform(Form1.Canvas.Handle, XF); // Affine Transformation;
Form1.Canvas.Draw(10, 10, Pict); // Вывод изображения;
ModifyWorldTransform(Form1.Canvas.Handle, XF, MWT_IDENTITY); // Сбросили матрицу преобразований;
SetGraphicsMode(Form1.Canvas.Handle, GM); // Вернули обратно "старый" графический режим;
Form1.Canvas.Draw(10, 10, Pict); // Вывод изображения;
End;

Procedure TForm1.FormDestroy(Sender: TObject);
Begin
Pict.Free;
End;
А для "не аффинных" (например отобразить квадрат в трапецию) придётся либо искать готовую библиотеку, либо вручную.....
Regards, GreyScall.
GreyScall вне форума Ответить с цитированием
Старый 24.06.2011, 18:11   #3
Vova777
Уважаемый
Форумчанин
 
Аватар для Vova777
 
Регистрация: 04.07.2010
Сообщений: 318
По умолчанию

Вроде код что мне и надо, но что-то непонятно, а у квадратного изображения одну сторону (правую) меньше сделать как? т.е. в трапецию превратить?

так например:
_
l_\

или так:
_
l \
l_/

P.S. Опять же извиняюсь за фигурки )))
даешь высокое напряжение
Vova777 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перспектива IT Linel Свободное общение 18 07.12.2010 13:23
Перспектива программирования на Assembler'e Linel Свободное общение 16 05.09.2010 18:45
есть ли перспектива программирование в Delphi 7 kuzmich Софт 13 14.03.2009 12:28
Перспектива в Direct3D Ulex Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 11.03.2008 01:04