【发布时间】:2016-04-20 06:30:49
【问题描述】:
我在 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的点不考虑在里面。算法有问题吗?任何帮助将不胜感激。
【问题讨论】:
-
你的多边形总是矩形吗?
-
不,可以是任何形状..
-
算法,我知道它适用于凸多边形,所以如果你有一些不是凸多边形,你必须把它分成几个凸多边形。然后对每个多边形的点进行排序并对其进行迭代。算法复杂度为 n*logn。这是否让您满意并且您想完整地描述它吗? (大约是 2D,而不是 3D)
-
如果你能稍微描述一下就好了,我会找到一种方法将多边形分割成几个多边形
-
好的,我会在几分钟内写出来作为答案
标签: javascript polygon