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); }
public void test() { float startTime = Time.realtimeSinceStartup; float w = 100; float h = 100; Drawing.BezierPoint p1 = new Drawing.BezierPoint(new Vector2(10, 0), new Vector2(5, 20), new Vector2(20, 0)); Drawing.BezierPoint p2 = new Drawing.BezierPoint(new Vector2(50, 10), new Vector2(40, 20), new Vector2(60, -10)); Drawing.BezierCurve c = new Drawing.BezierCurve(p1.main, p1.control2, p2.control1, p2.main); p1.curve2 = c; p2.curve1 = c; Vector2 elapsedTime = new Vector2((Time.realtimeSinceStartup - startTime) * 10, 0); float startTime2 = Time.realtimeSinceStartup; for (int i = 0; i < w * h; i++) { Mathfx.IsNearBezier(new Vector2(Random.value * 80, Random.value * 30), p1, p2, 10); } Vector2 elapsedTime2 = new Vector2((Time.realtimeSinceStartup - startTime2) * 10, 0); Debug.Log("Drawing took " + elapsedTime.ToString() + " " + elapsedTime2.ToString()); }
void test() { float startTime = Time.realtimeSinceStartup; var w = 100; var h = 100; var p1 = new Drawing.BezierPoint(new Vector2(10, 0), new Vector2(5, 20), new Vector2(20, 0)); var p2 = new Drawing.BezierPoint(new Vector2(50, 10), new Vector2(40, 20), new Vector2(60, -10)); var c = new Drawing.BezierCurve(p1.main, p1.control2, p2.control1, p2.main); p1.curve2 = c; p2.curve1 = c; Vector2 elapsedTime = new Vector2((Time.realtimeSinceStartup - startTime) * 10, 0); float startTime2 = Time.realtimeSinceStartup; for (var i = 0; i < w * h; i++) { Mathfx.IsNearBezier(new Vector2(Random.value * 80, Random.value * 30), p1, p2, 10); } Vector2 elapsedTime2 = new Vector2((Time.realtimeSinceStartup - startTime2) * 10, 0); Debug.Log("Drawing took " + elapsedTime.ToString() + " " + elapsedTime2.ToString()); }