Подтвердить что ты не робот

Получите только преобразование масштабирования из CGAffineTransform

Я нашел аналогичный вопрос о том, как получить только поворот, но поскольку я понимаю масштабирование и вращательную работу, отличную от матрицы преобразования.

Матрицы не являются моей силой, поэтому, если кто-нибудь подскажет мне, как получить только масштабирование из CGAffineTransform, я бы очень признателен.

кстати. Я попытался применить CGAffineTransform на CGSize, а затем получить высоту x width, чтобы увидеть, насколько она масштабируется, но высота x ширина имеет странные значения (в зависимости от вращения, найденного в CGAffineTransform, поэтому... hm это не работает)

4b9b3361

Ответ 1

Предполагая, что преобразование является масштабированием с последующим вращением (возможно, с переводом там, но без перекоса), коэффициент горизонтальной шкалы sqrt(a^2+c^2), коэффициент вертикальной шкалы sqrt(b^2+d^2), а отношение горизонтальной масштабный коэффициент для коэффициента вертикальной шкалы должен быть a/d = -c/b, где a, b, c и d являются четырьмя из шести членов CGAffineTransform, per документация (tx и ty представляют только перевод, который не влияет на масштабные коэффициенты).

|  a  b 0 |
|  c  d 0 |
| tx ty 1 |

Ответ 2

- (CGFloat)xscale {
    CGAffineTransform t = self.transform;
    return sqrt(t.a * t.a + t.c * t.c);
}

- (CGFloat)yscale {
    CGAffineTransform t = self.transform;
    return sqrt(t.b * t.b + t.d * t.d);
}

Ответ 3

Это старый вопрос, но я все еще добавляю дополнительную информацию, если кто-то нуждается.

Для меня хороший ответ и пример кода для получения масштаба, поворота трансформации и для его воспроизведения из статьи:

http://www.informit.com/articles/article.aspx?p=1951182

Ответ 4

Я не знаком с CGAffineTransform или Objective-C (вы поймали меня с помощью математического тега). В общем, вам нужно отформатировать преобразования индивидуально. Например, если аффинное преобразование A выполняет только масштабирование, вращение и перевод (порядок масштабирования и поворота не важен в нижеприведенном методе, но перевод должен быть определенно последним):

Перевод: Применение A к вектору (0,0) вернет результат (tx, ty), где tx и ty - сдвиги соответственно в направлениях X и Y.

Масштабирование в X: Примените A к вектору (1, 0) и получите (sx0 + tx, sx1 + ty). Масштабирование в X будет sqrt (sx0 ^ 2 + sx1 ^ 2)

Масштабирование в Y: Примените A к вектору (0, 1) и получите (sy0 + tx, sy1 + ty). Масштабирование в Y будет sqrt (sy0 ^ 2 + sy1 ^ 2)

Так как аффинные преобразования реализуются простым трюком с линейными преобразованиями и так линейных преобразований не коммутативные, вы должны понять, как преобразования заказаны до фактической обработки как вытащить отдельные преобразования из.