// void SplitBigTriangle(ref List<Triangle> triangles) // { // // 将面积过大的三角形拆分成三个小三角形 // for (int i = 0; i < triangles.Count; i++) // { // if (triangles[i].Area() > NeedSplitSize) // { // } // } // } /// <summary> /// 判断点是否是线段的可见点,组成的三角形没有和其他边相交 /// </summary> /// <param name="line"></param> /// <param name="point"></param> /// <returns></returns> private bool IsPointVisibleOfLine(Line2D line, Vector2 point) { if (line == null) { return(false); } Vector2 sPnt = line.GetStartPoint(); Vector2 ePnt = line.GetEndPoint(); // 是否是线段端点 if (point == sPnt || point == ePnt) { return(false); } //点不在线段的右侧(多边形顶点顺序为顺时针) if (line.ClassifyPoint(point) != PointSide.RIGHT_SIDE) { return(false); } if (!IsVisibleIn2Point(sPnt, point)) { return(false); } if (!IsVisibleIn2Point(ePnt, point)) { return(false); } return(true); }
/// <summary> /// 根据拐点计算法获得导航网格的下一个拐点 /// </summary> /// <param name="way"></param> /// <param name="triPathList"></param> /// <param name="endPos"></param> /// <param name="offSet"></param> /// <returns></returns> private WayPoint GetFurthestWayPoint(WayPoint way, List <NavTriangle> triPathList, Vector2 endPos, int offSet) { WayPoint nextWay = null; Vector2 currPnt = way.GetPoint(); NavTriangle currTri = way.GetTriangle(); NavTriangle lastTriA = currTri; NavTriangle lastTriB = currTri; int startIndex = triPathList.IndexOf(currTri); //开始路点所在的网格索引 Line2D outSide = currTri.GetSide(currTri.GetOutWallIndex()); //路径线在网格中的穿出边? Vector2 lastPntA = outSide.GetStartPoint(); Vector2 lastPntB = outSide.GetEndPoint(); Line2D lastLineA = new Line2D(currPnt, lastPntA); Line2D lastLineB = new Line2D(currPnt, lastPntB); Vector2 testPntA, testPntB; for (int i = startIndex + 1; i < triPathList.Count; i++) { currTri = triPathList[i]; outSide = currTri.GetSide(currTri.GetOutWallIndex()); if (i == triPathList.Count - 1) { testPntA = endPos; testPntB = endPos; } else { testPntA = outSide.GetStartPoint(); testPntB = outSide.GetEndPoint(); } if (lastPntA != testPntA) { if (lastLineB.ClassifyPoint(testPntA) == PointSide.RIGHT_SIDE) { nextWay = new WayPoint(lastPntB, lastTriB); return(nextWay); } else if (lastLineA.ClassifyPoint(testPntA) != PointSide.LEFT_SIDE) { lastPntA = testPntA; lastTriA = currTri; //重设直线 lastLineA = new Line2D(lastLineA.GetStartPoint(), lastPntA); } } if (lastPntB != testPntB) { if (lastLineA.ClassifyPoint(testPntB) == PointSide.LEFT_SIDE) { nextWay = new WayPoint(lastPntA, lastTriA); return(nextWay); } else if (lastLineB.ClassifyPoint(testPntB) != PointSide.RIGHT_SIDE) { lastPntB = testPntB; lastTriB = currTri; //重设直线 lastLineB = new Line2D(lastLineB.GetStartPoint(), lastPntB); } } } //到达终点 nextWay = new WayPoint(endPos, triPathList[triPathList.Count - 1]); return(nextWay); }
/// <summary> /// 根据拐点计算法获得导航网格的下一个拐点 /// </summary> /// <param name="way"></param> /// <param name="triPathList"></param> /// <param name="endPos"></param> /// <param name="offSet"></param> /// <returns></returns> private WayPoint GetFurthestWayPoint(WayPoint way, List<NavTriangle> triPathList, Vector2 endPos, int offSet) { WayPoint nextWay = null; Vector2 currPnt = way.GetPoint(); NavTriangle currTri = way.GetTriangle(); NavTriangle lastTriA = currTri; NavTriangle lastTriB = currTri; int startIndex = triPathList.IndexOf(currTri);//开始路点所在的网格索引 Line2D outSide = currTri.GetSide(currTri.GetOutWallIndex());//路径线在网格中的穿出边? Vector2 lastPntA = outSide.GetStartPoint(); Vector2 lastPntB = outSide.GetEndPoint(); Line2D lastLineA = new Line2D(currPnt, lastPntA); Line2D lastLineB = new Line2D(currPnt, lastPntB); Vector2 testPntA, testPntB; for (int i = startIndex + 1; i < triPathList.Count; i++) { currTri = triPathList[i]; outSide = currTri.GetSide(currTri.GetOutWallIndex()); if (i == triPathList.Count - 1) { testPntA = endPos; testPntB = endPos; } else { testPntA = outSide.GetStartPoint(); testPntB = outSide.GetEndPoint(); } if (lastPntA != testPntA) { if (lastLineB.ClassifyPoint(testPntA) == PointSide.RIGHT_SIDE) { nextWay = new WayPoint(lastPntB, lastTriB); return nextWay; } else if (lastLineA.ClassifyPoint(testPntA) != PointSide.LEFT_SIDE) { lastPntA = testPntA; lastTriA = currTri; //重设直线 lastLineA = new Line2D(lastLineA.GetStartPoint(), lastPntA); } } if (lastPntB != testPntB) { if (lastLineA.ClassifyPoint(testPntB) == PointSide.LEFT_SIDE) { nextWay = new WayPoint(lastPntA, lastTriA); return nextWay; } else if (lastLineB.ClassifyPoint(testPntB) != PointSide.RIGHT_SIDE) { lastPntB = testPntB; lastTriB = currTri; //重设直线 lastLineB = new Line2D(lastLineB.GetStartPoint(), lastPntB); } } } //到达终点 nextWay = new WayPoint(endPos, triPathList[triPathList.Count - 1]); return nextWay; }
// void SplitBigTriangle(ref List<Triangle> triangles) // { // // 将面积过大的三角形拆分成三个小三角形 // for (int i = 0; i < triangles.Count; i++) // { // if (triangles[i].Area() > NeedSplitSize) // { // } // } // } /// <summary> /// 判断点是否是线段的可见点,组成的三角形没有和其他边相交 /// </summary> /// <param name="line"></param> /// <param name="point"></param> /// <returns></returns> private bool IsPointVisibleOfLine(Line2D line, Vector2 point) { if (line == null) return false; Vector2 sPnt = line.GetStartPoint(); Vector2 ePnt = line.GetEndPoint(); // 是否是线段端点 if (point == sPnt || point == ePnt) return false; //点不在线段的右侧(多边形顶点顺序为顺时针) if (line.ClassifyPoint(point) != PointSide.RIGHT_SIDE) return false; if (!IsVisibleIn2Point(sPnt, point)) return false; if (!IsVisibleIn2Point(ePnt, point)) return false; return true; }