转换轮换和翻译问题

时间:2013-05-17 07:51:52

标签: rotation translation cgaffinetransform

我有以下情况,我正在尝试制作照片编辑器,我需要对围绕视图中心的图像进行缩放,平移和旋转操作

问题是,如果我在90度翻译后应用翻译,则翻译为翻译顶部且翻译后锚点不是视图的中心

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    // ImageView
    v = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 768, 500)];
    [v setBackgroundColor:[UIColor redColor]];

    // ImageView's Image
    UIImage *img = [UIImage imageNamed:@"_my.jpg"];
    [v setImage:img];
    v.contentMode = UIViewContentModeScaleAspectFit;
    v.layer.anchorPoint = CGPointMake(0.5, 0.5);
    [self.view setBackgroundColor:[UIColor clearColor]];

    // UiView containing ImageView
    vc = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 768, 500)];
    [vc addSubview:v];
    [self.view addSubview:vc];
}

- (IBAction)Click:(id)sender {
    // Translate
    if ([sender tag] == 1) {
        CGAffineTransform t0 = v.transform;
        CGAffineTransform t1 = CGAffineTransformTranslate(t0, 10.0, 0.0);
        v.transform = t1;
    }
    // Rotate
    if ([sender tag] == 2) {
        CGAffineTransform t0 = v.transform;
        CGAffineTransform t1 = CGAffineTransformRotate(t0, DEGREES_TO_RADIANS(10));
        v.transform = t1;
    }    
}

有谁知道如何将视角作为定位点并在旋转后平移才能正常工作?

TX

1 个答案:

答案 0 :(得分:0)

原点转换

但是,特别是在2D中,您经常需要在转换中添加原点位移。这通常被添加到开始,也必须否定,所以:

//带原点的世界矩阵

-OriginTranslation * Scale * Rotation * PositionTranslation

同样的事情也可以用视图矩阵完成,但是你把它添加到最后,这次你不要否定它:

//查看带原点的矩阵

-PositionTranslation * -Rotation * Zoom * OriginTranslation

选择性原点的转换

在某些情况下,您希望拥有原点位移,但您希望它仅影响您的比例和旋转,而不是您的翻译。处理它的方法是在到达转换组件之前撤消原始转换。例如,使用世界矩阵:

我完全不记得转换如何应用于视图,其中一个应该是可行的。

//具有缩放和旋转原点的世界矩阵

-OriginTranslation * Scale * Rotation * OriginTranslation * PositionTranslation

视图矩阵:

//查看带原点的矩阵

-PositionTranslation * -OriginTranslation * -Rotation * Zoom * OriginTranslation

没有原点的转换示例,顺序:缩放*旋转*转换

enter image description here