首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何判断鼠标指针是否在由Bezier曲线和直线定义的路径内?

如何判断鼠标指针是否在由Bezier曲线和直线定义的路径内?
EN

Stack Overflow用户
提问于 2011-06-23 02:20:48
回答 3查看 2.1K关注 0票数 3

我有一个由多条Bezier曲线和直线段组成的闭合路径。如何判断鼠标指针的当前位置是在路径的内部还是外部?

鼠标离开区域的示例:

鼠标进入区域示例:

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-23 02:34:13

首先,您应该检查您正在使用的图形库是否已经提供了这种命中测试。

如果必须自己编码,则完全精确的答案需要求解二次或三次方程(取决于Bezier曲线的次数)以确定与这些路径的交点。似乎有一篇关于exactly this problem的论文。

然而,我认为构建路径的线性近似(即密集地评估路径),然后使用标准point-in-polygon test会更明智。这可以精确到您选择的任何公差(例如,一个像素)。

票数 7
EN

Stack Overflow用户

发布于 2011-06-23 03:32:39

如果区域相对较小,则可以从鼠标位置开始运行填充。如果填充超出了边界框(可以预先计算),那么它就在区域之外。

请参阅:http://en.wikipedia.org/wiki/Flood_fill

票数 1
EN

Stack Overflow用户

发布于 2013-04-02 03:05:41

若要测试点是在bezier路径内还是在bezier路径外,请从该点开始沿任意方向绘制一条线,并计算该线与路径相交的次数。如果数字是奇数,那么你就在里面,如果是偶数,那么你就在外面。

因此,内部测试可以重新表示为交集测试。可以通过几种方式处理交叉点。一种相对简单的方法是使用deCasteljau算法将bezier面片近似为直线段,从而将bezier-线相交测试简化为一系列线-线相交测试。

请注意,您可以在计算中采用几条捷径。例如,如果要绘制的线完全位于给定bezier面片控制点的边界框之外,则可以假设它不会穿过面片。使用deCasteljau递归分割曲线时,可以利用此特定快捷方式丢弃不与直线段相交的曲线分割部分。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6444602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档