Beispiel #1
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);
    }
Beispiel #2
0
    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));
    }