首页 理论教育 曲线内部检测技巧

曲线内部检测技巧

时间:2023-06-23 理论教育 版权反馈
【摘要】:由于贝塞尔曲线大部分情况下是不规则曲线,所以需要依赖UIBezierPath的containsPoint()方法来检测某个点是否在这条曲线内部。在View Controller中将这个BezeirPathDetectView的实例添加到view上,代码如下:动手写15.3.4 UIBezierPathDetectPractse->ViewController.swift运行模拟器,效果如图15.3.2所示:这里声明了两条贝塞尔曲线,除了绘制路径处理在x方向上有所偏移以外,其他是一致的。图15.3.2不同填充方式的贝塞尔曲线我们可以发现,右侧使用奇偶规则的五角星内部的五边形被判定在贝塞尔曲线外,因为其穿越曲线的交叉点为偶数个。

曲线内部检测技巧

由于贝塞尔曲线大部分情况下是不规则曲线,所以需要依赖UIBezierPath的containsPoint()方法来检测某个点是否在这条曲线内部。这个方法只对闭合曲线有效,如果不是闭合曲线就会返回false。

判断一个点是否在曲线内与是否在填充路径内其实是一个问题。这里有一个属性usesEvenOdd FillRule来决定使用哪个判定规则,如果为true,则使用奇偶规则(even-odd)填充路径;如果为false,则使用非零规则(non-zero)填充它。这两个规则都是用于确定当前路径的哪些区域需要被填充的算法。首先从给定区域内的点到路径边界外的任何一点绘制射线,然后计算与路径(包括隐式路径)交叉的点总数和每条线交叉的方向,因此有如下解释:

对于奇偶规则,如果路径交叉的点总数是奇数,则该点被认为是在路径内并且相应的区域被填充;如果交叉的数量是偶数,则认为该点在路径之外并且该区域未被填充。

对于非零规则,从左到右路径的交叉计为+1,并且从右到左路径的交叉计为-1。如果交叉的总和非零,则认为该点在路径内并且填充相应的区域;如果总和为0,则该点位于路径之外且该区域未填充。所谓从左到右,就是指路径穿越射线时的方向是逆时针。同样地,从右到左就是顺时针。非零规则就是路径穿越射线的顺时针与逆时针数是一样时,则该点位于路径外侧。下面通过一个例子来展示两者的区别,创建一个新的CocoaTouch类,命名为“BezierPathDetectView”,继承自UIView类,代码如下:

动手写15.3.3 UIBezierPathDetectPractse->BezierPathDetectView.swift

(www.xing528.com)

这里声明了两条贝塞尔曲线,除了绘制路径处理在x方向上有所偏移以外,其他是一致的。两者的唯一区别是使用填充的规则不一样。在View Controller中将这个BezeirPathDetectView的实例添加到view上,代码如下:

动手写15.3.4 UIBezierPathDetectPractse->ViewController.swift运行模拟器,效果如图15.3.2所示:

图15.3.2 不同填充方式的贝塞尔曲线

我们可以发现,右侧使用奇偶规则的五角星内部的五边形被判定在贝塞尔曲线外,因为其穿越曲线的交叉点为偶数个。而左侧使用非零规则的五角星内部区域都是填充区域,原因是这个五角星的每条曲线都是顺时针的,所以射线一旦与五角星产生交叉都会是顺时针交叉,只有一个方向的交叉,所以都是非零的。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈