错误检测到多边形中的点
Point in Polygon falsely detected
>由此导出:如何处理对角线堆叠的圆形图像背景元素悬停?
我制作了图像映射区域并针对我的情况对其进行了转换,但是,现在多边形命中检测中的点存在问题。
似乎只有右下象限总是正确的,但是,只有在环外看 - 内部检测可能仍然不正确。环外的其他象限偶尔会报告阳性命中,而这应该是假的。
小提琴:http://jsfiddle.net/psycketom/9J4dx/1/
红线是从数据映射生成的多边形绘制的。
蓝线表示我们当前正在检查的多边形。
多边形函数中的点来自: https://github.com/substack/point-in-polygon
var pointInPolygon = function(point, vs)
{
// ray-casting algorithm based on
// http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
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;
};
我似乎不明白这里有什么问题。
您的mapToPolygon
函数不会将解析的点从字符串转换为数字。 因此,pointInPolygon
函数最终会比较坐标的字符串,而不是实际坐标。 在小提琴的第 31 行使用parseInt
可以解决问题。
创建一个屏幕外画布并使用上下文的 .isPointInPath(x, y) 函数。
遍历所有多边形(在您的示例中,您将反向循环遍历它们,因为您的最后一个面最小。最小的将是最高水平/最大 z 指数)。
当你被命中(isPointInPath返回true)停止。
像...
var offcanvas = document.createElement("canvas");
...
var x = e.pageX - $ages.offset().left;
var y = e.pageY - $ages.offset().top;
revlayers.each(function() {
var $elm = $(this);
var poly = $elm.data("polygon");
var ctx = offcanvas.getContext("2d");
if(poly.length > 0) {
ctx.beginPath();
ctx.moveTo(poly[0][0], poly[0][1]);
for(var i=1; i<poly.length; i++) {
ctx.lineTo(poly[i][0], poly[i][1]);
}
if(ctx.isPointInPath(x, y)) {
hit.text($elm.attr("href"));
return false; // end the .each() loop
}
}
})
相关文章:
- 如何检测是否有溢出
- 如何检测用于WebGL的专用或集成显卡
- 防止Alt+Shift默认操作或检测多种操作系统语言的Javascript
- 如何在使用selectBoxIt JQuery插件时检测选项更改
- 如何使用密码检测网络中的状态连接
- 使用JavaScript检测Flash
- 在不阻止默认行为的情况下检测IE10中的缩放
- 检测个位数整数时正在转换毫秒
- 检测电话窃听,即:<a href="电话:xxx">在UIWebview上
- 动态插入的表:JQuery未检测到最后一行
- 检测页面上某个元素中选择(突出显示)或单击的内容
- jQuery检测浏览器是否支持Zoom
- 错误检测到多边形中的点
- 检测谷歌地图 v3 多边形上的鼠标事件的 shiftKey
- 如何使用传单检测多边形边缘的点击
- 谷歌地图多边形自相交检测
- 画布中的多边形边缘处理和检测
- JavaScript多边形碰撞检测
- Javascript碰撞检测之间的圆和多边形
- 检测多边形是否在半径内或半径外被点击