870920 Menu

AffineTransform(仿射变换)详解

前面的代码中已多次出现AffineTransform仿射变换,该类的作用是:配合其他类(比如Path、Graphics)完成图形、图像和文字的旋转、翻转、缩放、平移、剪切等二维变换处理。比如轨迹对象在渲染前设置缩放效果:

对Graphics要绘制的图像进行仿射变换(先平移,后应用另一个仿射变换对象的效果):

通常,在使用仿射变换的环境中,无需显式创建对象,可利用该类的静态属性AffineTransform::identity或其他静态函数直接获取该类的对象,而后串联调用各种效果函数。

Affinetransform类的重要成员函数:
 transformPoints () 变换1个、2个或3个二维坐标
 translated () 根据所给的参数返回一个新的变换
 rotated () 根据给出的参数返回一个旋转式变换
 scaled () 根据给出的参数返回一个缩放式变换
 sheared () 剪切式变换,基准点为(0,0)
 inverted () 翻转式变换
 followedBy () 关联另一个仿射变换
 isIdentity () 如果该变换没有任何改变则返回true
 isSingularity () 如果变换有所改变则返回true
 isOnlyTranslation () 如果仅进行了平移式变换 而没有缩放或旋转处理, 则返回true
 getTranslationX () 如果仅仅进行了平移式变换,则返回X的偏移量
 getTranslationY () 如果仅仅进行了平移式变换,则返回Y的偏移量
 getScaleFactor () 缩放变换后,返回近似的缩放比例

AffineTransform类的静态函数(这些函数的返回值全部是本类的栈对象):
 translation () 基于给出的参数返回一个平移式变换
 rotation () 基于给出的弧度返回一个旋转式变换, 基准点为(0, 0)
 scale () 基于给出的参数返回一个缩放式变换
 shear () 基于给出的参数返回一个剪切式变换, 基准点为(0, 0)
 verticalFlip () 基于给定的高度返回一个垂直式翻转
 fromTargetPoints () 返回的变换可将3个指定的点转换到3个目标点

扩展阅读:

Component组件类及其所有派生类(包括按钮、视图、文本框、菜单等UI控件)均可通过setTransform (仿射变幻对象)方法实现旋转、缩放、平移等效果,调用此函数后,无需显式repaint()即可应用给出的仿射变换。该函数内部自动触发重绘)。

为了方便使用,可在要使用仿射变换的类中private一个const函数,使之返回一个可控制和可变的仿射变幻对象(比如平移或缩放的参数基于本类中的其它可变数据)。返回的对象既可以作为组件类setTransform()的参数,又可作为Graphics类的某些绘制函数的参数。作为绘制函数的参数时,可在其他函数中实时改变仿射变换对象所需的各种数据,并且不停地触发重绘,从而达到图形、图像和文字的动态变幻效果。

点线面、图形、图像、文字、甚至组件自身巧妙应用仿射变换,在开发仿真音频插件、DSP实时示波、虚拟现实、3D动态建模等“高精尖”程序时,使用的非常普遍。

上例中,rotation()旋转函数的参数为float类型的弧度值。由弧度和角度的换算公式可知,一个组件或图形如需旋转一个角度n(假设n为float类型),这么写即可:

n可为任意值,不仅仅限于-360到360,也可写为:

注:用JUCE类库编码时:
 圆周12点方向的角度为0°,6点方向为±180°
 顺时针旋转则角度增加,3点钟方向为90°,相当于图形右转了90°
 逆时针旋转则角度减少,9点钟方向为-90°,相当于图像左转了90°
 ±180°的n倍(n为奇数)相当于上下翻转。n为偶数则相当于原地转了n / 2圈

常用角度的弧度值及编程代码:(略)