Question

I'm trying to convert an array of points using a CGAffineTransform. The scaling works perfectly, however the points are using the top left as (0,0) not the bottom left. like so...

Upside down graph

Normally I would simply use CGAffineTransformMakeScale(1,-1); but because I'm already performing a scale I can't add it to the existing transform.

Here's my current code

- (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;
}

No correct solution

OTHER TIPS

I'm assuming fromRect.origin is CGPointZero.

You need a compound transform that moves the origin to the lower left, flips the Y axis, and applies the scaling you want.

You can make a compound transform using the functions that modify a transform, like this:

- (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;
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top