推断点击地区算法

上篇文章处理了四边形带扭转角度题目,消耗一天时候想到的处理算法。然则仅仅局限于四边形。
本来大神早就写好了算法,能够处理n多边形点击地区推断。
预用此算法,首先要保证多边形第一个点的x轴为最小值,也就是说先要给多边形各个点坐标做一个排序,找到x最小的点,放到第一个,其他点顺次扭转。

扭转要领:

function sort(ele) {
    var min = 0,
        arr = [],
        len = ele.length;
    for(var n = 0; n < len; n++){
        if(ele[n][0] < ele[min][0]){
            min = n
        }
    }
    if(min != 0){
        for(var x = min; x < ele.length; x++){
            arr.push(ele[x]);
        }
        for(var y = 0; y < min; y++){
            arr.push(ele[y]);
        }
        return arr
    }
    return ele;
}
var bbox = [[4],[1],[2],[3]];
sort(bbox)//[[1],[2],[3],[4]]

推断点击地区是不是在多边形范围内:

navi_utils.pointInPolygon = function (pos, polygon) {
    var inside = false;
    var polygonSize = polygon.length;
    var val1, val2;
    for(var i = 0; i < polygonSize; i++){
        var p1 = polygon[(i +  polygonSize)%polygonSize];
        var p2 = polygon[(i + 1 + polygonSize)%polygonSize];
        if(pos[1] < p2[1]){
            if(pos[1] >= p1[1]){
                val1 = (pos[1] - p1[1]) * (p2[0] - p1[0]);
                val2 = (pos[0] - p1[0]) * (p2[1] - p1[1]);
                if(val1 > val2){
                    inside = ! inside;
                }
            }
        }else if( pos[1] < p1[1]){
            val1 = (pos[1] - p1[1]) * (p2[0] - p1[0]);
            val2 = (pos[0] - p1[0]) * (p2[1] - p1[1]);
            if(val1 < val2){
                inside = ! inside;
            }
        }
    }
    return inside;
};
    原文作者:大象
    原文地址: https://segmentfault.com/a/1190000018695663
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞