判断坐标是否在矩阵内

        public void AAA(string token)
        {
            double[][] Points = { new double[] {113.607903,34.803591},
                                  new double[] {113.607908,34.803354},
                                  new double[] {113.608977,34.803621},
                                  new double[] {113.608977,34.803384}
                                };
            bool isok = isinpolygon(new double[] { 113.60868, 34.803714 }, 4, Points);
            if (isok)
            {
                Context.Response.Write("在范围内");
            }
            else
            {
                Context.Response.Write("不在范围内");
            }
        }
        public double inf = 1e9;
        public double EXP = 1e-9;
        //叉乘 if >0 p1在p2的顺时针方向;$p1=array(1,0);
        public double multi(Double[] p1, Double[] p2, Double[] p0)
        {
            return (p1[0] - p0[0]) * (p2[1] - p0[1]) - (p1[1] - p0[1]) * (p2[0] - p0[0]);
        }
        //if叉乘为零说明共线,如果该点在以side为对角线的矩形中心说明p在side上;
        public bool isonline(Double[] p, Double[][] side)
        {
            return (Math.Abs(multi(p, side[0], side[1])) < EXP &&
            Math.Min(side[0][0], side[1][0]) <= p[0] && p[0] <= Math.Max(side[0][0], side[1][0]) &&
            p[1] >= Math.Min(side[0][1], side[1][1]) && p[1] <= Math.Max(side[0][1], side[1][1]));
        }
        //线段相交,跨立试验(叉积判断),快速排斥试验;
        public bool intersect(Double[][] l, Double[][] r)
        {
            return (Math.Max(l[0][0], l[1][0]) >= Math.Min(r[0][0], r[1][0])//快速排斥试验用来确定以两线段为对角线的矩形是否相交;
            && Math.Max(r[0][0], r[1][0]) >= Math.Min(l[0][0], l[1][0])
            && Math.Max(l[0][1], l[1][1]) >= Math.Min(r[0][1], r[1][1])
            && Math.Max(r[0][1], r[1][0]) >= Math.Min(l[0][1], l[1][1])
            && multi(r[0], l[1], l[0]) * multi(r[1], l[1], l[0]) <= 0
            && multi(l[0], r[1], r[0]) * multi(l[1], r[1], r[0]) <= 0
            );
        }
        public bool isinpolygon(Double[] p, int n, Double[][] points)
        {
            int count = 0;
            if (n == 1)
            {
                return Math.Abs(p[0] - points[0][0]) < EXP && Math.Abs(p[1] - points[0][1]) < EXP;
            }
            if (n == 2)
            {
                Double[][] side = new double[2][];
                side[0] = p;
                side[1][1] = p[1];
                return isonline(p, side);
            }
            Double[][] line = new Double[2][];
            line[0] = p;
            line[1] = new Double[2];
            line[1][1] = p[1];
            line[1][0] = -inf;
            for (int i = 0; i < n; i++)
            {
                Double[][] side = new Double[2][];
                side[0] = points[i];
                side[1] = points[(i + 1) % n];
                if (isonline(p, side)) return true;
                if (Math.Abs(side[0][1] - side[1][1]) < EXP) continue;
                if (isonline(side[0], line) && side[0][1] > side[1][1]) count++;
                else if (isonline(side[1], line) && side[1][1] > side[0][1]) { count++; }
                else if (intersect(line, side)) count++;
            }
            if (count % 2 == 0)
                return false;
            else
                return true; ;
        }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值