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