Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何正确计算两个CGAffineTransform矩阵之间的增量(差)?_Objective C_Ios_Matrix_Uigesturerecognizer_Cgaffinetransform - Fatal编程技术网

Objective c 如何正确计算两个CGAffineTransform矩阵之间的增量(差)?

Objective c 如何正确计算两个CGAffineTransform矩阵之间的增量(差)?,objective-c,ios,matrix,uigesturerecognizer,cgaffinetransform,Objective C,Ios,Matrix,Uigesturerecognizer,Cgaffinetransform,我一直在玩斯坦福大学讲座/WWDC视频,它向你展示了如何创建一个同时收缩/缩放的手势。它返回一个CGAffineTransform,然后应用于UIView 这一切都很好,但我试图使它更流畅,并增加一些减速的代码。我试图通过在每个UIgestureRecognitizerStateChanged调用中存储转换矩阵来实现这一点,然后当我收到UIgestureRecognitizerStateEnded时,我存储最后更改和结束的矩阵之间的增量: - (void)handleTransform:(Tra

我一直在玩斯坦福大学讲座/WWDC视频,它向你展示了如何创建一个同时收缩/缩放的手势。它返回一个
CGAffineTransform
,然后应用于UIView

这一切都很好,但我试图使它更流畅,并增加一些减速的代码。我试图通过在每个
UIgestureRecognitizerStateChanged
调用中存储转换矩阵来实现这一点,然后当我收到
UIgestureRecognitizerStateEnded
时,我存储最后更改和结束的矩阵之间的增量:

- (void)handleTransform:(TransformGestureRecognizer *)transformRecognizer
{
    CGAffineTransform transform = transformRecognizer.transform;

    // cancel any previous animation updates
    [UIView cancelPreviousPerformRequestsWithTarget:self selector:@selector(decelerateView:) object:transformRecognizer.view];

    if(transformRecognizer.state == UIGestureRecognizerStateBegan)
    {
        transform = CGAffineTransformConcat(transformRecognizer.view.transform, transform);
        transformRecognizer.transform = transform;
    }
    else if(transformRecognizer.state == UIGestureRecognizerStateChanged)
    {
        changingTransform = transform;
    }
    else if(transformRecognizer.state == UIGestureRecognizerStateEnded)
    {
        // get transform difference
        releaseTransformDiff.a = (transform.a - changingTransform.a);
        releaseTransformDiff.b = (transform.b - changingTransform.b);
        releaseTransformDiff.c = (transform.c - changingTransform.c);
        releaseTransformDiff.d = (transform.d - changingTransform.d);
        releaseTransformDiff.tx = (transform.tx - changingTransform.tx);
        releaseTransformDiff.ty = (transform.ty - changingTransform.ty);

        // start updating deceleration animation
        [self performSelector:@selector(decelerateView:) withObject:transformRecognizer.view afterDelay:1.0/60.0];
    }

    transformRecognizer.view.transform = transform;
}
然后,我有一个
减速视图:
方法来设置减速动画:

#define DECELERATION_RATE 0.9

- (void)decelerateView:(UIView *)view
{
    releaseTransformDiff.a = releaseTransformDiff.a * DECELERATION_RATE;
    releaseTransformDiff.b = releaseTransformDiff.b * DECELERATION_RATE;
    releaseTransformDiff.c = releaseTransformDiff.c * DECELERATION_RATE;
    releaseTransformDiff.d = releaseTransformDiff.d * DECELERATION_RATE;
    releaseTransformDiff.tx = releaseTransformDiff.tx * DECELERATION_RATE;
    releaseTransformDiff.ty = releaseTransformDiff.ty * DECELERATION_RATE;

    view.transform = CGAffineTransformMake(view.transform.a + releaseTransformDiff.a, 
                                           view.transform.b + releaseTransformDiff.b, 
                                           view.transform.c + releaseTransformDiff.c, 
                                           view.transform.d + releaseTransformDiff.d, 
                                           view.transform.tx + releaseTransformDiff.tx,
                                           view.transform.ty + releaseTransformDiff.ty);
    [self performSelector:@selector(decelerateView:) withObject:view afterDelay:1.0/60.0];
}

这有时是有效的,但有时它会突然停止,而且几乎不会减慢我所做的任何旋转。。。我想我没有正确计算这两个矩阵的增量。正确的方法是什么?

CGAffineTransformation是表示3 x 3矩阵的简化数据结构:

|a  b  0|
|c  d  0|
|tx ty 1|
点通过将A 3 x 1矩阵乘以上述矩阵进行变换

                      |a  b  0|
[x' y' 1] = [x y 1] X |c  d  0|
                      |tx ty 1|
要创建缩放仿射变换,请将a设置为缩放x轴的因子,将d设置为缩放y轴的因子。要创建平移仿射变换,请将tx设置为沿x轴移动的值,将ty设置为沿y轴移动的值

这个问题中使用的技术适用于仿射变换,这些变换仅仅是缩放或平移变换(或这两种变换的组合)。这是因为受影响的四个值确实是线性独立变化的

为角度a集a到cos a、b到sin a、c到-sin a、d到cos a创建旋转仿射变换。由于sin和cos不是线性函数,因此问题中提出的增量变化将无法正常工作。更复杂的是,两个变换的组合是表示这些变换的两个矩阵的乘法。在涉及旋转的情况下,生成的矩阵不会与将导致稍微不同的变换的矩阵线性不同

构建增量转换的方法是将输入更改为转换构建函数调用,而不是直接使用生成的矩阵

这正是我所担心的:)不幸的是,转换代码非常复杂,需要做一些相当精锐的三角类型的数学。。。如果可以的话,可能需要一段时间才能把它拆开!也许我应该把上面的代码贴出来?谢谢