文档章节

GdiPlus[48]: IGPMatrix 矩阵(三) 关于矩阵的旋转

涂孟超
 涂孟超
发布于 2014/09/26 15:37
字数 491
阅读 9
收藏 0

矩阵旋转一个角度, 会关联到 M11、M12、M21、M22 四个数据, 计算公式如下:
┏                  ┓
┃ cos(r)  sin(r)  0┃
┃-sin(r)  cos(r)  0┃
┃ DX      DY      1┃
┗                  ┛

//其中的 r 不是角度是弧度; 弧度的计算方法是: r = 角度 * Pi / 180.

 
 
 
 
 

 

 

  

下面两段程序对上面的公式进行了对比测试:

//
var
  m: IGPMatrix;
begin
  m := TGPMatrix.Create;
  m.Rotate(90);
  ShowMessageFmt('%f  %f', [m.Elements.M11, m.Elements.M12]); // 0.00  1.00
  ShowMessageFmt('%f  %f', [m.Elements.M21, m.Elements.M22]); //-1.00  0.00

  m.Reset;
  m.Rotate(-30);
  ShowMessageFmt('%f  %f', [m.Elements.M11, m.Elements.M12]); //0.87  -0.50
  ShowMessageFmt('%f  %f', [m.Elements.M21, m.Elements.M22]); //0.50   0.87
end;

//
var
  r: Single;
  M11,M12,M21,M22: Single;
begin
  r := 90 * Pi/180;
  M11 := Cos(r);  M12 := Sin(r);
  M21 := -Sin(r); M22 := Cos(r);
  ShowMessageFmt('%f  %f', [M11, M12]); // 0.00  1.00
  ShowMessageFmt('%f  %f', [M21, M22]); //-1.00  0.00

  r := -30 * Pi/180;
  M11 := Cos(r);  M12 := Sin(r);
  M21 := -Sin(r); M22 := Cos(r);
  ShowMessageFmt('%f  %f', [M11, M12]); //0.87  -0.50
  ShowMessageFmt('%f  %f', [M21, M22]); //0.50   0.87
end;

 
 
 
 
 

 

 

  

观察一个点的旋转效果(从蓝色旋转 90 度到红色):



uses GdiPlus;

procedure TForm1.FormPaint(Sender: TObject);
var
  Graphics: IGPGraphics;
  Pen: IGPPen;
  Brush: IGPSolidBrush;
  Matrix: IGPMatrix;
  i: Integer;
  Pt: TGPPointF;
begin
  ClientWidth := 300;
  ClientHeight := 200;
  
  Pen := TGPPen.Create($FFE0E0E0);
  Brush := TGPSolidBrush.Create($FF0000FF);
  Graphics := TGPGraphics.Create(Handle);

  //绘制坐标系
  Graphics.Clear($FFFFFFFF);
  for i := 1 to ClientWidth div 10 do
    Graphics.DrawLine(Pen, TGPPoint.Create(i*10, 0), TGPPoint.Create(i*10, ClientHeight));
  for i := 1 to ClientHeight div 10 do
    Graphics.DrawLine(Pen, TGPPoint.Create(0, i*10), TGPPoint.Create(ClientWidth, i*10));

  Pen.Color := $FFB0B0B0;
  Graphics.DrawLine(Pen, TGPPoint.Create(ClientWidth div 2, 0), 
                         TGPPoint.Create(ClientWidth div 2, ClientHeight));
  Graphics.DrawLine(Pen, TGPPoint.Create(0, ClientHeight div 2), 
                         TGPPoint.Create(ClientWidth, ClientHeight div 2));

  //平移坐标系
  Graphics.TranslateTransform(ClientWidth div 2, ClientHeight div 2);
  Graphics.PixelOffsetMode := PixelOffsetModeHalf;
  Graphics.DrawEllipse(Pen, -2, -2, 5, 5);

  //假如有个点是 (80, -40), 用蓝色绘制此点
  Pt.Initialize(80, -40);
  Graphics.DrawLine(Pen, TGPPointF.Create(0, 0), Pt);
  Graphics.FillRectangle(Brush, Pt.X-2, Pt.Y-2, 5, 5);

  //旋转 90 度, 用红色重新绘制这个点
  Graphics.RotateTransform(90);
  Graphics.PixelOffsetMode := PixelOffsetModeHalf;
  Brush.Color := $FFFF0000;
  Graphics.DrawLine(Pen, TGPPointF.Create(0, 0), Pt);
  Graphics.FillRectangle(Brush, Pt.X-2, Pt.Y-2, 5, 5);
end;

 
 
 
 
 

 

 

  

旋转变换 IGPMatrix.Rotate() 或 IGPGraphics.RotateTransform 都有绕着 (0,0) 点的;

IGPMatrix.RotateAt() 可绕指定点旋转, 如:



uses GdiPlus;

procedure TForm1.FormPaint(Sender: TObject);
var
  Graphics: IGPGraphics;
  Matrix: IGPMatrix;
  Pen: IGPPen;
  Rect: TGPRect;
begin
  Graphics := TGPGraphics.Create(Handle);
  Pen := TGPPen.Create($FFD0D0D0, 2);
  Rect.Initialize(50, 30, 80, 80);

  Graphics.Clear($FFFFFFFF);
  Graphics.DrawRectangle(Pen, Rect);

  Matrix := TGPMatrix.Create;
  Matrix.RotateAt(45, TGPPointF.Create(Rect.X + Rect.Width/2, Rect.Y + Rect.Height/2));
  Graphics.MultiplyTransform(Matrix);

  Pen.Color := $80FF0000;
  Graphics.DrawRectangle(Pen, Rect);
end;

 
 
 
 
 

 

 

  

本文转载自:http://www.cnblogs.com/del/archive/2009/12/25/1631945.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
Android中图像变换Matrix的原理、代码验证和应用

第一部分 Matrix的数学原理 在Android中,如果你用Matrix进行过图像处理,那么一定知道Matrix这个类。Android中的Matrix是一个3 x 3的矩阵,其内容如下: Matrix的对图像的处理可分为四类基本...

蜗牛TT
2012/08/23
0
3
OpenGL超级宝典笔记——操作矩阵

为了更强大的功能和灵活性,我们有时需要直接操作矩阵。在OpenGL中4x4的矩阵用包含16个浮点数值的一维数组来表示,而不是用二维的4x4的数组来表示。OpenGL之所以这么做,因为使用一维数组更高...

Mario_Q
2013/09/24
0
0
Matrix, ColorMatrix

作为Android源码中的一个常用类,它的作用是持有一个3*3的矩阵数组,用于坐标的转换。 Matrix用来制作动画效果、改变图片大小、给图片加各类滤镜等。 Matrix 的应用 - 压缩图像;Matrix 的应...

shareus
04/13
0
0
Android图片处理(Matrix,ColorMatrix)

Android图片处理(Matrix,ColorMatrix) 在编程中有时候需要对图片做特殊的处理,比如将图片做出黑白的,或者老照片的效果,有时候还要对图片进行变换,以拉伸,扭曲等等。 这些效果在andro...

sw3458856
2014/04/10
0
0
Android图片处理(Matrix,ColorMatrix)

在编程中有时候需要对图片做特殊的处理,比如将图片做出黑白的,或者老照片的效果,有时候还要对图片进行变换,以拉伸,扭曲等等。 这些效果在android中有很好的支持,通过颜色矩阵(ColorMa...

长平狐
2012/08/29
321
0

没有更多内容

加载失败,请刷新页面

加载更多

给MySQL授权远程访问

putty登录服务器; 登录MySQL: mysql -u root -p 新建远程用户: CREATE USER 'myusername' IDENTIFIED BY 'mypassword'; 授权: grant all on *.* to john@'101.102.103.104' identified by......

sweethome
58分钟前
0
0
在t-io老巢造谣,不过有造谣的就会有反造谣的!

只发当事人的截图,不发表评论,以免有引导嫌疑 PS: 截图是由不同的人发过来的 本人已经不在此微信群 图3:有造谣的,就有反造谣的 图4是2018-09-23的t-io官方群的一个发言小统计,有助于让...

talent-tan
今天
99
0
heartbeat 资源

drbd+apache+heartbeat : http://blog.51cto.com/11838039/1827901 heartbeat双机热备的架设 : http://blog.51cto.com/11838039/1827560 对heaetbeat的深一步认识 : http://blog.51cto.co......

寰宇01
今天
4
0
Spring 转换 model 为 json 时增加属性

缘起 目前的项目中有个需求是在附件对象转换成 json 时增加个 url 属性,以前的方式是在返回附件对象或列表时候做一次统一处理,这次想看看 spring 或者 jackson fasterxml 是否自带类似功能...

郁也风
今天
4
0
10大PHP比特币开源项目

如果你是一个Phper,如果你希望学习区块链,那么本文列出的 10个开源的Php比特币项目,将有助于你了解在自己的应用中 如何加入对比特币的支持。 如果你希望快速掌握使用Php对接比特币钱包的方...

汇智网教程
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部