ios - 想和大家请教一下CGAffineTransform里,矩阵相乘后得到的新坐标究竟是怎么出来的,什么含义
迷茫
迷茫 2017-04-17 17:35:08
0
2
349

最近在研究CGAffineTransform.
想先讲一下我对CGAffineTransform的理解.

struct CGAffineTransform
{
CGFloat a, b, c, d;
CGFloat tx, ty;
};

CGAffineTransform是二维的,可以理解为

其中,ad对应缩放,bc对应旋转,tx,ty对应位移

我看到大部分的教程说,公式可以总结为

x = ax+cy+tx
y = bx+dy+ty

具体的例如

移动:
CGAffineTransformMakeTranslation(CGFloat tx, CGFloat ty)

缩放:
CGAffineTransformMakeScale(CGFloat sx, CGFloat sy)

旋转:
CGAffineTransformMakeRotation(CGFloat angle)

现在有这样一段代码:

self.imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100,100, 200, 200)];
self.imageView.image = [UIImage imageNamed:@"123.jpg"];
[self.view addSubview:self.imageView];
NSLog(@"%@",NSStringFromCGRect(self.imageView.frame));


CGAffineTransform transform = CGAffineTransformIdentity;
transform = transform = CGAffineTransformMake(-0.5, 0, 0, 1, 0, 0);
self.imageView.layer.affineTransform = transform;

NSLog(@"%@",NSStringFromCGRect(self.imageView.frame));

通过代码可以得出 两次的log为

CALayerBaseDemo4[14986:1448501] {{100, 100}, {200, 200}}
2016-02-25 23:55:19.766 
CALayerBaseDemo4[14986:1448501] {{150, 100}, {100, 200}}

通过之前的公式

x = ax+cy+tx
y = bx+dy+ty

x = -0.5*100 + 0*100 + 0 x = -50
y = 0*100 + 1*100 + 0 y = 100

如果通过这么计算的话,应该是 {-50,100} 才对啊,问题是得到的结果是{150,100} 这事为什么呢?

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

membalas semua(2)
阿神

我猜原因可能有这些:

  • 文档里介绍 CGAffineTransform 原理时所使用的坐标系 +x 朝右,+y 朝上,而在实际开发中 iPhone 屏幕的坐标系是做了旋转的,是 +x 朝右,+y 朝下。

  • 对一个 View 做 transform 都是基于 View 自己的坐标系进行变换,那么就尤其需要搞清楚实际上相对其 SuperView 的坐标系的变换是不是如你设想的那样。

之前研究过 CGAffineTransform,印象里有这些需要注意的。希望对你有用。

迷茫

师兄,这个问题解决了嘛?跟着你的思路走,貌似是你这个结果。
补充内容:
刚刚我又去网上搜索一下transeform矩阵相关,依照师兄你的计算最后x' = - 0.5x, y' = y,并不能直接以结果来确定你所说的(-50,100),应该对比着来看,x' = -0.5x是否可以理解为:仿射过后的图像x值被缩小了0.5倍,y' = y理解为前后不变;再加上图形本身的锚点坐标限制,图形被压缩。与师兄你的log信息才能对的上。不知道是不是这样理解的

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!