博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JS判断坐标点是否在给定的多边形内
阅读量:6073 次
发布时间:2019-06-20

本文共 2382 字,大约阅读时间需要 7 分钟。

hot3.png

(function (window) {        "use strict";        /**         * 判断给出的坐标点是否在多边形内         * */        function pointInPolygon(targetPoint, targetPoints) {            var leftPointCount = 0;            var rightPointCount = 0;//左右点的个数            var _points = [];            //第一步:取出所有的点,并计算交点坐标            for (var i = 0, _length = targetPoints.length - 1; i < _length; i++) {                var p1 = targetPoints[i], p2 = targetPoints[i + 1];//取出当前点和当前点的下一个点                var point = _calcCrossoverPoint(targetPoint, p1, p2);                //如果交点有效,则保存                if (point) {                    _points.push(point);                }            }//            第二步:计算给定的坐标点,左右两边的交点个数,奇数在范围内,偶数则不在            for (var j = 0, length = _points.length; j < length; j++) {                var x = _points[j];                if (x === targetPoint.x) {                    return false;//在线上,直接返回不在范围内                } else {                    (targetPoint.x !== x && targetPoint.x > x) ? leftPointCount++ : rightPointCount++;                }            }            //判断交点个数            return (leftPointCount % 2 !== 0 && rightPointCount % 2 !== 0);        }        /**         * 算交点坐标,坐标点在扫描行上或者上方时,交点无效         * @param targetPoint         * @param startPoint         * @param endPoint         * @returns {*}         */        function _calcCrossoverPoint(targetPoint, startPoint, endPoint) {            var crossoverPointX = startPoint.x - ((startPoint.y - targetPoint.y) * (startPoint.x - endPoint.x) / (startPoint.y - endPoint.y));//            判断交点坐标是否有效,即交点在startPoint,endPoint构成的线段范围内            if ((startPoint.y < targetPoint.y && endPoint.y >= targetPoint.y) || (endPoint.y < targetPoint.y && startPoint.y >= targetPoint.y)) {                if ((crossoverPointX >= startPoint.x && crossoverPointX <= endPoint.x) || (crossoverPointX <= startPoint.x && crossoverPointX >= endPoint.x)) {                    return crossoverPointX;                } else {                    return false;                }            } else {                return false;            }        }        var isIn = pointInPolygon({x: 4, y: 4}, [{x: 2, y: 1}, {x: 1, y: 3}, {x: 3, y: 5}, {x: 5, y: 4}, {            x: 4,            y: 1        }, {x: 3, y: 2}, {            x: 2,            y: 1        }]);        console.log(isIn);    })(window);

转载于:https://my.oschina.net/u/2320308/blog/649915

你可能感兴趣的文章
Session
查看>>
WPF 气泡尖角在左边、下面、右边、上面
查看>>
android中ADT和SDK的关系(转)
查看>>
查看sqlserver被锁的表以及如何解锁
查看>>
微软一站式示例代码库
查看>>
[Python] Unofficial Windows Binaries for Python Extension Packages
查看>>
MongoDB操作(.net)
查看>>
使用Json让Java和C#沟通的方法
查看>>
Java正則表達式入门
查看>>
php教程之php空白页的原因及解决方法
查看>>
VelocityTracker简单介绍
查看>>
ios开发中object-c中UTF-8 和 GBK 的 NSString 相互转化的方法
查看>>
Jump的计划
查看>>
SQL:with ties
查看>>
CSS3魔法堂:禁止用户改变textarea大小
查看>>
GDB调试精粹及使用实例
查看>>
logback 配置详解(一)
查看>>
php info
查看>>
FFMPEG视音频编解码零基础学习方法 【荐】
查看>>
參加《全流程全要素的研发项目管理》培训记录与心得
查看>>