#define M_E2.71828182845904523536028747135266250e
#define M_LOG2E1.44269504088896340735992468100189214log 2e
#define M_LOG10E0.434294481903251827651128918916605082log 10e
#define M_LN20.693147180559945309417232121458176568log e2
#define M_LN102.30258509299404568401799145468436421log e10
#define M_PI3.14159265358979323846264338327950288pi
#define M_PI_21.57079632679489661923132169163975144pi/2
#define M_PI_40.785398163397448309615660845819875721pi/4
#define M_1_PI0.3183098861837906715377675267450287241/pi
#define M_2_PI0.6366197723675813430755350534900574482/pi
#define M_2_SQRTPI1.128379167095512573896158903121545172/sqrt(pi)
#define M_SQRT21.41421356237309504880168872420969808sqrt(2)

#define M_SQRT1_20.7071067811865475244008443621048490391/sqrt(2)


Quartz提供的3大功能
移动,旋转,缩放

演示如下,首先加载一张图片
void CGContextDrawImage (    CGContextRef c,    CGRect rect,    CGImageRef image );

CoreAnimation-CGAffineTransform
移动函数
CGContextTranslateCTM (myContext, 100, 50);



旋转函数
include <math.h> static inline double radians (double degrees) {return degrees * M_PI/180;}
CGContextRotateCTM (myContext, radians(–45.));



缩放
CGContextScaleCTM (myContext, .5, .75);



翻转, 两种转换合成后的效果,先把图片移动到右上角,然后旋转180度
CGContextTranslateCTM (myContext, w,h); CGContextRotateCTM (myContext, radians(-180.));


组合几个动作
CGContextTranslateCTM (myContext, w/4, 0); CGContextScaleCTM (myContext, .25,  .5); CGContextRotateCTM (myContext, radians ( 22.));

CoreAnimation-CGAffineTransform


CGContextRotateCTM (myContext, radians ( 22.)); CGContextScaleCTM (myContext, .25,  .5);
CGContextTranslateCTM (myContext, w/4, 0);



上面是通过直接修改当前的ctm实现3大效果,下面是通过创建Affine Transforms,然后连接ctm实现同样的3种效果
这样做的好处是可以重用这个Affine Transforms
应用Affine Transforms 到ctm的函数
void CGContextConcatCTM (    CGContextRef c,    CGAffineTransform transform );


Creating Affine Transforms
移动效果
CGAffineTransform CGAffineTransformMakeTranslation (    CGFloat tx,    CGFloat ty );
CGAffineTransform CGAffineTransformTranslate (    CGAffineTransform t,    CGFloat tx,    CGFloat ty );


旋转效果
CGAffineTransform CGAffineTransformMakeRotation (    CGFloat angle );



CGAffineTransform CGAffineTransformRotate (    CGAffineTransform t,    CGFloat angle );

缩放效果
CGAffineTransform CGAffineTransformMakeScale (    CGFloat sx,    CGFloat sy );

CGAffineTransform CGAffineTransformScale (    CGAffineTransform t,    CGFloat sx,    CGFloat sy );

反转效果
CGAffineTransform CGAffineTransformInvert (    CGAffineTransform t );

只对局部产生效果
CGRect CGRectApplyAffineTransform (    CGRect rect,    CGAffineTransform t );

判断两个AffineTrans是否相等
bool CGAffineTransformEqualToTransform (    CGAffineTransform t1,    CGAffineTransform t2 );



获得Affine Transform
CGAffineTransform CGContextGetUserSpaceToDeviceSpaceTransform (    CGContextRef c );

下面的函数只起到查看的效果,比如看一下这个用户空间的点,转换到设备空间去坐标是多少
CGPoint CGContextConvertPointToDeviceSpace (    CGContextRef c,    CGPoint point );

CGPoint CGContextConvertPointToUserSpace (    CGContextRef c,    CGPoint point );

CGSize CGContextConvertSizeToDeviceSpace (    CGContextRef c,    CGSize size );

CGSize CGContextConvertSizeToUserSpace (    CGContextRef c,    CGSize size );

CGRect CGContextConvertRectToDeviceSpace (    CGContextRef c,    CGRect rect );

CGRect CGContextConvertRectToUserSpace (    CGContextRef c,    CGRect rect );


CTM真正的数学行为
这个转换矩阵其实是一个 3x3的 举证
如下图

CoreAnimation-CGAffineTransform
下面举例说明几个转换运算的数学实现
x y 是原先点的坐标
下面是从用户坐标转换到设备坐标的计算公式
CoreAnimation-CGAffineTransform
CoreAnimation-CGAffineTransform
下面是一个identity matrix,就是输入什么坐标,出来什么坐标,没有转换
CoreAnimation-CGAffineTransform
最终的计算结果是 x=x,y=y,
CoreAnimation-CGAffineTransform
可以用函数判断这个矩阵是不是一个 identity matrix
bool CGAffineTransformIsIdentity (    CGAffineTransform t );


移动矩阵

CoreAnimation-CGAffineTransform

缩放矩阵
CoreAnimation-CGAffineTransform
CoreAnimation-CGAffineTransform
旋转矩阵
CoreAnimation-CGAffineTransform
CoreAnimation-CGAffineTransform
旋转加移动矩阵
CoreAnimation-CGAffineTransform
CoreAnimation-CGAffineTransform
参考:http://developer.apple.com/iphone/library/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_affine/dq_affine.html#//apple_ref/doc/uid/TP30001066-CH204-SW1


相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-01-09
  • 2021-06-02
  • 2021-07-17
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案