在实现一个镂空的效果时,发下路径的方向,会影响最终实现的效果,所以进一步研究了一下。
当填充路径所包含的区域时,NSBezierPath 会通过缠绕规则来判断需要填充的区域。通过给定区域内的任意一点到路径外画一条射线,根据与路径的交叉数判断点是否在区域内。
缠绕规则:
- NSNonZeroWindingRule:非零缠绕。射线从左到右每交叉路径一次+1,从右到左每交叉一次-1。如果最终交叉数为0,则该点在路径之外;如果交叉数不为0,则在路径之内。默认缠绕规则。
- NSEvenOddWindingRule:奇偶缠绕。计算射线与路径的交叉总数,如果为偶数,则在路径之外;如果为奇数,则在路径之内,需要填充。
填充操作适用于开放式路径和闭合路径。开放式路径会从路径的最后一个点到第一个点创建一个隐式的线(不渲染),来闭合路径。
文档中描述是从第一个点到最后一个点,但是根据分析与文档上的图以及实验,图与结果相同,但是描述错误,下面会详细介绍。如果是我理解错误,恳请指出。
闭合路径
1. 非零缠绕:外边框和内边框同一方向
CGRect aRect = CGRectMake(100, 100, 200, 200);
UIBezierPath * aPath = [UIBezierPath bezierPathWithRect:aRect];
CGRect bRect = CGRectInset(aRect, 50, 50);
UIBezierPath * bPath = [UIBezierPath bezierPathWithRect:bRect];
[aPath appendPath:bPath];
CAShapeLa

本文深入探讨了图形渲染中的缠绕规则,包括NSBezierPath的非零缠绕(NSNonZeroWindingRule)和奇偶缠绕(NSEvenOddWindingRule)规则。通过闭合和开放式路径的例子,详细阐述了如何判断路径内的点并决定渲染区域。在非零缠绕规则下,路径交叉数的正负决定了点是否在路径内,而奇偶缠绕规则则关注交叉总数的奇偶性。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



