指向多边形内部的javascript
Point inside a polygon javascript
我在javascript中工作,发现如果我的点在多边形内。我使用光线投射算法来比较点是否在多边形内。
算法在某些情况下非常有效。但在某些情况下,即使点都位于多边形内部,它也会显示点在外部。
https://www.dropbox.com/s/rpxqnw9re3q6vsi/Screen%20Shot.png?dl=0
标记为A1的区域是父多边形,A2和A3位于父多边形内部。下面是我用来检查点是否在内部的函数
function isPointInside(point, vs)
{
// ray-casting algorithm based on
var x = point[0], y = point[1];
var inside = false;
for (var i = 0, j = vs.length - 1; i < vs.length; j = i++)
{
var xi = vs[i][0], yi = vs[i][1];
var xj = vs[j][0], yj = vs[j][1];
var intersect = ((yi > y) != (yj > y))&& (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
if (intersect) inside = !inside;
}
return inside;
};
以下是父多边形和子多边形的点阵列
A1 Array
0[0, 0] (2)
1[6096000, 0] (2)
2[6096000, 0] (2)
3[6096000, 6096000] (2)
4[6096000, 6096000] (2)
5[0, 6096000] (2)
6[0, 6096000] (2)
7[0, 0] (2)
8[0, 0] (2)
9[0, 0] (2)
A2 Array (10)
0[0, 0] (2)
1[0, 3048000] (2)
2[0, 3048000] (2)
3[1524000, 3048000] (2)
4[1524000, 3048000] (2)
5[1524000, 0] (2)
6[1524000, 0] (2)
7[0, 0] (2)
8[0, 0] (2)
9[0, 0] (2)
A3 Array (10)
0[4572000, 0] (2)
1[4572000, 6096000] (2)
2[4572000, 6096000] (2)
3[6096000, 6096000] (2)
4[6096000, 6096000] (2)
5[6096000, 0] (2)
6[6096000, 0] (2)
7[4572000, 0] (2)
8[4572000, 0] (2)
9[4572000, 0] (2)
为什么A3的分数没有被考虑在内。算法有什么问题吗?任何帮助都将不胜感激。
让我们从几个实用程序函数开始。
第一个是面积(点,点,点)。它把3点作为论据(顺序非常重要)。第一个点和第二个点形成一个向量,如果第三个点在该向量的左侧,函数返回正值,如果第3个点在右侧,则返回负值,最后如果第3点位于该向量上,则返回0。
function area(p1 , p2, p3) {
return (p2.x - p1.x) * (p3.y - p1.y) - (p2.y - p1.y) * (p3.x - p1.x);
};
下一个实用函数是sortCMP(点,点),它在对每个多边形点进行排序时用作比较器。
function sortCMP(p1, p2) {
var result_area = area(target, p1 ,p2);
if(result_area == 0.0) {
return (sqrtDist(target, p1) - sqrtDist(target, p2) > 0.0)? 1 : -1;
}
return (result_area > 0.0)? -1 : 1;
};
让我们考虑您的多边形包含从P1到PN的N个点,它们存储在名为points的数组中。在前面的函数(sortCMP)中有一个变量TARGET,它应该是从P1到PN的所有点中X和Y坐标最低的点。
下一个函数是sqrdDist,它实际上返回两个点之间的距离
function sqrtDist(p1, p2) {
var dx = p1.x - p2.x;
var dy = p1.y - p2.y;
return dx * dx + dy * dy;
};
现在让我们回到数组名称POINTS,它包含多边形中的所有点。我们已经找到了一个X和Y坐标最低的(目标变量)。现在我们必须将它移动到数组中的第一个元素,然后对整个数组进行排序,但从element WITH INDEX 1开始。
数组排序后,我们只需对其进行迭代,并检查面积(Pi,Pi+1,T)是否始终返回正值(如果您想放置在多边形本身上,也可以为0)。如果某个区域函数返回负值,则点T始终是多边形。点T是您正在测试的点,如果它在多边形内。
正如我在评论中所说的,为了工作,你的多边形应该是凸多边形。这可以在先前算法的最后一步中进行检查。因此,当您对所有多边形的点进行排序时,您可以检查区域(Pi,Pi+1,Pi+2)是否总是为所有多边形点返回正值(或0)。如果它在某个地方返回负值,这将意味着你的多边形不是凸的。当它返回负值时,这也意味着索引为i+1的点是必须分割多边形的点。要了解更多细节,你可能需要在谷歌上搜索,因为我现在记不清了。
希望这能对你有所帮助。如果您有任何进一步的问题,请随时询问,我将在当天尽力回答您:)
- Javascript内部HTML动画
- 正在保存JavaScript内部回调函数中的值
- 从内部函数javascript内部分配外部函数的对象
- 从Javascript内部调用Javascript
- 在循环 javascript 内部创建一个数组
- 有没有一种方法可以判断图像src是否在javascript内部返回null
- 实现JavaScript内部方法的源代码
- 在javascript内部呈现HTML时包含外部CSS
- 对象引用如何在 javascript 内部工作
- parentNode在Javascript内部闭包中丢失了?铬错误
- 为什么我只能运行 1 个 JavaScript 内部函数
- 对象 javascript 内部的 for 循环
- JavaScript 内部的 AJAX 内容,使用 jQuery 自引用更多 AJAX 内容
- Object JavaScript内部的数组
- Javascript:内部的三元运算符“;如果“;条件
- 如何定义需要从obj内部和外部访问的javascript内部方法
- 跨域获取iframe javascript内部的iframe属性
- javascript内部的push方法.每个循环只返回一个数组
- JavaScript内部开关
- 为什么Javascript内部/外部文件中的错误也会停止下面的代码