Beispiel #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);
        }
Beispiel #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);
        }
Beispiel #3
0
        public static bool IsNearBezier(Vector2 p, Drawing.BezierPoint point1, Drawing.BezierPoint point2, float rad)
        {
            if (point1.curve2 != point2.curve1)
            {
                Debug.LogError("Curves Not The Same");
                return(false);
            }

            Drawing.BezierCurve curve = point1.curve2;

            var r = curve.rect;

            r.x      -= rad;
            r.y      -= rad;
            r.width  += rad * 2;
            r.height += rad * 2;

            if (!r.Contains(p))
            {
                return(false);
            }

            var nearest = NearestPointOnBezier(p, curve, 0.1f, false);

            var sec = point1.curve2.aproxLength / 10;

            if ((nearest - p).sqrMagnitude >= (sec * 3) * (sec * 3))
            {
                return(false);
            }

            nearest = NearestPointOnBezier(p, curve, 0.01f, true);

            if ((nearest - p).sqrMagnitude <= rad * rad)
            {
                return(true);
            }

            return(false);
        }