В этом примере ниже, почему первая матрица равна третьему, а не вторую?

let t1 = CGAffineTransform(scaleX: 2, y: 2)
    .concatenating(CGAffineTransform(translationX: 50, y: 50))

let t2 = CGAffineTransform(scaleX: 2, y: 2).translatedBy(x: 50, y: 50)

let t3 = CGAffineTransform(translationX: 50, y: 50).scaledBy(x: 2, y: 2)
5
Dannie P 15 Мар 2018 в 02:11

1 ответ

Лучший ответ

Чтобы избежать путаницы с именами, я переименовал ваши переменные с tN на rN:

let r1 = CGAffineTransform(scaleX: 2, y: 2)
    .concatenating(CGAffineTransform(translationX: 50, y: 50))

let r2 = CGAffineTransform(scaleX: 2, y: 2).translatedBy(x: 50, y: 50)

let r3 = CGAffineTransform(translationX: 50, y: 50).scaledBy(x: 2, y: 2)

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

Как вы можете видеть в документации для concatenating:

Новая аффинная матрица преобразования. То есть t '= t1 * t2.

В вашем примере кода для переменной r1 это scale * translate.

Эта часть кажется достаточно ясной.

Что касается функций translatedBy и scaledBy, вам нужно посмотреть файл заголовка Objective-C для соответствующих функций CGAffineTransformTranslate и CGAffineTransformScale.

Для CGAffineTransformTranslate Вы видите комментарий:

Переведите t на (tx, ty) и верните результат: t '= [1 0 0 1 tx ty] * t

И для CGAffineTransformScale вы видите:

Масштабируйте t на (sx, sy) и возвращайте результат: t '= [sx 0 0 sy 0 0] * t

Эта информация говорит нам, что let r = t.translatedBy(t2) эквивалентна t' = t2 * t. Конечно, scaledBy и rotatedBy похожи.

Это означает, что эта строка в вашем коде:

let r3 = CGAffineTransform(translationX: 50, y: 50).scaledBy(x: 2, y: 2)

Такой же как:

let r3 = CGAffineTransform(scaleX: 2, y: 2).concatenating(CGAffineTransform(translationX: 50, y: 50))

И нет:

let r3 = CGAffineTransform(translationX: 50, y: 50).concatenating(CGAffineTransform(scaleX: 2, y: 2))

Вот почему в вашем образце кода r1 равен r3. Чтение тех 2-го двух линий, таких как английский, приводит к идее, что матрицы объединяются в обратном порядке.

3
rmaddy 15 Мар 2018 в 03:54