public EdgeCP GetClosestPoint(Vector2 pt) { EdgeCP res = new EdgeCP { normalized_t = m_data.ClosestPointParam(pt) }; if (res.normalized_t <= 0 || res.normalized_t >= 1) { res.at_edge_end = res.normalized_t > 0; } if (!m_sense) { res.normalized_t = 1 - res.normalized_t; if (res.at_edge_end.HasValue) { res.at_edge_end = !res.at_edge_end; } } if (res.at_edge_end.HasValue) { res.normalized_t = res.at_edge_end.Value ? 1 : 0; } res.pt = Eval(res.normalized_t).pt; return(res); }
public EdgeCP GetClosestPoint(Vector2 pt) { EdgeCP res = new EdgeCP { normalized_t = m_data.GetClosestPoint(pt) }; bool in_edge_found = false; bool edge_end = false; float min_dist = Mathf.PI * 4; res.normalized_t -= Mathf.PI * 2; while (res.normalized_t < Mathf.PI * 6) { if (res.normalized_t >= m_data.t_start && res.normalized_t <= m_data.t_end) { in_edge_found = true; break; } if (res.normalized_t < m_data.t_start && (m_data.t_start - res.normalized_t) < min_dist) { min_dist = (m_data.t_start - res.normalized_t); } if (res.normalized_t > m_data.t_end && (res.normalized_t - m_data.t_end) < min_dist) { edge_end = true; break; } res.normalized_t += Mathf.PI * 2; } if (!in_edge_found) { res.at_edge_end = m_sense == edge_end; res.normalized_t = res.at_edge_end.Value ? 1 : 0; } else { res.normalized_t = Mathf.InverseLerp(m_data.t_start, m_data.t_end, res.normalized_t); if (!m_sense) { res.normalized_t = 1 - res.normalized_t; } } res.pt = Eval(res.normalized_t).pt; return(res); }
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); }
private bool IsPointInsideByEdge(Vector2 pt, IEdge edge, EdgeCP cp) { EvalRes eval = edge.Eval(cp.normalized_t); return(Utils.TestLeftHemiplane(pt - cp.pt, eval.dir)); }