CGAffineTransform из двух строк, каждая из которых представлена ​​парой CGPoints.

Вы, наверное, понимаете, к чему я клоню, но есть ли простой способ сгенерировать CGAffineTransform из двух строк, каждая из которых представлена ​​парой CGPoints:

A[(a1x,a1y), (a2x,a2y)],
B[(b1x,b1y), (b2x,b2y)]

Результирующий CGAffineTransform при применении к строке A, конечно же, создаст строку B. Потенциально это может включать перемещение, масштабирование и поворот.

Конечно, я бы надеялся, что смогу написать это сам после того, как освежу некоторые триггеры, но мне было интересно, есть ли уже что-нибудь для этого?

Примечание: я не прошу вас написать это для меня — я просто не хочу пропустить трюк с Core Graphics!


person teabot    schedule 24.06.2009    source источник


Ответы (1)


Да, но есть как минимум четыре решения: два перевода и две шкалы (по одной на операцию и направление). Это не считая преобразований, которые одновременно преобразуют и масштабируют.

«Математика, стоящая за матрицами», из Руководства по программированию Quartz 2D — хороший обзор того, как работает каждая операция; из этого должно быть достаточно просто инвертировать его и придумать матрицу для желаемой операции и направления.

Конечно, я бы надеялся, что смогу написать это сам после того, как освежу некоторые триггеры…

Вам это не понадобится, кроме вращения.

person Peter Hosey    schedule 24.06.2009
comment
Спасибо за ссылки. Однако я думаю, что мой вопрос был недостаточно ясен, поэтому я пересмотрел его. Каждая пара точек представляет собой линию, поэтому преобразование между ними может включать поворот. - person teabot; 24.06.2009
comment
О, я вижу. Да, это кажется возможным. Масштабировать легко: разделите длину B на длину A. Вращение: возьмите угол каждой линии, затем вычтите один угол из другого. Перевод: Возьмите центральные точки линий и вычтите одну из другой. Самым сложным будет собрать их все вместе в матрице в правильном порядке. Думаю, сначала масштабируйте. - person Peter Hosey; 24.06.2009