【转载】使用GDI+变换矩阵实现图形的平移、缩放及旋转
2009-03-23 16:14
573 查看
最近一哥们问GDI+图片旋转问题,我到网上搜索一下,在我们博客园里面看到了这篇,就转载了,
原文出处:http://www.cnblogs.com/XieKe-cs01/archive/2006/03/09/346771.html
这段时间用GDI+开发一个适量图形绘制软件,类似于CoreDraw,用于教学之用。刚开始用GDI+提供的变换矩阵Matrix实现图形旋转变换,图形的平移和缩放则自己通过计算实现。后来使用发现通过计算修改了坐标值,图形进行多次缩放之后会变形,特别是缩到特小之后无法还原。所以想改用Matrix一起实现图形平称及缩放,原以为很简单,因为都有现成的接口,没想到实现起来还费了不少劲。
改用Matrix后,先对图形进行缩放后再旋转,一切正常,效果很好。可是先对图形进行旋转后再缩放,问题来了,图形在绘图页面上漂移。这就奇怪了,先后操作有什么不同吗?绘制的时候我可是严格按照先平移,再缩放,最后旋转的顺序完成的啊?
调试发现,先缩放再旋转图形旋转中心点不会改变(以左上角坐标作为缩放基点,以图形中心点做为旋转基点),但是旋转后再缩放,图形的旋转中心点在不停地改变,所以整个图形应用矩阵变换后位置就产生偏移。如下图:
图1 缩放旋转不同顺序区别
怎么办?想来想去,只能在缩放时把图形重新偏移回去,以使图形的中心点可以固定在某个位置。
图形位置调整算法如下:
图形绘制时设置如下变换矩阵:
原文出处:http://www.cnblogs.com/XieKe-cs01/archive/2006/03/09/346771.html
这段时间用GDI+开发一个适量图形绘制软件,类似于CoreDraw,用于教学之用。刚开始用GDI+提供的变换矩阵Matrix实现图形旋转变换,图形的平移和缩放则自己通过计算实现。后来使用发现通过计算修改了坐标值,图形进行多次缩放之后会变形,特别是缩到特小之后无法还原。所以想改用Matrix一起实现图形平称及缩放,原以为很简单,因为都有现成的接口,没想到实现起来还费了不少劲。
改用Matrix后,先对图形进行缩放后再旋转,一切正常,效果很好。可是先对图形进行旋转后再缩放,问题来了,图形在绘图页面上漂移。这就奇怪了,先后操作有什么不同吗?绘制的时候我可是严格按照先平移,再缩放,最后旋转的顺序完成的啊?
调试发现,先缩放再旋转图形旋转中心点不会改变(以左上角坐标作为缩放基点,以图形中心点做为旋转基点),但是旋转后再缩放,图形的旋转中心点在不停地改变,所以整个图形应用矩阵变换后位置就产生偏移。如下图:
图1 缩放旋转不同顺序区别
怎么办?想来想去,只能在缩放时把图形重新偏移回去,以使图形的中心点可以固定在某个位置。
图形位置调整算法如下:
图形绘制时设置如下变换矩阵:
相关文章推荐
- 使用GDI+变换矩阵实现图形的平移、缩放及旋转
- 使用GDI+变换矩阵实现图形的平移、缩放及旋转
- 14 WebGL 使用矩阵实现图形 旋转+平移并解释一下缩放
- ios-day18-08(使用CABasicAnimation实现对UIView的平移、旋转、缩放)
- iOS---transform类的使用,平移,缩放,旋转效果的实现
- Android中补间动画1----Animation的基本使用代码实现(平移,缩放,渐变,旋转)
- 可平移缩放旋转的ImageView的实现
- unity3d实现相机对场景物体的旋转、缩放、平移查看功能、近似于scene下查看场景的效果
- Android开发--图形图像与动画(二)--Animation实现图像的 渐变、缩放、位移、旋转
- 008-实现Unity3d中使用LeanTouch插件进行触屏控制(拖拽、移动、缩放旋转...)
- d3.js 实现svg 缩放 平移 旋转
- Android 利用Matrix实现图片随手指平移、旋转、缩放
- canvas之图形的变化(平移,缩放,旋转)
- Android开发--图形图像与动画(二)--Animation实现图像的 渐变、缩放、位移、旋转
- canvas之图形的变化(保存,平移,缩放,旋转)
- Unity3d中使用鼠标控制物体的平移旋转缩放
- Matlab 实现图像的平移,旋转,缩放
- IOS 改变图形上下文中的形状:平移、缩放、旋转
- 【Unity3D API的学习与使用】Unity实现GUI组件的位移、缩放和旋转
- OpenGL绘制简单场景,实现旋转缩放平移和灯光效果