How to set up a user Quartz2D coordinate system with scaling that avoids fuzzy drawing?

Posted by jdmuys on Stack Overflow See other posts from Stack Overflow or by jdmuys
Published on 2010-03-21T18:09:20Z Indexed on 2010/03/21 18:11 UTC
Read the original article Hit count: 477

This topic has been scratched once or twice, but I am still puzzled. And Google was not friendly either.

Since Quartz allows for arbitrary coordinate systems using affine transform, I want to be able to draw things such as floorplans using real-life coordinate, e.g. feet.

So basically, for the sake of an example, I want to scale the view so that when I draw a 10x10 rectangle (think a 1-inch box for example), I get a 60x60 pixels rectangle.

It works, except the rectangle I get is quite fuzzy. Another question here got an answer that explains why. However, I'm not sure I understood that reason why, and moreover, I don't know how to fix it. Here is my code:

I set my coordinate system in my awakeFromNib custom view method:

- (void) awakeFromNib {
    CGAffineTransform scale = CGAffineTransformMakeScale(6.0, 6.0);
    self.transform = scale;
}

And here is my draw routine:

- (void)drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGRect r = CGRectMake(10., 10., 11., 11.);
    CGFloat lineWidth = 1.0;
    CGContextStrokeRectWithWidth(context, r, lineWidth);
}

The square I get is scaled just fine, but totally fuzzy. Playing with lineWidth doesn't help: when lineWidth is set smaller, it gets lighter, but not crisper.

So is there a way to set up a view to have a scaled coordinate system, so that I can use my domain coordinates? Or should I go back and implementing scaling in my drawing routines?

Note that this issue doesn't occur for translation or rotation.

Thanks

© Stack Overflow or respective owner

Related posts about quartz-2d

Related posts about cocoa