如何确定一个点是在曲线外还是在曲线内

计算科学 计算几何
2021-12-01 21:00:36

让曲线C1参数化定义

x(t)=0.5cos(t)0.3cos(3t),y(t)=1.2+0.6sin(t)0.07sin(3t)+0.2sin(7t)

如何确定任意点P(x,y)是在这条曲线的内部还是外部?

此外,对于另一条曲线C2

x(t)=0.4+(0.19+0.07sin(5t))cos(t)y(t)=0.4+(0.19+0.07sin(5t))sin(t)
我尝试使用集合r=0.19+0.07sin(5t)t=tan1(y/x)

if (x0.4)2+(y0.4)2r2 我认为该点在内部,但这对于某些点是不正确的。

2个回答

有一个简单的测试来查看点(x,y)是否包含在曲线内。画一条从(x,y)到无穷远的射线,数一下它穿过曲线的次数;如果计数是奇数,则(x,y)在封闭区域内;否则,它在外面。

要将其转化为实用算法,您可以首先构建曲线的多边形近似,并查找来自(x,y)的光线相交的所有线段。该操作在多边形的段数上是线性的。获得所有候选线段后,您可以将它们用作牛顿搜索的基础,以找到更精确的射线与曲线的交点。

最后一步可能看起来过于谨慎,但如果该点比分段线性近似的精度更接近曲线,您很容易得到错误的答案。由于您有曲线的解析表达式,因此您还可以解析计算它的导数;如果光线真的很接近与曲线相切,那就麻烦了。

即使对于完全是多边形的曲线,奇偶规则也可能在有限精度算术中失败。计算几何很棘手,因为经常有奇怪的、不直观的边缘情况。

de Berg 和 Cheong的书是这方面的一个很好的参考。如果你想要一个 Python 库来进行实验,我对Shapely很幸运。

还有缠绕数测试,在 Daniel 链接到的同一篇 Wikipedia 文章中进行了描述。对于像您这样的简单曲线,这两种算法给出了相同的结果,但对于像这样的自相交曲线,它们可能会有所不同:

在此处输入图像描述

光线投射方法认为两个点都位于曲线之外。另一方面,的绕组数分别是,所以如果你想考虑像这样的点位于曲线内,你可以使用非零规则而不是奇偶规则。pq20p

当然,丹尼尔提到的关于充分抽样的警告适用于这两种方法。