private CPRes GetClosestPointOnBorder_Core(Vector2 pt) { CPRes res = new CPRes(); float max_dist2 = Mathf.Infinity; foreach (var loop in m_loops) { for (int pos = 0; pos < loop.Count; ++pos) { EdgeCP cp = loop[pos].GetClosestPoint(pt); float distance2 = Vector2.SqrMagnitude(pt - cp.pt); if (distance2 < max_dist2) { max_dist2 = distance2; res.edge_cp = cp; res.loop = loop.ConvertAll(x => (IEdge)x); res.pos_in_loop = pos; } } } return(res); }
public bool IsPointInside(Vector2 pt) { CPRes cp = GetClosestPointOnBorder_Core(pt); if (cp.edge_cp.at_edge_end == null) { return(IsPointInsideByEdge(pt, cp.loop[cp.pos_in_loop], cp.edge_cp)); } // by vertex int first_pos = cp.edge_cp.at_edge_end.Value ? cp.pos_in_loop : cp.pos_in_loop - 1; int second_pos = (first_pos + 1) % cp.loop.Count; if (first_pos < 0) { first_pos = cp.loop.Count - 1; } return(IsPointInsideByVertex(pt - cp.edge_cp.pt, cp.loop[first_pos].Eval(1.0f).dir, cp.loop[second_pos].Eval(0.0f).dir)); }