public Vector3 GetClosestPoint(Vector3 p, ref int closestSeg, out float distance, int searchRange = 5, int subdivisions = 50)
    {
        distance = 3.40282347E+38f;
        Vector3 result = p;

        if (nodes.Length > 1)
        {
            int num  = Mathf.Max(closestSeg - searchRange, 1);
            int num2 = Mathf.Min(closestSeg + searchRange, nodes.Length - 1);
            for (int i = num; i <= num2; i++)
            {
                Transform transform  = nodes[i - 1].transform;
                Transform transform2 = nodes[i].transform;
                Vector3   position   = transform.position;
                Vector3   p2         = transform.position + transform.forward * nodes[i - 1].OutHandleLength;
                Vector3   p3         = transform2.position - transform2.forward * nodes[i].InHandleLength;
                Vector3   position2  = transform2.position;
                float     distance2;
                Vector3   vector = BezierMath.FindClosest(position, p2, p3, position2, p, out distance2, subdivisions);
                if (distance2 < distance)
                {
                    distance   = distance2;
                    result     = vector;
                    closestSeg = i;
                }
            }
        }
        return(result);
    }
Esempio n. 2
0
        public void Perfect_Hit_In_Newton_Approx_Should_Not_Return_NaN()
        {
            var bezier = new BezierCurve(new Vector2(0, 0), new Vector2(1, 0), new Vector2(0, 1), new Vector2(1, 1));
            var result = BezierMath.GetYAtX(bezier, 0.5f);

            Assert.IsFalse(float.IsNaN(result));
        }
    public float EstimateSegmentLength(int segment, int subdivisions = 50)
    {
        float num = 0f;

        Debug.Assert(nodes.Length > segment, "Invalid segment number.");
        SmoothBezierNode smoothBezierNode  = nodes[segment];
        SmoothBezierNode smoothBezierNode2 = nodes[segment + 1];
        Transform        transform         = smoothBezierNode.transform;
        Transform        transform2        = smoothBezierNode2.transform;
        Vector3          position          = transform.position;
        Vector3          p         = transform.position + transform.forward * smoothBezierNode.OutHandleLength;
        Vector3          p2        = transform2.position - transform2.forward * smoothBezierNode2.InHandleLength;
        Vector3          position2 = transform2.position;
        Vector3          zero      = Vector3.zero;
        Vector3          vector    = BezierMath.Interpolate(position, p, p2, position2, 0f);
        float            num2      = 1f / (float)subdivisions;

        for (int i = 0; i < subdivisions; i++)
        {
            zero   = vector;
            vector = BezierMath.Interpolate(position, p, p2, position2, num2 * (float)(i + 1));
            num   += Vector3.Distance(zero, vector);
        }
        return(num);
    }
Esempio n. 4
0
        private static void PrintBezierPoints(BezierCurve bezier)
        {
            var points = 20;

            for (var i = 0; i < points + 1; i++)
            {
                var x = i / (float)points;
                Console.WriteLine($"({x:0.00}, {BezierMath.GetYAtX(bezier, x)})");
            }
        }
Esempio n. 5
0
 protected bool CheckBezierCrossingSpawner(Vector3[] nodes)
 {
     for (int currIndex = 0; currIndex <= spawner.BezierLength; currIndex++)
     {
         Vector3 currentCurvePoint = BezierMath.BernsteinBezier(
             currIndex / (float)spawner.BezierLength, 2, nodes);
         if (Vector3.Distance(currentCurvePoint, spawner.transform.position)
             < spawner.DefenseBezierMinDistance)
         {
             return(true);
         }
     }
     return(false);
 }
    public Vector3 InterpolateSegment(int segment, float u)
    {
        Debug.Assert(nodes.Length > segment, "Invalid segment number.");
        SmoothBezierNode smoothBezierNode  = nodes[segment];
        SmoothBezierNode smoothBezierNode2 = nodes[segment + 1];
        Transform        transform         = smoothBezierNode.transform;
        Transform        transform2        = smoothBezierNode2.transform;
        Vector3          position          = transform.position;
        Vector3          p         = transform.position + transform.forward * smoothBezierNode.OutHandleLength;
        Vector3          p2        = transform2.position - transform2.forward * smoothBezierNode2.InHandleLength;
        Vector3          position2 = transform2.position;

        return(BezierMath.Interpolate(position, p, p2, position2, u));
    }
Esempio n. 7
0
    private List <Vector2> TwoPointInterpolation(HermiteNodeComponent first, HermiteNodeComponent second)
    {
        Vector3 p0, p3;

        p0 = first.transform.position;
        p3 = second.transform.position;
        Vector3        m0           = first.GetTangent() * tangentSize;
        Vector3        m1           = second.GetTangent() * tangentSize;
        LineRenderer   lineRenderer = GetComponent <LineRenderer>();
        List <Vector2> linePoints   = new List <Vector2>();

        for (int currIndex = 0; currIndex <= bezierLength; currIndex++)
        {
            float   t        = currIndex / (float)bezierLength;
            var     h0_3     = BezierMath.BernsteinPolynomial(0, 3, t) + BezierMath.BernsteinPolynomial(1, 3, t);
            var     h1_3     = BezierMath.BernsteinPolynomial(1, 3, t) * 1 / 3;
            var     h2_3     = -BezierMath.BernsteinPolynomial(2, 3, t) * 1 / 3;
            var     h3_3     = BezierMath.BernsteinPolynomial(3, 3, t) + BezierMath.BernsteinPolynomial(2, 3, t);
            Vector3 newPoint = h0_3 * p0 + h3_3 * p3 + h1_3 * m0 + h2_3 * m1;
            linePoints.Add(newPoint);
        }
        return(linePoints);
    }
Esempio n. 8
0
    IEnumerator BuildBezier(Vector3[] nodes)
    {
        var            lineRenderer = GetComponent <LineRenderer>();
        var            collider     = GetComponent <EdgeCollider2D>();
        List <Vector2> linePoints   = new List <Vector2>();

        for (int currIndex = 0; currIndex <= bezierLength; currIndex++)
        {
            Vector3 currentCurvePoint = BezierMath.BernsteinBezier(
                currIndex / (float)bezierLength, 2,
                nodes
                );
            linePoints.Add(currentCurvePoint);
        }
        collider.points = linePoints.ToArray();
        //The second for loop will render the actual line. This is done to build
        //the collider before the actual rendering
        for (int i = 0; i <= bezierLength; i++)
        {
            lineRenderer.positionCount = i + 1;
            lineRenderer.SetPosition(i, linePoints[i]);
            yield return(null);
        }
    }
Esempio n. 9
0
        private Vector3 getTrajectoryPosition(float time)
        {
            float u = Mathf.Tan(time - 0.5f) / (Mathf.Tan(0.5f) * 2f) + 0.5f;

            return(BezierMath.Interpolate(startPosition, startTangent, endTangent, endPosition, u));
        }
Esempio n. 10
0
 void Update()
 {
     transform.position = BezierLerp.GetPoint(p0.position, p1.position, p2.position, p3.position, t);
     transform.rotation = Quaternion.LookRotation(BezierMath.GetFirstDerivative(p0.position, p1.position, p2.position, p3.position, t));
 }