判断一个点是否在一个区域中

 最近开发geofence中涉及到比较一个点在一个区域中的情景,
所以写了一个向量算法:
public double Angle(Model.LatLng cen, Model.LatLng first, Model.LatLng second)
        {
            double dx1, dx2, dy1, dy2;
            double angle;
            dx1 = first.Lat - cen.Lat;
            dy1 = first.Lng - cen.Lng;
            dx2 = second.Lat - cen.Lat;
            dy2 = second.Lng - cen.Lng;
            double c = (double)Math.Sqrt(dx1 * dx1 + dy1 * dy1) * (double)Math.Sqrt(dx2 * dx2 + dy2 * dy2);
            if (c == 0) return -1;
            angle = ((double)Math.Acos((dx1 * dx2 + dy1 * dy2) / c) * 180) / Math.PI;
            return angle;
        }

#region 取点比较
                int Pcount = list.Count - 1;
                for (int i = 0; i < Pcount; i++)
                {
                    Model.LatLng P0 = new Model.LatLng();
                    Model.LatLng P1 = new Model.LatLng();
                    Model.LatLng P2 = new Model.LatLng();
                    Model.LatLng Pdy = new Model.LatLng();
                    Pdy.Lat = model_dynamic.Lat;
                    Pdy.Lng = model_dynamic.Lng;
                    //
                    int j = i + 1;
                    if (Pcount <= j)
                    {
                        P0 = list[i];
                        P1 = list[i + 1];
                        P2 = list[0];
                    }
                    else
                    {
                        P0 = list[i];
                        P1 = list[i + 1];
                        P2 = list[i + 2];
                    }
                    double geo_angle = Angle(P1, P0, P2);
                    double dynamic_angle = Angle(P1, P0, Pdy);
                    if (geo_angle >= dynamic_angle)
                    {
                        inout = 0;
                    }
                    else
                    {
                        inout = 1;
                    }
                    if (inout == 1)
                    {
                        break;
                    }
                }
                #endregion

以上是核心代码。
如果有什么不明白的也可以邮件给我!
posted @ 2011-02-27 18:14  yuqicook  阅读(974)  评论(0编辑  收藏  举报