Winding Rules 缠绕规则

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在实现一个镂空的效果时,发下路径的方向,会影响最终实现的效果,所以进一步研究了一下。

当填充路径所包含的区域时,NSBezierPath 会通过缠绕规则来判断需要填充的区域。通过给定区域内的任意一点到路径外画一条射线,根据与路径的交叉数判断点是否在区域内。

缠绕规则:

  • NSNonZeroWindingRule:非零缠绕。射线从左到右每交叉路径一次+1,从右到左每交叉一次-1。如果最终交叉数为0,则该点在路径之外;如果交叉数不为0,则在路径之内。默认缠绕规则。
  • NSEvenOddWindingRule:奇偶缠绕。计算射线与路径的交叉总数,如果为偶数,则在路径之外;如果为奇数,则在路径之内,需要填充。

填充操作适用于开放式路径和闭合路径。开放式路径会从路径的最后一个点到第一个点创建一个隐式的线(不渲染),来闭合路径。

文档中描述是从第一个点到最后一个点,但是根据分析与文档上的图以及实验,图与结果相同,但是描述错误,下面会详细介绍。如果是我理解错误,恳请指出。

本文demo

闭合路径

1. 非零缠绕:外边框和内边框同一方向

    CGRect aRect = CGRectMake(100, 100, 200, 200);
    UIBezierPath * aPath = [UIBezierPath bezier
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值