/// <summary>
 /// Remove edge and set true to dirty_tris .
 /// </summary>
 /// <param name="e"></param>
 public void RemoveEdge(Edge e)
 {
     _edges.Remove(e);
     dirty_tris = true;
     dirty_offset = true;
 }
 /// <summary>
 /// Create new edge and add it to list of edges.
 /// </summary>
 /// <param name="p1"></param>
 /// <param name="p2"></param>
 /// <returns>Created edge</returns>
 public Edge CreateEdge(SpritePoint p1, SpritePoint p2)
 {
     Edge newEdge = new Edge(p1, p2);
     _edges.Add(newEdge);
     dirty_tris = true;
     return newEdge;
 }
 /// <summary>
 ///  Get all edges what be connected this edge.
 /// </summary>
 /// <param name="edge"></param>
 /// <returns></returns>
 public List<Edge> GetEdgesWithEdge(Edge edge)
 {
     List<Edge> res = new List<Edge>();
     foreach (var item in edges)
     {
         if (item.ContainsPoint(edge.point1) || item.ContainsPoint(edge.point2))
         {
             res.Add(item);
         }
     }
     return res;
 }
 /// <summary>
 /// Get closet edge and get the point for splitting in "EdgeDivider".
 /// </summary>
 /// <param name="spritePos">sprite position</param>
 /// <param name="without">Edges wll not be used</param>
 /// <returns></returns>
 public EdgeDivider GetClosestEdge(Vector2 spritePos, Edge[] without = null)
 {
     EdgeDivider ed = new EdgeDivider();
     float minDis = float.MaxValue;
     List<Edge> wo = null;
     if (without != null)
     {
         wo = new List<Edge>(without);
     }
     foreach (Edge edge in edges)
     {
         if (without != null && wo.Contains(edge))
         {
             continue;
         }
         Vector2 v = edge.GetClosest(spritePos);
         float d = Vector2.Distance(spritePos, v);
         if (d < minDis)
         {
             minDis = d;
             ed.edge = edge;
             ed.position = v;
         }
     }
     return ed;
 }
 /// <summary>
 /// Add edge to the topology and set true to dirty_tris.
 /// </summary>
 /// <param name="e"></param>
 public void AddEdge(Edge e)
 {
     _edges.Add(e);
     dirty_tris = true;
 }
 /// <summary>
 /// Divide the edge.
 /// </summary>
 /// <param name="ed"></param>
 /// <param name="autoOffset"></param>
 /// <returns></returns>
 public SpritePoint DivedeEdge(EdgeDivider ed, bool autoOffset = false)
 {
     SpritePoint newPoint = new SpritePoint(ed.position);
     Edge e1 = new Edge(ed.edge.point1, newPoint);
     Edge e2 = new Edge(newPoint, ed.edge.point2);
     AddPoint(newPoint);
     AddEdge(e1);
     AddEdge(e2);
     if (autoOffset)
     {
         float d1 = Vector2.Distance(ed.edge.point1.spritePosition, ed.position);
         float d2 = Vector2.Distance(ed.edge.point2.spritePosition, ed.position);
         float ds = d1 + d2;
         float w1 = d1 / ds;
         Vector2 np = Vector2.Lerp(ed.edge.point1.spritePosition + ed.edge.point1.offset2d,
             ed.edge.point2.spritePosition + ed.edge.point2.offset2d, w1);
         newPoint.offset2d = np - newPoint.spritePosition;
     }
     RemoveEdge(ed.edge);
     return newPoint;
 }
 void drawDeleteEdge(Edge edge)
 {
     Handles.color = Color.red;
     if (inversGizmos)
     {
         inversHandlesColor();
     }
     Handles.DrawLine(getImagePos(edge.point1.spritePosition), getImagePos(edge.point2.spritePosition));
 }