예제 #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);
        }
예제 #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);
        }