微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

iphone – 如何使用缩放设置用户Quartz2D坐标系,避免模糊绘图?

这个话题被刮了一两次,但我仍然感到困惑.谷歌也不友好.

由于Quartz允许使用仿射变换的任意坐标系,我希望能够使用实际坐标绘制诸如平面图之类的东西,例如,脚.

所以基本上,为了一个例子,我想缩放视图,以便当我绘制一个10×10的矩形(例如一个10英寸的盒子)时,我得到一个60×60像素的矩形.

它的工作原理,除了我得到的矩形非常模糊.这里的另一个问题得到了解释原因的答案.但是,我不确定我理解为什么,而且,我不知道如何解决它.这是我的代码

我在awakeFromNib自定义视图方法中设置了我的坐标系:

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

这是我的绘制程序:

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

我得到的正方形缩放得很好,但完全模糊.使用linewidth无效:当linewidth设置得较小时,它会变亮,但不会更加清晰.

那么有没有办法设置一个视图来建立一个缩放的坐标系,以便我可以使用我的域坐标?或者我应该回去在绘图程序中实现缩放?

请注意,转换或轮换不会发生此问题.

谢谢

解决方法

the [stroked] rectangle I get is quite fuzzy.

通常,这是因为您在整数坐标上绘制了矩形,并且线宽为1.

在PostScript中(因此在其后代中:AppKit,PDF和Quartz),绘图单位认为点,1点正好是1/72英寸. Mac和iPhone目前*将每个这样的点视为1像素,无论屏幕的实际分辨率如何,因此,在实际意义上,点(认情况下,在Mac和iPhone上)等于像素.

在PostScript及其后代中,积分坐标在点之间运行.例如,0是左下角的左下角. 1,0是同一点的右下角(右下一个点的左下角).

笔划以您正在抚摸的路径为中心.因此,一半将在路径内,一半在外面.

在(概念上)72-dpi的Mac世界中,这两个事实相结合产生了一个问题.如果1 pt等于1像素,并且在两个像素之间应用1 pt笔划,则笔划的一半将击中每个像素.

石英,至少,将通过将当前颜色绘制到颜色的alpha的一半的两个像素来渲染.它通过概念笔划覆盖了多少像素来确定这一点;如果你使用1.5磅线宽,那么一半是0.75磅,这是每个1磅像素的四分之三,所以颜色将呈现0.75 alpha.当然,这可以得出一个自然的结论:如果你使用2磅的线宽,每个像素都被完全覆盖,那么alpha就是1.这就是为什么你可以用1-pt的笔画看到这个效果,而不是2节中风.

有几种解决方法

>半点翻译:正如它在盒子上所说的那样,你向右平移半个点,补偿前面提到的1-pt-cut-half-division.

这在简单的情况下有效,但是当你涉及除了全点翻译之外的任何其他坐标转换时,它就会消失.也就是说,你可以翻译30,20,它仍然可以工作,但是如果翻译33 / 3,25.252525 ……,或者如果你进行缩放或旋转,那么你的半点翻译将毫无用处.
>内部笔划:首先剪辑,然后将线宽加倍(因为你只画了一半),然后是笔画.

如果你有很多其他的绘图要做,这可能需要gstate杂耍,因为你不希望剪切路径影响你的其他绘图.
>外部笔划:基本上与内部笔划相同,只是在剪切之前反转路径.

如果您确定要中风的路径不会重叠,那么可以比内部笔划更好(更少gstate杂耍).另一方面,如果你还想填充路径,那么gstate杂耍会返回.

*这不会永远持续下去.一段时间以来苹果公司一直在暗示它们至少会改变Mac的绘图分辨率.这种变化的API基础现在几乎全部存在;这完全是苹果投掷开关的问题.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐