Получите просто вращение от CGAffineTransform

Поскольку другие обратились к первой части Вашего вопроса соответственно, я попытаюсь заняться второй частью, т.е. "автоматически использует StringBuilder вместо этого".

существует несколько серьезных оснований для того, чтобы не сделать то, что Вы предлагаете, но самый большой фактор на практике вероятен, что выполнения оптимизатора после фактического исходного кода были переварены & забытый о. Оптимизаторы обычно воздействуют или на сгенерированный код байта (или на блок, три адресных кода, машинный код, и т.д.), или на абстрактных синтаксических деревьях, которые следуют из парсинга кода. Оптимизаторы обычно не знают ничего из библиотек времени выполнения (или никакие библиотеки вообще), и вместо этого работают на уровне инструкции (то есть, низкоуровневый поток управления и выделение регистра).

112-секундный, поскольку библиотеки развиваются (особенно в Java) намного быстрее, чем языки, не отставая от них и зная то, что удерживает от использования то, какой и что другой компонент библиотеки мог бы лучше подходить для задачи, будет гераклова задача. Также, вероятно, невозможный, поскольку этот предложенный оптимизатор должен был бы точно понять и Ваше намерение и намерение каждого доступного компонента библиотеки, и так или иначе найти отображение между ними.

Наконец, как другие сказали (я думаю), писатель компилятора/оптимизатора может обоснованно предположить, что программист, пишущий входной код, не является глупым. Это была бы пустая трата времени для посвящения значительного усилия глупым особым случаям как они, когда другой, более общая оптимизация имеется в большом количестве. Кроме того, как другие также упомянули, на вид глупый код может иметь фактическую цель (спин-блокировка, активное ожидание до урожая системного уровня, и т.д.), и компилятор должен соблюдать то, что программист просит (если это синтаксически и семантически допустимо).

6
задан Pieter Jongsma 1 October 2009 в 14:23
поделиться

3 ответа

Возьмите asin () или acos () аффинного члена b или c.

struct CGAffineTransform {
   CGFloat a;
   CGFloat b;
   CGFloat c;
   CGFloat d;
   CGFloat tx;
   CGFloat ty;
};
5
ответ дан 9 December 2019 в 22:36
поделиться

Вы можете попробовать использовать функции acos () и asin (), чтобы отменить то, что делает CGAffineTransformMakeRotation . Однако, поскольку у вас есть умноженная матрица преобразования масштаба, это может быть немного сложно.

0
ответ дан 9 December 2019 в 22:36
поделиться

В прошлом я использовал класс XAffineTransform из набора инструментов GeoTools для извлечения поворота из аффинной матрицы. Он работает даже при применении масштабирования и сдвига.

Это библиотека Java, но у вас должна быть возможность легко преобразовать ее в (Objective-) C. Вы можете посмотреть исходный код XAffineTransform здесь . (Метод называется getRotation.) И вы можете прочитать API здесь .

Это суть метода:

final double scaleX = getScaleX0(tr);
final double scaleY = getScaleY0(tr) * flip;
return Math.atan2(tr.getShearY()/scaleY - tr.getShearX()/scaleX,
                  tr.getScaleY()/scaleY + tr.getScaleX()/scaleX);

Вам также потребуется реализовать методы getScale / getShear. Совсем не сложно. (По большей части вы можете просто скопировать код Java как есть.)

0
ответ дан 9 December 2019 в 22:36
поделиться