Reputation: 663
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...
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;
}
Upvotes: 3
Views: 6090
Reputation: 385998
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;
}
Upvotes: 7