- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在 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/
我已经实现了 Bentley-Ottmann-algorithm检测多边形-多边形交叉点。这通常非常有效:由于多边形不自相交,因此两个多边形的线段并集中的任何线段相交表明两个多边形相交。 但是如果我看
我在 Silverlight 中有一个多边形(棋盘游戏的十六进制),例如; public class GridHex : IGridShape { ..... public IList
我创建了一个简单的 DirectX 应用程序来渲染一个顶点场。顶点呈现如下(如果从顶部查看): |\|\|\|\| |\|\|\|\| 每个三角形都是这样渲染的: 1 |\ 2 3 这应该意味着多边形
我的代码的某些部分here : var stage = new Kinetic.Stage({ container: "canvas", width: 300,
我正在尝试从 map 数据构造导航网格物体。步骤之一涉及将二进制图像(其中0表示占用空间,1表示自由空间)转换成平面直线图。 我正在尝试找到一种可靠的方法。我目前的想法是使用Canny边缘检测器,然后
我的任务是编写 MATLAB 代码来生成一个由 4 部分组成的 Logo ,如屏幕截图所示。左上角应为黑色,右下角应为白色。另一个程序应随机选择两种颜色。 我采取了以下方法: clear all cl
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
如何向 google.maps.Rectangle 和 google.maps.Polygon 添加标题? title 属性在 RectangleOptions 中不可用.我试过了,但没用(对于 go
我有一个表,用于将表上的段存储为多边形。然后我想获取所有被另一个多边形接触的线段,例如正方形或圆形。图片上:http://img.acianetmedia.com/GJ3 我将灰色小框表示为段和 bi
我正在我的网站上使用 CSS 来制作形状。它在 chrome 中运行良好,但在 mozilla、internet explorer 中打开时,它无法运行。 有人知道怎么解决吗? 这是 fiddle h
我使用 DrawingManager 在 Google map 上绘制圆形和多边形。我尝试使用下面的代码删除圆形/多边形。 selectedShape.setMap(null); 这里selected
我看到了很多如何检测碰撞的教程,但没有看到如何解决它。我正在制作一个自上而下的游戏,玩家具有圆形碰撞形状,而墙壁是各种多边形。 我正在使用 slick2d。我应该做的是,如果玩家与角落碰撞,我会按法线
我对 tkinter 比较陌生,我正在制作一个只使用正方形的游戏。我正在抄写的书只显示三角形。这是代码: # The tkinter launcher (Already complete) from
我在 OpenCV/Python 中工作,我遇到了这个问题。我已经使用 cv2.minAreaRect() 来获取围绕一组点的边界框。是否有任何其他函数/通用算法可以给我内接多边形(点集)的最大矩形?
如果给定一组线段 S ,我们能否设计一种算法来测试集合 S 中的线段是否可以形成多边形,我对它们是否相交多边形不感兴趣,我只想知道我可以测试什么标准, 任何建议 最佳答案 构建一个图形数据结构,其中节
如何从多个地理位置(经度、纬度值)创建多边形地理围栏。此外,如何在 Android 上跟踪用户进入此地理围栏区域或从该区域退出。 最佳答案 地理围栏只是一组形成多边形的纬度/经度点。获得纬度/经度点列
我想要一个 complex image like this在我的申请中。我想让用户点击复杂的多边形(在这种情况下是有边界的国家/地区)并突出显示他们点击的多边形。我有我需要用于该状态的图像。 我怎样才
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
我想在 python tkinter 中移动对象,特别是多边形。问题出在 is_click 函数中。我似乎无法弄清楚如何确定我是否单击了该对象。代码还没有 100% 完成,移动仍然需要完成,但我现在需
我有一个大多边形,我想找到与该多边形相交的要素,但由于多边形太大,我遇到超时异常。 我试图研究 JTS 方法,但不知道如何使用它。 final List coordinates = List.of(n
我是一名优秀的程序员,十分优秀!