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

Я пытаюсь преобразовать массив точек, используя CGAffineTransform. Масштабирование работает отлично, однако точки используют верхний левый угол как (0,0), а не нижний левый. вот так...

Перевернутый график

Обычно я бы просто использовал CGAffineTransformMakeScale(1,-1);, но поскольку я уже выполняю масштабирование, я не могу добавить его к существующему преобразованию.

Вот мой текущий код

- (CGAffineTransform)transformFromValueToScreen
{
    CGRect fromRect = self.valueSpace;
    CGRect viewRect = self.screenSpace;

    CGSize scales = CGSizeMake(viewRect.size.width/fromRect.size.width,
                               viewRect.size.height/fromRect.size.height);

    CGAffineTransform transform = CGAffineTransformMakeScale(scales.width, 
                                                             scales.height);

    return transform;
}

person sobox studio    schedule 27.01.2014    source источник


Ответы (1)


Я предполагаю, что fromRect.origin это CGPointZero.

Вам нужно составное преобразование, которое перемещает начало координат в нижний левый угол, переворачивает ось Y и применяет желаемое масштабирование.

Вы можете сделать составное преобразование, используя функции, которые изменяют преобразование, например:

- (CGAffineTransform)transformFromValueToScreen {
    CGRect fromRect = self.valueSpace;
    CGRect viewRect = self.screenSpace;

    CGSize scales = CGSizeMake(viewRect.size.width/fromRect.size.width,
                               viewRect.size.height/fromRect.size.height);

    CGAffineTransform transform = CGAffineTransformIdentity;

    // Move origin from upper left to lower left.
    transform = CGAffineTransformTranslate(transform, 0, fromRect.size.height);

    // Flip the sign of the Y axis.
    transform = CGAffineTransformScale(transform, 1, -1);

    // Apply value-to-screen scaling.
    transform = CGAffineTransformScale(transform, scales.width, scales.height);

    return transform;
}
person rob mayoff    schedule 27.01.2014
comment
@soboxstudio Если вы считаете, что изменение кода улучшит чей-то ответ, оставьте комментарий, а не предлагайте редактирование. - person Adi Inbar; 28.01.2014
comment
Отлично, спасибо, меня все еще легко запутать в деликатном порядке преобразований. Также могу предложить небольшое изменение: fromRect.bounds.height должно быть viewRect.size.heigh - person sobox studio; 28.01.2014
comment
Да, оба «CGRects» имеют происхождение CGPointZero - person sobox studio; 28.01.2014
comment
@AdiInbar Могу ли я изменить ответ, так как я не хочу принимать ответ с ошибкой (пусть даже небольшой). Спасибо. - person sobox studio; 28.01.2014
comment
Вы уверены, что это не должно быть fromRect.size.height? Я думаю, это должно быть правильно. - person rob mayoff; 28.01.2014
comment
@soboxstudio Я понимаю, но я думаю, что это должен быть его выбор, следует ли изменить его ответ. - person Adi Inbar; 28.01.2014
comment
@robmayoff Я пробовал и то, и другое, и viewRectвыглядит правильно. fromRect ставит все преобразование на высокий уровень. Ваше здоровье - person sobox studio; 28.01.2014
comment
Также для справки; это для графической библиотеки, которую я сейчас пишу. github.com/BenjaminBriggs/BBGraphKit - person sobox studio; 28.01.2014