Exemplo n.º 1
0
    public static bool IsNearBezierTest(Vector2 p, Drawing.BezierCurve c, float accuracy, float maxDist)
    {
        Vector2 prepoint = c.Get(0);
        for (float i = accuracy; i < 1; i += accuracy)
        {
            var point = c.Get(i);
            float d = (p - point).sqrMagnitude;
            float d2 = (prepoint - point + new Vector2(maxDist, maxDist)).sqrMagnitude;
            if (d <= d2 * 2)
                return true;
        }

        return false;
    }
Exemplo n.º 2
0
    public static Vector2 NearestPointOnBezier(Vector2 p, Drawing.BezierCurve c, float accuracy, bool doubleAc)
    {
        float minDist = Mathf.Infinity;
        float minT = 0;
        Vector2 minP = Vector2.zero;
        for (float i = 0; i < 1; i += accuracy)
        {
            var point = c.Get(i);
            float d = (p - point).sqrMagnitude;
            if (d < minDist)
            {
                minDist = d;
                minT = i;
                minP = point;
            }
        }

        if (!doubleAc)
        {
            return minP;
        }

        float st = Mathf.Clamp01(minT - accuracy);
        float en = Mathf.Clamp01(minT + accuracy);


        for (var i = st; i < en; i += accuracy / 10)
        {
            var point = c.Get(i);
            float d = (p - point).sqrMagnitude;
            if (d < minDist)
            {
                minDist = d;
                minT = i;
                minP = point;
            }
        }

        return minP;
    }