Javascript 确定二维点是否在四边形内

Javascript 确定二维点是否在四边形内,javascript,algorithm,geometry,Javascript,Algorithm,Geometry,我正在开发一个JS程序,我需要确定点是否在坐标系的四个角以内 有人能告诉我答案的方向吗 我在看我认为是所谓的凸四边形。也就是说,四个随机选择的角位置,所有角度都小于180° 谢谢。您需要使用缠绕或光线跟踪方法 使用“缠绕”,可以确定任何点是否位于使用线段构建的任何形状内 基本上,你可以取每条线段与点的叉积,然后将所有结果相加。这就是我判断一颗恒星是否在一个星座中的方法,给定一组星座线。我可以看出还有其他的方法 在一些地方一定有这样的代码 有两种相对简单的方法。第一种方法是从点到“无穷大”(实际

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

有人能告诉我答案的方向吗

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


谢谢。

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

使用“缠绕”,可以确定任何点是否位于使用线段构建的任何形状内

基本上,你可以取每条线段与点的叉积,然后将所有结果相加。这就是我判断一颗恒星是否在一个星座中的方法,给定一组星座线。我可以看出还有其他的方法


在一些地方一定有这样的代码

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

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

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

既然你有一个凸四边形,还有另一种方法。拾取任意三个顶点并计算该点和第四个顶点相对于三个选定顶点形成的三角形的距离。如果该点的重心坐标均为正且均小于第四个顶点的重心坐标,则该点位于四边形内


p.S.刚刚发现了一个不错的页面,列出了很多策略。其中一些非常有趣。

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

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


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

我试过这里使用的inpolygon方法,但不起作用。它给了我“无法调用未定义的'inpolygon'方法”
if(Math.inpolygon(5,6[1,22,13,1],[1,1,21,31]){return“yesp”}
为什么不能只比较坐标?你能详细描述一下这个问题吗?要点是什么?角?我有大量随机生成的四边形。然后我需要检查一些(也是随机生成的)点是否“可用”或已被四边形占用。我不太明白如何在不涉及大量(不必要)计算的情况下像第一种方法那样绘制光线,但我想我会让它与第二种方法一起工作。谢谢@Henrik-只需在X轴上拾取一个点,该点比四个顶点的最大X坐标更远。然后,光线可以从测试点到达X轴上的点。(当然,你也可以很好地使用Y轴。)只要记住,你需要测试线段的交点,而不是直线的交点。@Henrik-如果你使用第二种方法,请注意公式中有一个输入错误。现在修好了。(我在几个地方使用了0而不是I作为下标。)第二种方法是计算点是否位于四边形边形成的四个半空间的交点。这是一个有点复杂的公式:)@AndrewMao-Nah。我是一名程序员。对于程序员来说,你只会胡乱编写代码,而不会解释事情