Point delta = new Point(); //鼠标手动偏移量 private void frmSec_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Middle) { from.X = e.X; from.Y = e.Y; } else { //完成屏幕坐标->DisplayTopology映射 PointF[] pos = { new PointF(e.X, e.Y) }; trans_C2D.TransformPoints(pos); if (e.Button == MouseButtons.Left) { d = new FPoint(pos[0].X, pos[0].Y); } else if (e.Button == MouseButtons.Right) { s = new FPoint(pos[0].X, pos[0].Y); } //高精度计时器测量寻径耗时 QueryPerformance.Start(); w = pf.PathFinding(s, d); QueryPerformance.End(); this.Text = QueryPerformance.GetMessage(); //选择多边形 selected = display.SelectPolygon(pos[0].X, pos[0].Y); Refresh(); } }
//======================================================================================================== public void LOS_Engine(FPoint from, FPoint to) { int srcp = topo.SelectPolygon(from.x, from.y); int dstp = topo.SelectPolygon(to.x, to.y); if (srcp == -1 || dstp == -1) { return; } if (!topo.polys[srcp].enterable || !topo.polys[dstp].enterable) { return; } lfp.Add(from); if (srcp == dstp) { lfp.Add(to); return; } Vector2 n0 = GetV2(from, to); n0.Normalize(); TestBorderCall(from, n0, topo.polys[srcp]); do { switch (ret.result) { case RESULT.TEST_BORDER: TestVertexPolygon(ret.p0, ret.n0, ret.poly); break; case RESULT.TEST_VERTEX: TestPureVertex(ret.p0, ret.n0); break; } //以下是检测LOS是否可终止 Polygon dst = topo.polys[dstp]; switch (ret.result) { case RESULT.TEST_BORDER: if (ret.poly == dst) { lfp.Add(to); return; } break; case RESULT.TEST_VERTEX: FPoint fp = lfp[lfp.Count - 1]; foreach (Border b in dst.borders) { if (fp.Equals(b.from)) { lfp.Add(to); return; } } break; } } while (ret.result != RESULT.TEST_END); }
int[] dst_fpidx; //目标多边形的顶点索引,用于判断VertexWaypoint是否与目标点直接相邻 public Waypoint PathFinding(FPoint srcfp, FPoint dstfp) { //起点、终点必须不为空 if (srcfp == null || dstfp == null) { return(null); } //验证起点、终点所在多边形的合法性 int srcp = topo.SelectPolygon(srcfp.x, srcfp.y); int dstp = topo.SelectPolygon(dstfp.x, dstfp.y); if (srcp == -1 || dstp == -1 || !polys[srcp].enterable || !polys[dstp].enterable) { return(null); } //设置路径规划终点 Waypoint.SetDest(dstfp); //设置目标多边形 dst_poly = polys[dstp]; //标记目标多边形的顶点 dst_fpidx = new int[dst_poly.num_borders]; for (int i = 0; i < dst_poly.num_borders; i++) { dst_fpidx[i] = dst_poly.borders[i].from_idx; } //---------------------------------------------------------------------------- open.Clear(); close.Clear(); Waypoint start = new Waypoint(srcfp, null, false); close.Add(start); //!!!保证open里面只有edgew和vertexw两类位点 if (srcp == dstp) { Waypoint end = new Waypoint(dstfp, start, true); return(end); } else { ExtendStartWaypoint(start, srcp); } //---------------------------------------------------------------------------- Waypoint w; while (!open.IsEmpty()) { w = open.GetLeastWaypoint(); if (w.done) //如果w与目标点直接相邻 { Waypoint end = new Waypoint(dstfp, w, true); return(end); } open.Delete(w); close.Add(w); ExtendAdjacentWaypoints(w); } return(null); }