public static List <Vector2> RemoveShortEdge(List <Vector2> original, float distance = 0.1f) // 半径 { DoubleCircleLinkedList <Vector2> dcel = new DoubleCircleLinkedList <Vector2>(); foreach (Vector2 v in original) { dcel.AddLast(v); } LinkedListNode <Vector2> cur = dcel.First; List <Vector2> temp = new List <Vector2>(); do { Vector2 curPoint = cur.Value; temp.Add(curPoint); // float totalLen = 0.0f; do { cur = dcel.Next(cur); // totalLen += (cur.Value - curPoint).magnitude; float totalLen = (cur.Value - curPoint).magnitude; if (totalLen > distance) { break; } } while (cur != dcel.First); } while (cur != dcel.First); return(temp); }
public static List <Vector2> RemoveShortAngle(List <Vector2> original, float minAngle = 10.0f) { if (original.Count < 3) { return(original); } DoubleCircleLinkedList <Vector2> dcel = new DoubleCircleLinkedList <Vector2>(); foreach (Vector2 v in original) { dcel.AddLast(v); } LinkedListNode <Vector2> cur = dcel.First; while (true) { int count = dcel.Count; do { Vector2 curPoint = cur.Value; Vector2 pre = dcel.Previous(cur).Value; Vector2 next = dcel.Next(cur).Value; pre = curPoint - pre; next = curPoint - next; float angle = Vector2.Angle(pre, next); cur = dcel.Next(cur); if (angle < minAngle) { dcel.Remove(dcel.Previous(cur)); } } while (cur != dcel.First); if (dcel.Count == count) { break; } } List <Vector2> tempOrigin = new List <Vector2>(); do { tempOrigin.Add(cur.Value); cur = dcel.Next(cur); } while (cur != dcel.First); return(tempOrigin); }