示例#1
0
    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);
    }
示例#2
0
    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);
    }
示例#3
0
    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);
    }
示例#4
0
    private bool IsPointInsideByEdge(Vector2 pt, IEdge edge, EdgeCP cp)
    {
        EvalRes eval = edge.Eval(cp.normalized_t);

        return(Utils.TestLeftHemiplane(pt - cp.pt, eval.dir));
    }