/// <summary> /// 获取最边缘一圈的顶点。 /// </summary> /// <param name="dir"></param> /// <param name="s"></param> /// <param name="e"></param> /// <param name="listOutEdgePoint"></param> /// <returns></returns> private static List <Double2> SearchOutPoint(int edgeIndex, Double2 s, Double2 e, List <Double2> listOutEdgePoint) { if (listOutEdgePoint == null || listOutEdgePoint.Count == 0) { return(null); } Double2 outdir; Double2 indir; if (edgeIndex == 0) { if (s.y == e.y) { return(null); } outdir = Double2.right; indir = (e - s).normalized; } else if (edgeIndex == 1) { if (s.x == e.x) { return(null); } outdir = Double2.up; indir = (e - s).normalized; } else if (edgeIndex == 2) { if (s.y == e.y) { return(null); } outdir = Double2.left; indir = (e - s).normalized; } else if (edgeIndex == 3) { if (s.x == e.x) { return(null); } outdir = Double2.down; indir = (e - s).normalized; } else { return(null); } // 开始搜寻了。 List <Double2> lResult = new List <Double2>(); Double2 startPoint = s; Double2 bestPoint = Double2.zero; bool isHaveBestPoint = false; List <Double2> listinPoints = new List <Double2>(); List <Double2> lHave = listOutEdgePoint; while (lHave != null && lHave.Count > 0) { // 先过滤了。 foreach (Double2 pos in lHave) { if (Double2.CheckPointInCorns(pos, startPoint, indir, outdir) == true) { listinPoints.Add(pos); if (isHaveBestPoint == false) { bestPoint = pos; isHaveBestPoint = true; } } } // 再则优。 if (isHaveBestPoint == true) { for (int i = 1; i < listinPoints.Count; i++) { // 比较更好的点。 if (Double2.CheckPointInCorns(listinPoints[i], startPoint, (bestPoint - startPoint).normalized, outdir) == true) { bestPoint = listinPoints[i]; } } // 进行交换,执行下一轮迭代。 lResult.Add(bestPoint); startPoint = bestPoint; indir = (e - startPoint).normalized; listinPoints.Remove(bestPoint); lHave = listinPoints; listinPoints = new List <Double2>(); isHaveBestPoint = false; } else { break; } } return(lResult); }
/// <summary> /// 获取最边缘一圈的顶点。 /// </summary> /// <param name="lineStart">起点</param> /// <param name="far">远处的交点</param> /// <param name="outdir">外包边</param> /// <param name="listOutEdgePoint"></param> /// <returns></returns> private static List <Double2> SearchOutPoint(Double2 lineStart, Double2 far, Double2 outdir, List <Double2> listOutEdgePoint) { if (listOutEdgePoint == null || listOutEdgePoint.Count == 0) { return(listOutEdgePoint); } // 开始搜寻了。 List <Double2> lResult = new List <Double2>(); Double2 startPoint = lineStart; Double2 bestPoint = Double2.zero; Double2 indir = far - lineStart; bool isHaveBestPoint = false; List <Double2> listinPoints = new List <Double2>(); List <Double2> lHave = listOutEdgePoint; while (lHave != null && lHave.Count > 0) { //SkillObb.instance.AdddirData(startPoint, outdir, indir); // 先过滤了。 for (int i = 0; i < lHave.Count; i++) { Double2 pos = lHave[i]; if (Double2.CheckPointInCorns(pos, startPoint, indir, outdir) == true) { bestPoint = pos; isHaveBestPoint = true; for (int k = i; k < lHave.Count; k++) { listinPoints.Add(lHave[k]); } break; } } // 再则优。 if (isHaveBestPoint == true) { for (int i = 1; i < listinPoints.Count; i++) { // 比较更好的点。 if (Double2.CheckPointInCorns(listinPoints[i], startPoint, bestPoint - startPoint, outdir) == true) { bestPoint = listinPoints[i]; } } // 进行交换,执行下一轮迭代。 lResult.Add(bestPoint); listinPoints.Remove(bestPoint); if (listinPoints.Count > 0) { outdir = (bestPoint - startPoint).normalized; startPoint = bestPoint; indir = far - startPoint; lHave = listinPoints; listinPoints = new List <Double2>(); isHaveBestPoint = false; } else { break; } } else { break; } } return(lResult); }