private List <Node> FloydSmooth(List <Node> srcPath) { //直线处理 int len = srcPath.Count; if (len > 2) { FloydVector vector = new FloydVector(0, 0); FloydVector tmpVct = new FloydVector(0, 0); CalFloydVector(vector, srcPath[len - 1], srcPath[len - 2]); for (int i = len - 3; i >= 0; i--) { CalFloydVector(tmpVct, srcPath[i + 1], srcPath[i]); if (vector.x == tmpVct.x && vector.y == tmpVct.y) { srcPath.RemoveAt(i + 1); } else { vector.x = tmpVct.x; vector.y = tmpVct.y; } } } //消除拐点 len = srcPath.Count; for (int i = len - 1; i >= 0; i--) { for (int j = 0; j < i - 1; j++) { if (!SceneDataMgr.Instance.SceneGrid.HasBarrier(srcPath[i], srcPath[j])) { for (int k = i - 1; k > j; k--) { srcPath.RemoveAt(k); } i = j; len = srcPath.Count; break; } } } return(srcPath); }
private void CalFloydVector(FloydVector vector, Node node1, Node node2) { vector.x = node1.x - node2.x; vector.y = node1.y - node2.y; }