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); }
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); }