IOS中CGAffineTransform的使用方法


常用:

#define M_E         2.71828182845904523536028747135266250   e
#define M_LOG2E     1.44269504088896340735992468100189214   log 2e
#define M_LOG10E    0.434294481903251827651128918916605082  log 10e
#define M_LN2       0.693147180559945309417232121458176568  log e2
#define M_LN10      2.30258509299404568401799145468436421   log e10
#define M_PI        3.14159265358979323846264338327950288   pi
#define M_PI_2      1.57079632679489661923132169163975144   pi/2
#define M_PI_4      0.785398163397448309615660845819875721  pi/4
#define M_1_PI      0.318309886183790671537767526745028724  1/pi
#define M_2_PI      0.636619772367581343075535053490057448  2/pi
#define M_2_SQRTPI  1.12837916709551257389615890312154517   2/sqrt(pi)
#define M_SQRT2     1.41421356237309504880168872420969808   sqrt(2)
#define M_SQRT1_2   0.707106781186547524400844362104849039  1/sqrt(2)



CoreGraphics 的 仿射变换 可以用于 平移、旋转、缩放变换路径 或者图形上下文。

   (1)平移变换将路径或图形上下文中的形状的当前位置平移到另一个相对位置。举例来说,如果你在(10,20)的位置处画一个点,对它应用(30,40)的平移变换,然后绘制它,这个点将被绘制在(40,60)的位置处。为了创建一个平移变换,使用CGAffineTransformMakeTranslation函数,它将返回一个CGAffineTransform类型的仿射变换,这个函数的两个参数指定x和y方向上以点为单位的平移量。我们还可以使用CGContextTranslateCTM过程对图形上下文应用变换。


 平移变换路径

01//平移变换
02 
03-(void)drawRect:(CGRect)rect
04{
05    CGMutablePathRef path = CGPathCreateMutable();
06    CGRect rectangle = CGRectMake(10.0f, 10.0f, 200.0f, 200.0f);
07     
08    CGAffineTransform transform = CGAffineTransformMakeTranslation(100.0f, 0.0f);
09 
10 
11    CGContextRef currentContext = UIGraphicsGetCurrentContext();
12    CGPathAddRect(path, &transform, rectangle);
13    CGContextAddPath(currentContext, path);
14    [[UIColor brownColor] setStroke];
15    [[UIColor colorWithRed:0.20f green:0.60f blue:0.80f alpha:1.0f] setFill];
16    CGContextSetLineWidth(currentContext, 5.0f);
17    CGContextDrawPath(currentContext, kCGPathFillStroke);
18    CGPathRelease(path);
19}

平移变换图形上下文

01-(void)drawRect:(CGRect)rect
02{
03    CGMutablePathRef path = CGPathCreateMutable();
04    CGRect rectangle = CGRectMake(10.0f, 10.0f, 200.0f, 300.0f);
05    CGPathAddRect(path, NULL, rectangle);
06     
07    CGContextRef currentContext = UIGraphicsGetCurrentContext();
08    CGContextSaveGState(currentContext);
09     
10    CGContextTranslateCTM(currentContext, 100.0f, 40.0f);
11 
12    CGContextAddPath(currentContext, path);
13    [[UIColor colorWithRed:0.20f green:0.6f blue:0.8f alpha:1.0f] setFill];
14    [[UIColor brownColor] setStroke];
15     
16    CGContextSetLineWidth(currentContext, 5.0f);
17    CGContextDrawPath(currentContext, kCGPathFillStroke);
18     
19    CGPathRelease(path);
20     
21    CGContextRestoreGState(currentContext);
22     
23     
24     
25}

    (2)缩放是另外一个你可以使用的变换。你可以很容易地让CoreGraphics 对形状进行缩放,例如一个圆形缩放到原来的100倍。要创建一个仿射缩放变换,使用CGAffineTransformMakeScale函数,它返回一个CGAffineTransform 类型的变换对象。如果你想直接对一个图形上下文使用缩放变换,使用CGContextScaleCTM过程来缩放当前变换矩阵。

 缩放路径

01-(void)drawRect:(CGRect)rect
02{
03    CGMutablePathRef path = CGPathCreateMutable();
04    CGRect rectangle = CGRectMake(10.0f, 10.0f, 200.0f, 200.0f);
05     
06 
07    CGAffineTransform transform = CGAffineTransformMakeScale(0.5f, 0.5f);
08 
09    CGContextRef currentContext = UIGraphicsGetCurrentContext();
10    CGPathAddRect(path, &transform, rectangle);
11    CGContextAddPath(currentContext, path);
12    [[UIColor brownColor] setStroke];
13    [[UIColor colorWithRed:0.20f green:0.60f blue:0.80f alpha:1.0f] setFill];
14    CGContextSetLineWidth(currentContext, 5.0f);
15    CGContextDrawPath(currentContext, kCGPathFillStroke);
16    CGPathRelease(path);
17}
  缩放图形上下文
01-(void)drawRect:(CGRect)rect
02{
03    CGMutablePathRef path = CGPathCreateMutable();
04    CGRect rectangle = CGRectMake(10.0f, 10.0f, 200.0f, 300.0f);
05    CGPathAddRect(path, NULL, rectangle);
06     
07    CGContextRef currentContext = UIGraphicsGetCurrentContext();
08    CGContextSaveGState(currentContext);
09     
10 
11    CGContextScaleCTM(currentContext, 0.5f, 0.5f);
12 
13    CGContextAddPath(currentContext, path);
14    [[UIColor colorWithRed:0.20f green:0.6f blue:0.8f alpha:1.0f] setFill];
15    [[UIColor brownColor] setStroke];
16     
17    CGContextSetLineWidth(currentContext, 5.0f);
18    CGContextDrawPath(currentContext, kCGPathFillStroke);
19     
20    CGPathRelease(path);
21     
22    CGContextRestoreGState(currentContext);
23     
24     
25     
26}

  (3)就像缩放和平移,你可以对绘制在路径上的形状和图形上下文应用旋转变换。你可以使用CGAffineTransformMakeRoation函数和一个旋转的弧度值来获取一个CGAffineTransform类型的变换.如果你想对整个图形上下文旋转指定角度,可以使用CGContextRotateCTM过程。

  旋转路径

01-(void)drawRect:(CGRect)rect
02{
03    CGMutablePathRef path = CGPathCreateMutable();
04    CGRect rectangle = CGRectMake(10.0f, 10.0f, 200.0f, 200.0f);
05     
06    CGAffineTransform transform = CGAffineTransformMakeRotation((45.0f * M_PI) / 180.0f);
07    CGContextRef currentContext = UIGraphicsGetCurrentContext();
08    CGPathAddRect(path, &transform, rectangle);
09    CGContextAddPath(currentContext, path);
10    [[UIColor brownColor] setStroke];
11    [[UIColor colorWithRed:0.20f green:0.60f blue:0.80f alpha:1.0f] setFill];
12    CGContextSetLineWidth(currentContext, 5.0f);
13    CGContextDrawPath(currentContext, kCGPathFillStroke);
14    CGPathRelease(path);
15}
  旋转图形上下文
01-(void)drawRect:(CGRect)rect
02{
03    CGMutablePathRef path = CGPathCreateMutable();
04    CGRect rectangle = CGRectMake(10.0f, 10.0f, 200.0f, 300.0f);
05    CGPathAddRect(path, NULL, rectangle);
06     
07    CGContextRef currentContext = UIGraphicsGetCurrentContext();
08    CGContextSaveGState(currentContext);
09    CGContextRotateCTM(currentContext, (45.0f * M_PI) / 180.0f);
10    CGContextAddPath(currentContext, path);
11    [[UIColor colorWithRed:0.20f green:0.6f blue:0.8f alpha:1.0f] setFill];
12    [[UIColor brownColor] setStroke];
13     
14    CGContextSetLineWidth(currentContext, 5.0f);
15    CGContextDrawPath(currentContext, kCGPathFillStroke);
16     
17    CGPathRelease(path);
18     
19    CGContextRestoreGState(currentContext);
20     
21     
22     
23}
    另外我们还可以组合变换效果,使用CGAffineTransformConcact函数组合两个变换效果,这个函数的两个参数都是类型为CGAffineTransform类型的变换。

  组合多个变换效果,同时进行平移和缩放

01-(void)drawRect:(CGRect)rect
02{
03    CGMutablePathRef path = CGPathCreateMutable();
04    CGRect rectangle = CGRectMake(10.0f, 10.0f, 200.0f, 200.0f);
05     
06    CGAffineTransform transform1 = CGAffineTransformMakeTranslation(100.0f, 0.0f);
07    CGAffineTransform transform2 = CGAffineTransformMakeScale(0.5f, 0.5f);
08    CGAffineTransform transform = CGAffineTransformConcat(transform1, transform2);
09    CGContextRef currentContext = UIGraphicsGetCurrentContext();
10    CGPathAddRect(path, &transform, rectangle);
11    CGContextAddPath(currentContext, path);
12    [[UIColor brownColor] setStroke];
13    [[UIColor colorWithRed:0.20f green:0.60f blue:0.80f alpha:1.0f] setFill];
14    CGContextSetLineWidth(currentContext, 5.0f);
15    CGContextDrawPath(currentContext, kCGPathFillStroke);
16    CGPathRelease(path);
17}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
import java.awt.*; import java.awt.event.*; import java.awt.geom.*; import java.awt.font.*; public class Clipping extends Canvas { public Clipping() { setBackground(Color.white); } public void paint(Graphics g) { Graphics2D g2; g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); int w = getSize().width; int h = getSize().height; FontRenderContext frc = g2.getFontRenderContext(); Font f = new Font("Helvetica",Font.BOLD,w/8); String s = new String("By"); TextLayout tl = new TextLayout(s, f, frc); float sw = (float) tl.getBounds().getWidth(); AffineTransform transform = new AffineTransform(); transform.setToTranslation(w/2-sw/2,h/2); Shape shape = tl.getOutline(transform); g2.setClip(shape); g2.setColor(Color.blue); g2.fill(shape.getBounds()); g2.setColor(Color.yellow); for (int j = shape.getBounds().y; j < shape.getBounds().y + shape.getBounds().height; j=j+3) { Line2D line = new Line2D.Float( 0.0f, (float) j, (float) w, (float) j); g2.draw(line); } } public static void main(String s[]) { WindowListener l = new WindowAdapter() { public void windowClosing(WindowEvent e) {System.exit(0);} public void windowClosed(WindowEvent e) {System.exit(0);} }; Frame f = new Frame("2D Text"); f.addWindowListener(l); f.add("Center", new Clipping()); f.pack(); f.setSize(new Dimension(400, 300)); f.show(); } } *********************************************

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值