我有一个由多条Bezier曲线和直线段组成的闭合路径。如何判断鼠标指针的当前位置是在路径的内部还是外部?
鼠标离开区域的示例:
鼠标进入区域示例:
发布于 2011-06-23 02:34:13
首先,您应该检查您正在使用的图形库是否已经提供了这种命中测试。
如果必须自己编码,则完全精确的答案需要求解二次或三次方程(取决于Bezier曲线的次数)以确定与这些路径的交点。似乎有一篇关于exactly this problem的论文。
然而,我认为构建路径的线性近似(即密集地评估路径),然后使用标准point-in-polygon test会更明智。这可以精确到您选择的任何公差(例如,一个像素)。
发布于 2011-06-23 03:32:39
如果区域相对较小,则可以从鼠标位置开始运行填充。如果填充超出了边界框(可以预先计算),那么它就在区域之外。
请参阅:http://en.wikipedia.org/wiki/Flood_fill
发布于 2013-04-02 03:05:41
若要测试点是在bezier路径内还是在bezier路径外,请从该点开始沿任意方向绘制一条线,并计算该线与路径相交的次数。如果数字是奇数,那么你就在里面,如果是偶数,那么你就在外面。
因此,内部测试可以重新表示为交集测试。可以通过几种方式处理交叉点。一种相对简单的方法是使用deCasteljau算法将bezier面片近似为直线段,从而将bezier-线相交测试简化为一系列线-线相交测试。
请注意,您可以在计算中采用几条捷径。例如,如果要绘制的线完全位于给定bezier面片控制点的边界框之外,则可以假设它不会穿过面片。使用deCasteljau递归分割曲线时,可以利用此特定快捷方式丢弃不与直线段相交的曲线分割部分。
https://stackoverflow.com/questions/6444602
复制相似问题