Exemple #1
0
 public Playground()
 {
     InitializeComponent();
     Contracts.IObservable observable            = new Observable();
     Contracts.IObserver <MessageModel> observer = new BPoint();
     observable.AddObserver(observer);
 }
 /// <summary>
 /// 路线起点选中
 /// </summary>
 /// <param name="bPoint"></param>
 void Origin_StepEndPointSelected(BPoint bPoint)
 {
     if (StepEndPointSelected != null)
     {
         StepEndPointSelected(bPoint);
     }
 }
        public override void Draw()
        {
            foreach (var penLine in _penLines)
            {
                foreach (var point in penLine.GetPoints())
                {
                    var pixelSize = penLine.Size;
                    var pointX    = point.X;
                    var pointY    = point.Y;

                    for (int i = pointX - pixelSize; i < pointX + pixelSize; i++)
                    {
                        for (int j = pointY - pixelSize; j < pointY + pixelSize; j++)
                        {
                            if (CanvasValidator.IsCursorOutsideCanvas(new Point(i, j)))
                            {
                                continue;
                            }

                            var newPoint = new BPoint(i, j, point.Color);

                            _bitmap.SetPixel(newPoint);
                        }
                    }
                }
            }
        }
Exemple #4
0
        /// <summary>
        /// 射线法判断点在任意多边形内
        /// </summary>
        /// <param name="p"></param>
        /// <param name="polygon"></param>
        /// <returns></returns>
        public static bool IsPointInsidePolygon(BPoint <double> p, ref BPoint <double>[] polygon)
        {
            int cross_count = 0;

            for (int i = 0; i < polygon.Length; i++)
            {
                BPoint <double> p1 = polygon[i];
                BPoint <double> p2 = polygon[(i + 1) % polygon.Length];

                //线段水平
                if (p1.Y == p2.Y)
                {
                    continue;
                }

                //射线在线段外
                if (p.Y >= Math.Max(p1.Y, p2.Y) || p.Y <= Math.Min(p1.Y, p2.Y))
                {
                    continue;
                }

                double dy = (p2.X - p1.X) / (p2.Y - p1.Y);
                double x  = (p.Y - p1.Y) * (p2.X - p1.X) / (p2.Y - p1.Y) + p1.X;;

                if (x > p.X)
                {
                    cross_count++;
                }
            }

            return(cross_count % 2 == 1);
        }
 /// <summary>
 /// 路线终点选中
 /// </summary>
 /// <param name="bPoint"></param>
 void Destination_StepEndPointSelected(BPoint bPoint)
 {
     if (StepEndPointSelected != null)
     {
         StepEndPointSelected(bPoint);
     }
 }
Exemple #6
0
        //向量法判断点在凸多边形内
        static public bool Compl_inside_convex(BPoint <double> p, ref BPoint <double>[] con, int n)
        {
            if (n < 3)
            {
                return(false);
            }
            if (cross(con[0], p, con[1]) >= 0)
            {
                return(false);
            }
            if (cross(con[0], p, con[n - 1]) <= 0)
            {
                return(false);
            }

            int i = 2, j = n - 1;
            int line = -1;

            while (i <= j)
            {
                int mid = (i + j) >> 1;
                if (cross(con[0], p, con[mid]) >= 0)
                {
                    line = mid;
                    j    = mid - 1;
                }
                else
                {
                    i = mid + 1;
                }
            }
            return(cross(con[line - 1], p, con[line]) < 0);
        }
Exemple #7
0
 /// <summary>
 /// 路线起点终点选中
 /// </summary>
 /// <param name="bPoint"></param>
 void item_StepEndPointSelected(BPoint bPoint)
 {
     //
     if (BMapControl != null)
     {
         BMapControl.SelectBPoint(bPoint);
     }
 }
Exemple #8
0
        /// <summary>
        /// On SaveDrawing perform color fill algorithm
        /// </summary>
        /// <param name="mousePositions"></param>
        public override void SaveDrawing(HashSet <Point> mousePositions)
        {
            if (mousePositions.Count == 0)
            {
                return;
            }

            var startPoint = BPoint.ConvertPointToIBPoint(mousePositions.ElementAt(0));

            startPoint.Color = _bitmap.GetPixel(startPoint.X, startPoint.Y);

            _colorFillingAlgorithm.Fill(startPoint, _bitmap.GetPixel(startPoint.X, startPoint.Y));
        }
        public override void PreviewDrawing(HashSet <Point> mousePositions)
        {
            if (mousePositions.Count == 1)
            {
                _lastPreviewCirclePoints = new HashSet <IBPoint>();
            }

            foreach (var point in _lastPreviewCirclePoints)
            {
                _bitmap.SetPixel(point.X, point.Y, point.Color);
            }

            _lastPreviewCirclePoints = new HashSet <IBPoint>();

            var startPoint = mousePositions.ElementAt(0);
            var endPoint   = mousePositions.ElementAt(mousePositions.Count - 1);

            var center = new Point((startPoint.X + endPoint.X) / 2, (startPoint.Y + endPoint.Y) / 2);
            var radius = (int)CustomPoint.GetDistance(startPoint.X, startPoint.Y, center.X, center.Y);

            var points = _circleAlgorithm.GetCirclePoints(BPoint.ConvertPointToIBPoint(center), radius);

            var finalPoints = new List <IBPoint>();

            var pixelSize  = Setting.SelectedPixelSize;
            var pixelColor = Setting.SelectedColor;

            foreach (var point in points)
            {
                for (int i = point.X - pixelSize; i < point.X + pixelSize; i++)
                {
                    for (int j = point.Y - pixelSize; j < point.Y + pixelSize; j++)
                    {
                        if (CanvasValidator.IsCursorOutsideCanvas(new Point(i, j)))
                        {
                            continue;
                        }

                        var newPoint = new BPoint(i, j, pixelColor);

                        var currentPixel = _bitmap.GetPixel(i, j);

                        var bPoint = new BPoint(i, j, Color.FromArgb(currentPixel.A, currentPixel.R, currentPixel.G, currentPixel.B));
                        _lastPreviewCirclePoints.Add(bPoint);

                        _bitmap.SetPixel(newPoint);
                    }
                }
            }
        }
        public override void PreviewDrawing(HashSet <Point> mousePositions)
        {
            if (mousePositions.Count == 1)
            {
                _lastPreviewPoints = new HashSet <IBPoint>();
            }

            var startPoint = mousePositions.ElementAt(0);
            var endPoint   = mousePositions.ElementAt(mousePositions.Count - 1);

            var linePoints = _bresenhamLine.GetPointsOnLine(startPoint.X, startPoint.Y, endPoint.X, endPoint.Y);

            if (mousePositions.Count == 1)
            {
                _lastPreviewPoints = new HashSet <IBPoint>();
            }

            foreach (var point in _lastPreviewPoints)
            {
                _bitmap.SetPixel(point.X, point.Y, point.Color);
            }

            _lastPreviewPoints = new HashSet <IBPoint>();

            var pixelSize  = Setting.SelectedPixelSize;
            var pixelColor = Setting.SelectedColor;

            foreach (var point in linePoints)
            {
                for (int i = point.X - pixelSize; i < point.X + pixelSize; i++)
                {
                    for (int j = point.Y - pixelSize; j < point.Y + pixelSize; j++)
                    {
                        if (CanvasValidator.IsCursorOutsideCanvas(new Point(i, j)))
                        {
                            continue;
                        }

                        var newPoint = new BPoint(i, j, pixelColor);

                        var currentPixel = _bitmap.GetPixel(i, j);

                        var bPoint = new BPoint(i, j, Color.FromArgb(currentPixel.A, currentPixel.R, currentPixel.G, currentPixel.B));
                        _lastPreviewPoints.Add(bPoint);

                        _bitmap.SetPixel(newPoint);
                    }
                }
            }
        }
        public override void PreviewDrawing(HashSet <Point> points)
        {
            if (points.Count < 0)
            {
                return;
            }

            if (points.Count == 1)
            {
                var point = points.ElementAt(0);

                _bitmap.SetPixel(new BPoint(point.X, point.Y));
            }
            else
            {
                var startPoint = points.ElementAt(points.Count - 2);
                var endPoint   = points.ElementAt(points.Count - 1);

                var linePoints = _bresenhamLine.GetPointsOnLine(startPoint.X, startPoint.Y, endPoint.X, endPoint.Y);

                _bitmap.SetPixel(BPoint.ConvertPointToIBPoint(startPoint));
                _bitmap.SetPixel(BPoint.ConvertPointToIBPoint(endPoint));

                foreach (var point in linePoints)
                {
                    var pixelSize = Setting.SelectedPixelSize;
                    var pointX    = point.X;
                    var pointY    = point.Y;

                    for (int i = pointX - pixelSize; i < pointX + pixelSize; i++)
                    {
                        for (int j = pointY - pixelSize; j < pointY + pixelSize; j++)
                        {
                            if (CanvasValidator.IsCursorOutsideCanvas(new Point(i, j)))
                            {
                                continue;
                            }

                            var newPoint = new BPoint(i, j, Setting.SelectedColor);

                            _bitmap.SetPixel(newPoint);
                        }
                    }
                }
            }
        }
        public override void SaveDrawing(HashSet <Point> mousePositions)
        {
            var startPoint = mousePositions.ElementAt(0);
            var endPoint   = mousePositions.ElementAt(mousePositions.Count - 1);

            var center = new Point((startPoint.X + endPoint.X) / 2, (startPoint.Y + endPoint.Y) / 2);
            var radius = (int)CustomPoint.GetDistance(startPoint.X, startPoint.Y, center.X, center.Y);

            var points = _circleAlgorithm.GetCirclePoints(BPoint.ConvertPointToIBPoint(center), radius);

            var finalPoints = new List <IBPoint>();

            foreach (var point in points)
            {
                finalPoints.Add(new BPoint(point.X, point.Y));
            }

            var circle = new CircleModel(finalPoints, BPoint.ConvertPointToIBPoint(center), radius);

            Add(circle);
        }
Exemple #13
0
        public override void SaveDrawing(HashSet <Point> mousePositions)
        {
            var startPoint = mousePositions.ElementAt(0);
            var endPoint   = mousePositions.ElementAt(mousePositions.Count - 1);
            var radius     = (int)BPoint.GetDistance(startPoint.X, startPoint.Y, endPoint.X, endPoint.Y);

            var leftPoint  = new BPoint(0, 0);
            var rightPoint = new BPoint(0, 0);

            //Check if mouse is under start point or above
            if (startPoint.Y > endPoint.Y)
            {
                leftPoint  = new BPoint(startPoint.X - radius, startPoint.Y - radius);
                rightPoint = new BPoint(startPoint.X + radius, startPoint.Y - radius);
            }
            else
            {
                leftPoint  = new BPoint(startPoint.X - radius, startPoint.Y + radius);
                rightPoint = new BPoint(startPoint.X + radius, startPoint.Y + radius);
            }

            var pointsFromStartToLeft  = _bresenhamLine.GetPointsOnLine(startPoint.X, startPoint.Y, leftPoint.X, leftPoint.Y);
            var pointsFromStartToRight = _bresenhamLine.GetPointsOnLine(startPoint.X, startPoint.Y, rightPoint.X, rightPoint.Y);
            var pointsFromLeftToRight  = _bresenhamLine.GetPointsOnLine(leftPoint.X, leftPoint.Y, rightPoint.X, rightPoint.Y);

            var megredPoints = pointsFromStartToLeft.Concat(pointsFromStartToRight);

            megredPoints = megredPoints.Concat(pointsFromLeftToRight);

            var finalPoints = new List <IBPoint>();

            foreach (var point in megredPoints)
            {
                finalPoints.Add(new BPoint(point.X, point.Y));
            }

            var triangle = new TriangleModel(finalPoints, BPoint.ConvertPointToIBPoint(startPoint), radius);

            Add(triangle);
        }
Exemple #14
0
        public override void PreviewDrawing(HashSet <Point> mousePositions)
        {
            if (mousePositions.Count == 1)
            {
                _lastPreviewPoints = new HashSet <IBPoint>();
            }

            foreach (var point in _lastPreviewPoints)
            {
                _bitmap.SetPixel(point.X, point.Y, point.Color);
            }

            var startPoint = mousePositions.ElementAt(0);
            var endPoint   = mousePositions.ElementAt(mousePositions.Count - 1);
            var radius     = (int)BPoint.GetDistance(startPoint.X, startPoint.Y, endPoint.X, endPoint.Y);

            var leftPoint  = new BPoint(0, 0);
            var rightPoint = new BPoint(0, 0);

            //Check if mouse is under start point or above
            if (startPoint.Y > endPoint.Y)
            {
                leftPoint  = new BPoint(startPoint.X - radius, startPoint.Y - radius);
                rightPoint = new BPoint(startPoint.X + radius, startPoint.Y - radius);
            }
            else
            {
                leftPoint  = new BPoint(startPoint.X - radius, startPoint.Y + radius);
                rightPoint = new BPoint(startPoint.X + radius, startPoint.Y + radius);
            }

            var pointsFromStartToLeft  = _bresenhamLine.GetPointsOnLine(startPoint.X, startPoint.Y, leftPoint.X, leftPoint.Y);
            var pointsFromStartToRight = _bresenhamLine.GetPointsOnLine(startPoint.X, startPoint.Y, rightPoint.X, rightPoint.Y);
            var pointsFromLeftToRight  = _bresenhamLine.GetPointsOnLine(leftPoint.X, leftPoint.Y, rightPoint.X, rightPoint.Y);

            var megredPoints = pointsFromStartToLeft.Concat(pointsFromStartToRight);

            megredPoints = megredPoints.Concat(pointsFromLeftToRight);

            foreach (var point in megredPoints)
            {
                var pixelSize = Setting.SelectedPixelSize;
                var pointX    = point.X;
                var pointY    = point.Y;

                for (int i = pointX - pixelSize; i < pointX + pixelSize; i++)
                {
                    for (int j = pointY - pixelSize; j < pointY + pixelSize; j++)
                    {
                        if (CanvasValidator.IsCursorOutsideCanvas(new Point(i, j)))
                        {
                            continue;
                        }

                        var newPoint = new BPoint(i, j, Setting.SelectedColor);

                        var currentPixel = _bitmap.GetPixel(i, j);

                        var bPoint = new BPoint(i, j, Color.FromArgb(currentPixel.A, currentPixel.R, currentPixel.G, currentPixel.B));
                        _lastPreviewPoints.Add(bPoint);

                        _bitmap.SetPixel(newPoint);
                    }
                }
            }
        }
Exemple #15
0
 //向量叉积,判断P2是否在P1-P3向量右侧true,左侧false
 static public double cross(BPoint <double> p1, BPoint <double> p2, BPoint <double> p3)
 {
     return((p2.X - p1.X) * (p3.Y - p1.Y) - (p3.X - p1.X) * (p2.Y - p1.Y));
 }
Exemple #16
0
        /// <summary>
        /// 开启搜索
        /// </summary>
        internal void StartSearch()
        {
            flpRoutes.Controls.Clear();
            if (BMapControl != null)
            {
                BMapControl.SetRoute(null); //
                BMapControl.SetRouteStartAndEnd(null, null);
            }
            if (BPlacesBoard != null) //位置列表初始化
            {
                BPlacesBoard.Clear();
            }
            _wait.Visible = true; //等待
            ((Action) delegate()
            {
                JObject routes;
                DirectionV1Service ds = new DirectionV1Service();
                if (_current_method == 0) //公交
                {
                    if (bPlaceBoxSource.City != "" && bPlaceBoxDestination.City != "" && bPlaceBoxSource.City != bPlaceBoxDestination.City)
                    {
                        MessageBox.Show("公交导航时,两地城市必须一致!");
                        return;
                    }
                    routes = ds.DirectionByTransit(bPlaceBoxSource.QueryText, bPlaceBoxDestination.QueryText, _currentCity);
                }
                else if (_current_method == 1) //驾车
                {
                    routes = ds.DirectionByDriving(bPlaceBoxSource.QueryText, bPlaceBoxDestination.QueryText, bPlaceBoxSource.City == "" ? bPlaceBoxSource.CurrentCity : bPlaceBoxSource.City
                                                   , bPlaceBoxDestination.City == "" ? bPlaceBoxDestination.CurrentCity : bPlaceBoxDestination.City);
                }
                else //步行
                {
                    if (bPlaceBoxSource.City != "" && bPlaceBoxDestination.City != "" && bPlaceBoxSource.City != bPlaceBoxDestination.City)
                    {
                        MessageBox.Show("步行导航时,两地城市必须一致!");
                        return;
                    }
                    routes = ds.DirectionByWalking(bPlaceBoxSource.QueryText, bPlaceBoxDestination.QueryText, _currentCity);
                }
                if (routes != null && (string)routes["status"] == "0") //搜索成功
                {
                    this.Invoke((Action) delegate()
                    {
                        _wait.Visible = false;
                        if ((string)routes["type"] == "2") //正常结果
                        {
                            //生成起点终点
                            BPoint start = new BPoint {
                                Type = PointType.RouteStart, Selected = false, Address = bPlaceBoxSource.QueryText, Location = new LatLngPoint(double.Parse((string)routes["result"]["origin"]["originPt"]["lng"]), double.Parse((string)routes["result"]["origin"]["originPt"]["lat"]))
                            };
                            BPoint end = new BPoint {
                                Type = PointType.RouteEnd, Selected = false, Address = bPlaceBoxDestination.QueryText, Location = new LatLngPoint(double.Parse((string)routes["result"]["destination"]["destinationPt"]["lng"]), double.Parse((string)routes["result"]["destination"]["destinationPt"]["lat"]))
                            };
                            if (BMapControl != null)
                            {
                                BMapControl.SetRouteStartAndEnd(start, end); //设置地图中对应的起点 终点
                            }
                            if (_current_method == 0)                        //公交
                            {
                                BTaxiTipControl taxi = new BTaxiTipControl();
                                taxi.DataSource = routes["result"]["taxi"]; //打车信息
                                taxi.Width = flpRoutes.Width - 25;
                                flpRoutes.Controls.Add(taxi);
                                foreach (JObject route in routes["result"]["routes"])
                                {
                                    BTransitRouteItem item = new BTransitRouteItem();

                                    BStepStartAndEndItem origin = new BStepStartAndEndItem();
                                    origin.EndPoint = start;
                                    item.Origin = origin; //起点

                                    BStepStartAndEndItem destination = new BStepStartAndEndItem();
                                    destination.EndPoint = end;
                                    item.Destination = destination; //终点

                                    item.DataSource = new BRoute {
                                        Type = RouteType.Transit, DataSource = route
                                    };
                                    flpRoutes.Controls.Add(item);
                                    item.Width = flpRoutes.Width - 25;

                                    item.StepEndPointSelected += new StepEndPointSelectedEventHandler(item_StepEndPointSelected);
                                    item.StepSelected += new StepSelectedEventHandler(item_StepSelected);
                                    item.RouteSelected += new RouteSelectedEventHandler(item_RouteSelected);
                                }
                            }
                            else if (_current_method == 1) //驾车
                            {
                                BTaxiTipControl taxi = new BTaxiTipControl();
                                taxi.DataSource = routes["result"]["taxi"]; //打车信息
                                taxi.Width = flpRoutes.Width - 25;
                                flpRoutes.Controls.Add(taxi);
                                foreach (JObject route in routes["result"]["routes"])
                                {
                                    BDrivingRouteItem item = new BDrivingRouteItem();

                                    BStepStartAndEndItem origin = new BStepStartAndEndItem();
                                    origin.EndPoint = start;
                                    item.Origin = origin; //起点

                                    BStepStartAndEndItem destination = new BStepStartAndEndItem();
                                    destination.EndPoint = end;
                                    item.Destination = destination; //终点

                                    item.DataSource = new BRoute {
                                        DataSource = route, Type = RouteType.Driving
                                    };
                                    flpRoutes.Controls.Add(item);
                                    item.Width = flpRoutes.Width - 25;

                                    item.StepEndPointSelected += new StepEndPointSelectedEventHandler(item_StepEndPointSelected);
                                    item.StepSelected += new StepSelectedEventHandler(item_StepSelected);
                                    item.RouteSelected += new RouteSelectedEventHandler(item_RouteSelected);
                                }
                            }
                            else  //步行
                            {
                                //步行没有打车信息
                                foreach (JObject route in routes["result"]["routes"])
                                {
                                    BWalkingRouteItem item = new BWalkingRouteItem();

                                    BStepStartAndEndItem origin = new BStepStartAndEndItem();
                                    origin.EndPoint = start;
                                    item.Origin = origin; //起点

                                    BStepStartAndEndItem destination = new BStepStartAndEndItem();
                                    destination.EndPoint = end;
                                    item.Destination = destination; //终点

                                    item.DataSource = new BRoute {
                                        DataSource = route, Type = RouteType.Walking
                                    };
                                    flpRoutes.Controls.Add(item);
                                    item.Width = flpRoutes.Width - 25;

                                    item.StepEndPointSelected += new StepEndPointSelectedEventHandler(item_StepEndPointSelected);
                                    item.StepSelected += new StepSelectedEventHandler(item_StepSelected);
                                    item.RouteSelected += new RouteSelectedEventHandler(item_RouteSelected);
                                }
                            }
                        }
                        else //地址模糊 需重新选择  具体json格式参见api文档
                        {
                            //
                            string start_keyword = (string)routes["result"]["originInfo"]["wd"];
                            string end_keyword = (string)routes["result"]["destinationInfo"]["wd"];
                            Label l = new Label();
                            l.AutoSize = false;
                            l.ForeColor = Color.Red;
                            l.Width = flpRoutes.Width - 25; l.Height = 20;
                            l.TextAlign = ContentAlignment.MiddleCenter;
                            l.Text = "请选择准确的位置";
                            flpRoutes.Controls.Add(l);
                            if (routes["result"]["origin"] != null)       //起点模糊
                            {
                                if (routes["result"]["origin"] is JArray) //公交
                                {
                                    BPlacesSuggestionControl sugg_start = new BPlacesSuggestionControl();
                                    sugg_start.Type = PointType.RouteStart;
                                    sugg_start.KeyWord = start_keyword;
                                    sugg_start.Content = routes["result"]["origin"];
                                    sugg_start.Width = flpRoutes.Width - 25;
                                    sugg_start.EndPointSelected += new EndPointSelectedEventHandler(sugg_start_EndPointSelected);
                                    flpRoutes.Controls.Add(sugg_start);
                                }
                                else //驾车 步行
                                {
                                    BPlacesSuggestionControl sugg_start = new BPlacesSuggestionControl();
                                    sugg_start.Type = PointType.RouteStart;
                                    sugg_start.KeyWord = start_keyword;
                                    sugg_start.Content = routes["result"]["origin"]["content"];
                                    sugg_start.Width = flpRoutes.Width - 25;
                                    sugg_start.EndPointSelected += new EndPointSelectedEventHandler(sugg_start_EndPointSelected);
                                    flpRoutes.Controls.Add(sugg_start);
                                }
                            }
                            if (routes["result"]["destination"] != null)       //终点模糊
                            {
                                if (routes["result"]["destination"] is JArray) //公交
                                {
                                    BPlacesSuggestionControl sugg_end = new BPlacesSuggestionControl();
                                    sugg_end.Type = PointType.RouteEnd;
                                    sugg_end.KeyWord = end_keyword;
                                    sugg_end.Content = routes["result"]["destination"];
                                    sugg_end.Width = flpRoutes.Width - 25;
                                    sugg_end.EndPointSelected += new EndPointSelectedEventHandler(sugg_end_EndPointSelected);
                                    flpRoutes.Controls.Add(sugg_end);
                                }
                                else
                                {
                                    BPlacesSuggestionControl sugg_end = new BPlacesSuggestionControl();
                                    sugg_end.Type = PointType.RouteEnd;
                                    sugg_end.KeyWord = end_keyword;
                                    sugg_end.Content = routes["result"]["destination"]["content"];
                                    sugg_end.Width = flpRoutes.Width - 25;
                                    sugg_end.EndPointSelected += new EndPointSelectedEventHandler(sugg_end_EndPointSelected);
                                    flpRoutes.Controls.Add(sugg_end);
                                }
                            }
                        }
                    });
                }
            }).BeginInvoke(null, null);
        }