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); } } } } }
/// <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); } }
//向量法判断点在凸多边形内 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); }
/// <summary> /// 路线起点终点选中 /// </summary> /// <param name="bPoint"></param> void item_StepEndPointSelected(BPoint bPoint) { // if (BMapControl != null) { BMapControl.SelectBPoint(bPoint); } }
/// <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); }
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); }
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); } } } }
//向量叉积,判断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)); }
/// <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); }