确定2D点是否在四边形内

时间:2013-03-19 03:04:27

标签: javascript algorithm geometry

我正在开发一个JS程序,我需要确定点是否在坐标系的四个角内。

有人能指出我的答案吗?

我在看我所谓的凸四边形。也就是说,四个相当随机选择的角位置,所有角度都小于180°。

感谢。

3 个答案:

答案 0 :(得分:9)

有两种相对简单的方法。第一种方法是从点到“无限”(实际上,到多边形外的任何点)绘制光线,并计算光线相交多边形的边数。当且仅当计数为奇数时,该点在多边形内。

第二种方法是按顺序绕过多边形,对于每对顶点v i 和v i + 1 (如有必要,绕过第一个顶点) ),计算数量(x - x i )*(y i + 1 - y i ) - (x i + 1 - x i )*(y - y i )。如果这些数量都具有相同的符号,则该点位于多边形内。 (这些数量是向量的叉积的Z分量(v i + 1 - v i )和(p - v i 它们都具有相同符号的条件与p在每条边的同一侧(左侧或右侧)的条件相同。)

这两种方法都需要处理点恰好位于边缘或顶点上的情况。首先需要确定是否要将这些点计数在多边形内部。然后你需要相应地调整测试。请注意,轻微的数字舍入错误可能会给出错误的答案。这只是你必须要忍受的东西。

由于你有一个凸四边形,还有另一种方法。选择任意三个顶点并计算相对于由三个选定顶点形成的三角形的点和第四个顶点的barycentric coordinates。如果该点的重心坐标都是正的并且都小于第四个顶点的重心坐标,则该点在四边形内部。

P.S。刚刚找到一个很好的页面here列出了很多策略。其中一些非常有趣。

答案 1 :(得分:0)

您需要使用缠绕或光线跟踪方法。

使用绕线,您可以确定是否有任何点位于使用线段构建的任何形状内。

基本上,您将每个线段的叉积与点相乘,然后将所有结果相加。这就是我用它来确定一颗恒星是否在一个星座中的方式,给定了一组星座线。我可以看到还有其他方式..

http://en.wikipedia.org/wiki/Point_in_polygon

在一些地方必须有一些代码。

答案 2 :(得分:0)

更容易看出一个点是否位于三角形内。

任何四边形都可以分为两个三角形。

如果该点位于构成四边形的两个三角形中的任何一个中,则该点位于四边形内。