gpt4 book ai didi

javascript - 多边形内的点javascript

转载 作者:行者123 更新时间:2023-11-28 06:07:09 26 4
gpt4 key购买 nike

我正在 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 个点位于右侧,则返回负值,最后,如果第 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(Point, Point),它在对每个多边形点进行排序时用作比较器。

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,它实际上返回 2 点之间的距离

function sqrtDist(p1, p2) {
var dx = p1.x - p2.x;
var dy = p1.y - p2.y;
return dx * dx + dy * dy;
};

现在让我们回到数组名称 POINTS,其中包含多边形中的所有点。我们已经找到了 X 和 Y 坐标(目标变量)最低的一个。现在我们必须将其移动到数组中的第一个元素,然后对整个数组进行排序,但从索引 1 的元素开始。

数组排序后,我们只需迭代它并检查面积(Pi,Pi+1,T)始终返回正值(如果您想放置在多边形本身上,则也返回 0)。如果某处面积函数返回负值,则点 T 始终是您的多边形。点 T 是您要测试的点是否在多边形内部。

正如我在评论中所说,为了使其正常工作,您的多边形应该是凸多边形。这可以在先前算法的最后一步中进行检查。因此,当您对所有多边形的点进行排序后,您可以检查area(Pi, Pi+1, Pi+2)是否始终为所有多边形的点返回正值(或0)。如果它在某个地方返回负值,则意味着您的多边形不是凸的。当它返回负值时,这也意味着索引为 i+1 的点是您必须分割多边形的点。有关更多详细信息,您可能需要在谷歌中搜索,因为我现在不记得了。

希望这对您有一点帮助。如果您还有任何其他问题,请随时提问,我会尽力在白天回答您:)

关于javascript - 多边形内的点javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36735542/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com