Получите только преобразование масштабирования из CGAffineTransform
Я нашел аналогичный вопрос о том, как получить только поворот, но поскольку я понимаю масштабирование и вращательную работу, отличную от матрицы преобразования.
Матрицы не являются моей силой, поэтому, если кто-нибудь подскажет мне, как получить только масштабирование из CGAffineTransform, я бы очень признателен.
кстати. Я попытался применить CGAffineTransform на CGSize, а затем получить высоту x width, чтобы увидеть, насколько она масштабируется, но высота x ширина имеет странные значения (в зависимости от вращения, найденного в CGAffineTransform, поэтому... hm это не работает)
Ответы
Ответ 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)
Так как аффинные преобразования реализуются простым трюком с линейными преобразованиями и так линейных преобразований не коммутативные, вы должны понять, как преобразования заказаны до фактической обработки как вытащить отдельные преобразования из.